背景

Vertical Pod Autoscaler(VPA)使用户无需设置 pod 最新的资源限制。 配置后它将根据资源实际使用情况自动设置 request ,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源使用量。 使用叫做 VerticalPodAutoscalerCRD 资源对象配置自动伸缩,它允许指定哪些 pod 应用可以进行垂直自动伸缩,以及如何进行伸缩资源的设置。

项目详情

环境说明

  • kubernetes version: v1.20.4
  • 操作系统: centos7

安装

编写更新 openssl

在 Centos7 中使用默认的 openssl 进行安装时会提示安装异常,这里我们需要使用编译方式进行更新一下 openssl 的版本,更新1版本为: l-1.1.1k

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
wget http://mirrors.ibiblio.org/openssl/source/openssl-1.1.1k.tar.gz

tar xf openssl-1.1.1k.tar.gz \
&& cd  openssl-1.1.1k/

./config \
&& make -j$(nproc) \
&& make install

\mv /usr/bin/openssl{,.bak}

ln -s /usr/local/bin/openssl /usr/bin/openssl
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

openssl version
OpenSSL 1.1.1k  25 Mar 2021

安装 metric-server

Github 地址,选择和自己 k8s 集群匹配的版本进行安装即可,这里选择安装的是 v0.5.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.0/components.yaml

kubectl edit deployment metrics-server -n kube-system  # 编辑资源对象,添加跳过证书验证,修复导致 pod 无法正常启动
...
        - --cert-dir=/tmp
        - --secure-port=443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls
...     

watch kubectl get po -l k8s-app=metrics-server -n kube-system  # 等待 pod 启动完成

kubectl top node  # 执行如下命令有输出及完成
NAME    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
node1   567m         7%     4009Mi          27%       
node2   613m         8%     5181Mi          35%       
node3   1446m        19%    1683Mi          11%       
node4   278m         3%     1380Mi          9%

安装 vpa

默认安装版本 0.9.2

1
2
3
4
5
git clone https://github.com/kubernetes/autoscaler.git

cd autoscaler/vertical-pod-autoscaler/ # 进入目录

./hack/vpa-up.sh

image-20210708153529190

等待 pod 启动完成

1
2
3
4
kubectl get po -n kube-system |grep vpa
vpa-admission-controller-6cd546c4f-dvcf9                   1/1     Running   0          72s
vpa-recommender-6855ff754-9q2dw                            1/1     Running   0          72s
vpa-updater-9fd7bfbd5-h7l7n                                1/1     Running   0          72s

测试 vpa 的使用

1
2
3
4
5
6
7
8
9
kubectl create ns vpa

kubectl apply -f examples/hamster.yaml -n vpa

kubectl get po hamster-96d4585b7-2pl4v  -n vpa -o yaml|grep -A 3 '    resources:'
    resources:
      requests:
        cpu: 100m
        memory: 50Mi

一分多钟后自动触发了更新机制

image-20210708154012735

1
2
3
4
5
 kubectl get po hamster-96d4585b7-l8xw6   -n vpa -o yaml|grep -A 3 '    resources:'
    resources:
      requests:
        cpu: 548m 
        memory: 262144k 

总结

vpa 可以设置 pod 请求的资源被动态的更改,目前是属于一个实验性的一个功能,如 vpa 触发更新时,会触发 pod 重建,新 pod 可能会被重新调度到新的节点。依旧是不适合有状态的应用进行使用,如果动态的更改 底层的 cgroup 资源限制,而不需要重启 pod 这样是不是更好呢?