背景
Vertical Pod Autoscaler(VPA)使用户无需设置 pod 最新的资源限制。 配置后它将根据资源实际使用情况自动设置 request ,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源使用量。 使用叫做 VerticalPodAutoscaler
的 CRD
资源对象配置自动伸缩,它允许指定哪些 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
|
等待 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
|
一分多钟后自动触发了更新机制
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 这样是不是更好呢?