弹性伸缩HPA

Pod水平自动伸缩(Horizontal Pod Autoscaler,HPA)
1
2
例如Deployment这种支持多副本的工作负载,可以通过调整spec.relicas来增加或减少副本数,从而改变整体的业务水位满足我们的需求。
HPA可以根据应用的CPU利用率等水位信息,自动扩展(scale)的动态调整Pod副本数量。
  • 部署
1
2
3
4
5
6
7
8
9
10
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

# 编辑deployment后apply
spec: # spec:spec
hostNetwork: true
restartPolicy: Always
...
args:
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname # 不使用主机名,使用 IP
- --kubelet-insecure-tls # 不验证客户端证书

  • 创建测试dp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-test
namespace: demo
spec:
replicas: 1
selector:
matchLabels:
app: myapp
env: test
template:
metadata:
labels:
app: myapp
env: test
spec:
containers:
- name: myapp
image: nginx:1.15-alpine
ports:
- name: httpd
containerPort: 80
resources:
requests: # 设置小点方便压测
cpu: "50m"
memory: "64Mi"
limits:
cpu: "50m"
memory: "128Mi"

# 集群中暴露pod
kubectl expose -n demo deployment/myapp-test
# 查看pod的ip,也就是endpoints
kubectl get endpoints -n demo
或者
kubectl get pod -n demo -owide
  • 创建HPA对象
1
2
3
4
5
6
[root@master hpa]# kubectl autoscale deploy myapp-test -n demo --cpu-percent=50 --min=1 --max=5
horizontalpodautoscaler.autoscaling/myapp-test autoscaled

[root@master hpa]# kubectl get hpa -n demo
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myapp-test Deployment/myapp-test 0%/50% 1 5 1 25s
  • 压测
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 本机测试,安装ab工具
yum install -y httpd-tools
ab -c 1000 -n 500000 -s 60 http://10.1.44.168/
# -c 并发请求;-n 要执行的请求数

[root@master ~]# kubectl get hpa -n demo -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myapp-test Deployment/myapp-test 0%/50% 1 5 1 6m33s
myapp-test Deployment/myapp-test 42%/50% 1 5 1 6m49s
myapp-test Deployment/myapp-test 100%/50% 1 5 1 7m51s
myapp-test Deployment/myapp-test 100%/50% 1 5 2 8m4s
myapp-test Deployment/myapp-test 100%/50% 1 5 4 9m7s
myapp-test Deployment/myapp-test 100%/50% 1 5 4 9m39s
myapp-test Deployment/myapp-test 0%/50% 1 5 1 15m
  • 结论
1
2
3
4
5
6
可以看到随着访问压力增加,pod的平均利用率也直线上升,超过阈值50%,这时deployment副本数就增加调整,直到CPU降低到50%。
随着压测结束,HPA又将dp调整到1。

HPAController 就是通过这些 PodMetrics 来计算平均的 CPU 使用率,从而确定 spec.replicas 的新数值。
kubectl -n demo get podmetrics
kubectl -n demo get podmetrics myapp-test-5644479d45-xj2sp -oyaml
CLuster Autoscaler
1
2
3
4
5
# 自动扩容集群节点资源
Cluster Autoscaler(下文统称 CA)目前对接了阿里云、AWS、Azure、百度云、华为云、Openstack等云厂商。
你可以参照各个厂商的部署要求,进行部署。在部署的时候,请注意 CA 和 Kubernetes 版本要对应,最好两者版本一样。

CA 主要用来监听(watch)集群中未被调度的 Pod (即 Pod 暂时由于某些调度策略、抑或资源不满足,导致无法被成功调度),然后确定是否可以通过增加节点资源来解决无法调度的问题。
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。