Horizontal Pod Autoscaler
可以根据CPU利用率自动伸缩 replication controller
、deployment
和 replica set
中的Pod
数量(除了 CPU 利用率)也可以 基于其他应程序提供的度量指标custom metrics
。pod 自动缩放不适用于无法缩放的对象,比如 DaemonSets
Pod 水平自动伸缩特性由 Kubernetes API
资源和控制器实现。资源决定了控制器的行为。控制器会周期性的获取平均 CPU 利用率,并与目标值相比较后来调整 replication controller
或 deployment
中的副本数量。
通过实际的Demo来
体验一下HPA
基于资源实现的水平自动伸缩,为了演示 Horizontal Pod Autoscaler
,我们将使用tomcat
镜像作为测试对象,以下为配置tomcat的deployment
的配置清单:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dp-tomcat
namespace: learning
spec:
revisionHistoryLimit: 15
replicas: 1
selector:
matchLabels:
app: dp-tomcat
matchExpressions:
- key: app
operator: In
values: [dp-tomcat]
template:
metadata:
labels:
app: dp-tomcat
spec:
nodeSelector:
kubernetes.io/hostname: dev-k8s-05.xsl.link
containers:
- name: dp-tomcat
image: tomcat:9.0
resources:
limits:
memory: "1024Mi"
cpu: "500m"
ports:
- containerPort: 8080
name: web
上面的yaml说明一下:
- 运行了一个副本数为3的deployment
- 暴露出一个名为nginxsvc的service
- 指定了
revisionHistoryLimit
表示保留历史版本的个数 - 因为要通过资源负载模拟HPA功能的场景,必须依赖template中对pod做资源限制
- 集群环境需要安装metrics-server,方便观察集群资源负载
➜ 00-template.resources.yaml git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k get pods -n learning
NAME READY STATUS RESTARTS AGE
abcontainer-58c67cfb87-g4j8q 1/1 Running 0 25d
dp-tomcat-5b4465b6bf-82llc 1/1 Running 0 125m
dp-tomcat-5b4465b6bf-zsttg 1/1 Running 0 126m
nginx-deployment-8558b4659-6dkmr 1/1 Running 0 17s
nginx-deployment-8558b4659-v8fzf 1/1 Running 0 17s
nginx-deployment-8558b4659-w5tlq 1/1 Running 0 8m56s
现在,dp-tomcat
服务已经运行,我们将通过 定义一个HPA资源对象来创建 Horizontal Pod Autoscaler。以下配置清单将创建一个Horizontal Pod Autoscaler
用于控制我们上一步骤中创建的deployment,使 Pod 的副本数量在维持在1到10之间。大致来说,HPA 将通过增加或者减少 Pod 副本的数量(通过 Deployment )以保持所有 Pod 的平均CPU利用率在50%以内
定义一个HPA资源对象
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: dp-tomcat
namespace: learning
spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef:
kind: Deployment
name: dp-tomcat
apiVersion: apps/v1
targetCPUUtilizationPercentage: 10
接下来,我们通过部署一个含有ab
命令的httpd
镜像来模拟负载
apiVersion: apps/v1
kind: Deployment
metadata:
name: abcontainer
namespace: abcontainer
spec:
selector:
matchLabels:
app: abcontainer
template:
metadata:
labels:
app: abcontainer
spec:
containers:
- name: abcontainer
image: httpd
ports:
- containerPort: 80
在部署完成httpd之后,进入到abcontainer通过ab增加负载
k exec abcontainer-58c67cfb87-g4j8q -n learning -it -- bash
使用ab
命令进行压力测试
ab -c 5000 -n 2000000 http://tomcat-svc:8080/
查看HPA资源变化
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
dp-tomcat Deployment/dp-tomcat 0%/10% 1 10 1 16m
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
dp-tomcat Deployment/dp-tomcat 98%/10% 1 10 1 18m
# 中断ab测试
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
dp-tomcat Deployment/dp-tomcat 36%/10% 1 10 10 19m
# pods的变化
NAME READY STATUS RESTARTS AGE
abcontainer-58c67cfb87-g4j8q 1/1 Running 0 25d
dp-tomcat-96b7b9f6f-54v84 0/1 Pending 0 13s
dp-tomcat-96b7b9f6f-55hsf 0/1 ContainerCreating 0 13s
dp-tomcat-96b7b9f6f-btbzr 0/1 ContainerCreating 0 13s
dp-tomcat-96b7b9f6f-dpppj 0/1 ContainerCreating 0 13s
dp-tomcat-96b7b9f6f-k4jqq 1/1 Running 0 12m
dp-tomcat-96b7b9f6f-mxd4f 1/1 Running 0 28s
dp-tomcat-96b7b9f6f-tjpj6 1/1 Running 0 28s
dp-tomcat-96b7b9f6f-zztqm 1/1 Running 0 28s
默认情况下,当ab模拟完成之后
,当流量开始下降,5分钟后pod的数量会慢慢恢复到replicas的值。
https://mp.weixin.qq.com/s/ykyVZU7Bw1Qg3xfLFaTr5Q