kubernetes服务自动伸缩-VPA
实验环境
安装好k8s集群
一、准备工作
1、部署Metrics Server
VPA 依赖 Metrics Server 来获取 Pod 的资源使用数据。首先需要部署 Metrics Server
下载地址(需要连接VPN):wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
(1)上传high-availability-1.21+.yaml文件到/root目录(master1)
(2)上传metrics-server.tar包到/root目录并导入(master1、worker1、worker2)
docker load -i metrics-server.tar
(3)禁用 Kubelet 的 TLS 证书验证
kubelet 证书需要由集群证书颁发机构签名,或者通过向 Metrics Server 传递参数 --kubelet-insecure-tls 来禁用证书验证
vim high-availability-1.21+.yaml
添加:
- --kubelet-insecure-tls
(4)创建资源
kubectl apply -f high-availability-1.21+.yaml
kubectl get pod -n kube-system
查看 Kubernetes 集群中节点资源使用情况(CPU 和内存)
kubectl top nodes
查看指定命名空间(kube-system)中所有 Pod 的资源使用情况(CPU 和内存)
kubectl top pod -n kube-system
2、升级openssl(master1、worker1、worker2)
yum -y install openssl-devel openssl11 openssl11-devel
openssl11 version
将系统中的默认 openssl 替换为 openssl11
which openssl
which openssl11
rm -rf $(which openssl)
ln -s /usr/bin/openssl11 /usr/bin/openssl
openssl version
3、安装git-2.23.0,系统默认安装的git版本太低(master1)
安装依赖
yum -y install gcc zlib-devel.x86_64
下载或上传git-2.23.0.tar.gz包到/root目录
下载地址:wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.23.0.tar.gz
tar -zxf git-2.23.0.tar.gz
cd git-2.23.0/
mkdir -p /usr/local/git
编译安装git
./configure --prefix=/usr/local/git --with-gitconfig=/etc/gitconfig && make && make install
rm -rf /usr/bin/git
ln -s /usr/local/git/bin/git /usr/bin/git
git --version
二、部署VPA
1、安装autoscaler软件
(1)上传vpa-autoscaler.tar包到/root目录并导入(master1、worker1、worker2)
docker load -i vpa-autoscaler.tar
(2)上传autoscaler.tar源码文件到/root目录并解包(master1)
tar xf autoscaler.tar
进入目录执行脚本
cd autoscaler/vertical-pod-autoscaler/
bash ./hack/vpa-up.sh
(3)查看在 kube-system 命名空间中运行的所有 Pod
kubectl get pod -n kube-system
等待VPA相关Pod运行正常
2、VPA 策略
Off:
仅提供资源建议,不实际修改 Pod 的资源请求和限制。
VPA不会应用任何资源推荐,只是收集和显示数据。
Initial:
仅在 Pod 创建时设置资源请求和限制,不自动更新。
VPA只会在Pod创建时应用资源推荐。一旦Pod启动,即使后续有新的资源推荐,也不会再进行调整。
Recreate:
当VPA生成新的资源推荐时,它会终止当前的Pod并重新创建一个新的Pod,新Pod将采用最新的资源推荐。这种方式会导致服务短暂中断,但能确保立即应用新的资源设置。
Auto:
自动调整资源并重启 Pod。
这是默认模式。在这种模式下,VPA会尝试在线调整运行中的Pod的资源请求和限制,而无需重启Pod。如果无法在线调整(例如,由于内核或Kubernetes版本的限制),则会选择重新创建Pod。
三、VPA应用案例 updateMode: "Off"
在VPA中,updateMode 是一个重要的配置选项,它决定了VPA如何应用其提供的资源建议。根据不同的设置,VPA可以采取不同的策略来更新Pod的资源配置。
(1)创建应用实例
VPA不会应用任何资源推荐,只是收集和显示数据。
vim 03-nginx.yaml
添加:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 50Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
kubectl apply -f 03-nginx.yaml
kubectl get pod
kubectl get svc
(2)创建VPA
使用updateMode: "Off"模式,这种模式仅获取资源推荐,不更新Pod
vim nginx-vpa.yaml
添加:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: nginx-vpa
namespace: default
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: nginx
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "nginx"
minAllowed:
cpu: "250m"
memory: "100Mi"
maxAllowed:
cpu: "2000m"
memory: "2048Mi"
kubectl apply -f nginx-vpa.yaml
列出当前命名空间(默认是 default)中的所有 Vertical Pod Autoscaler (VPA) 资源
kubectl get vpa
字段说明:
NAME: VPA 资源的名称。
MODE: VPA 的模式,可以是 Auto、Off 或 Initial。
Auto: 自动调整 Pod 的资源请求。
Off: 不调整 Pod 的资源请求。
Initial: 仅在 Pod 创建时调整资源请求。
CPU: VPA 推荐的 CPU 资源请求。
MEM: VPA 推荐的内存资源请求。
PROVIDED: 是否已经应用了 VPA 的推荐值(True 或 False)。
AGE: VPA 资源的创建时间。
查看名为 nginx-vpa 的 Vertical Pod Autoscaler (VPA) 的详细信息
kubectl describe vpa nginx-vpa
(3)执行压力测试
安装测试工具
yum -y install httpd-tools
kubectl get svc
ab -c 1000 -n 1000000 http://192.168.10.11:30267/
复制终端
查看名为 nginx-vpa 的 Vertical Pod Autoscaler (VPA) 的详细信息
kubectl describe vpa nginx-vpa
查看当前命名空间中的 Vertical Pod Autoscaler (VPA) 资源的简要信息
kubectl get vpa
返回字段解析:
NAME:VPA 的名称为 nginx-vpa。
MODE:VPA 的更新模式为 Off,表示仅提供资源建议,不会自动更新 Pod 的资源。
CPU:VPA 建议的 CPU 资源为 1101 毫核(约 1.1 个 CPU 核心)。
MEM:VPA 建议的内存资源为 262144 KiB(256 MiB)。
PROVIDED:表示 VPA 已成功提供资源建议。
这些值表明,VPA 建议将 nginx 容器的资源调整到 1101m CPU 和 256Mi 内存,这是在你设置的资源限制范围内(minAllowed 和 maxAllowed)的最优值。
Update Policy(更新策略):
当前的更新模式为 Off,这意味着 VPA 不会自动调整 Pod 的资源。你需要手动更新 Deployment 的资源配置,或者将更新模式改为 Auto 来让 VPA 自动调整。
Conditions(状态条件):
RecommendationProvided:表明 VPA 已经成功生成了资源调整的建议。
查看Pod中容器的详细信息
kubectl describe pod nginx-7bfbcf6b6c-c5hgp
容器的资源并没有改变
四、VPA应用案例 updateMode: "Auto"
此模式当目前运行的pod的资源达不到VPA的推荐值,就会执行pod驱逐,重新部署新的足够资源的服务。
删除上面的vpa策略
kubectl delete -f 03-nginx.yaml -f nginx-vpa.yaml
(1)创建应用
vim 05-nginx.yaml
添加:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx1
name: nginx1
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx1
image: nginx:1.20
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 50Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx1
namespace: default
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx1
kubectl apply -f 05-nginx.yaml
kubectl get pod
(2)创建VPA
vim nginx-vpa-auto.yaml
添加:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: nginx-vpa-auto
namespace: default
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: nginx1
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: "nginx1"
minAllowed:
cpu: "250m"
memory: "100Mi"
maxAllowed:
cpu: "2000m"
memory: "2048Mi"
kubectl apply -f nginx-vpa-auto.yaml
查看当前命名空间中的 Vertical Pod Autoscaler (VPA) 资源的简要信息
kubectl get vpa
(3)执行压力测试
kubectl get svc
ab -c 1000 -n 1000000 http://192.168.10.11:30722/
复制终端
查看名为 nginx-vpa-auto 的 Vertical Pod Autoscaler (VPA) 的详细信息
kubectl describe vpa nginx-vpa-auto
查看当前命名空间中的 Vertical Pod Autoscaler (VPA) 资源的简要信息
kubectl get vpa
返回字段解析:
NAME:VPA 的名称为 nginx-vpa。
MODE: VPA 的更新模式为 Auto,表示 VPA 会自动调整 Pod 的资源请求和限制。
CPU:VPA 建议的 CPU 资源为 1101 毫核(约 1.1 个 CPU 核心)。
MEM:VPA 建议的内存资源为 262144 KiB(256 MiB)。
PROVIDED:表示 VPA 已成功提供资源建议。
查看Pod中容器的详细信息
kubectl describe pod nginx1-69f5d5cdcf-dspnh
容器的资源根据VPA的推荐值,将前面的Pod驱逐,以应用新的资源推荐
随着服务的负载的变化,VPA的推荐值也会不断变化。当目前运行的pod的资源达不到VPA的推荐值,就会执行pod驱逐,重新部署新的足够资源的服务。