实现原理
针对Pod 自动扩缩容,主要根据检测 CPU 使用率或自定义指标(metrics) 是否达到预定义限制,从而自动对 Pod 进行扩/缩容。
通常对Deployment,StatefulSet进行扩缩容。不适用于无法扩/缩容的对象(如:DaemonSet)
检测方法
1,控制管理器每隔30s对metrics的资源使用情况进行查询。
(间隔时间30s,可以通过-horizontal-pod-autoscaler-sync-period修改)。
2,支持三种metrics类型:
- 预定义metrics(bPod的CPU)以利用率的方式计算
- 自定义的Pod metrics,以始值(raw value)的方式计算
- 自定义的object metrics
3,支持两种metrics查询方式:
- Heapster
- 自定义的REST API
4, 支持多metrics
具体步骤
第1步:定义deploy,指定副本数,设置资源限制
# cat hpa-nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hpa-nginx-deploy
spec:
replicas: 2 # 指定副本数
selector:
matchLabels:
app: nginx-hpa
template:
metadata:
labels:
app: nginx-hpa
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
requests: # 指定最小限制
cpu: "30m"
memory: "128Mi"
limits: # 指定最大限制
cpu: "50m"
memory: "128Mi"
第2步:创建一个 HPA
(主要步骤)
当cpu占用超过20%时,进行扩容,最多增加到5个pod;
当cpu占用低于20%时,进行缩容,最少减少到2个pod;
kubectl autoscale deploy <deploy名> --cpu-percent=20 --min=2 --max=5
第3步:安装测试metrics插件
通过kubectl top pod <pod名>
查看pod或node的cpu和内存占用情况。需要安装插件。
# 下载插件文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
# 替换镜像为阿里云
sed -i 's/registry.k8s.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
# 配置文件增加参数(见下图)
- --kubelet-insecure-tls
# 安装此文件
kubectl apply -f metrics-server-components.yaml
# 查看是否运行, running为正常
kubectl get pod --all-namespaces | grep metrics
# 查看cpu占用情况
kubectl top pods
第4步:验证测试
1,为deploy添加一个servce的四层代理,获取代理的ip和端口
# cat hpa-nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: hpa-nginx-service
namespace: default
spec:
selector:
app: nginx-hpa
ports:
- name: web-nginx
port: 80
targetPort: 80
type: NodePort
获取ip:10.110.106.116
获取端口:80:31601/TCP
2,在另外两台node集群添加压力测试命令(死循环程序)
# 编写循环测试脚本提升内存与cpu 负载
while true; do wget -q -o- http://<ip:port> > /dev/null ; done
while true; do wget -q -o- http://10.110.106.116 > /dev/null ; done
# 另开终端,动态获取 HPA 信息比例
kubectl get hpa
第5步:结果
开始:
自动扩容:
自动缩容:
【注意】:自动缩容时间比较长,大概5-6分钟左右!
结束!