上章,讲述了在K8S中部署metrics server,为本章的HPA做了一定的铺垫。下面简单说说HPA
HPA全称是Horizontal Pod Autoscaler,翻译成中文是POD水平自动伸缩,以下都会用HPA代替Horizontal Pod Autoscaler,HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容(除了CPU利用率也可以基于其他应程序提供的度量指标custom metrics进行自动扩缩容)。pod自动缩放不适用于无法缩放的对象,比如DaemonSets。HPA由Kubernetes API资源和控制器实现。
一:HPA工作原理
HPA的实现是一个控制循环,由controller manager的–horizontal-pod-autoscaler-sync-period参数指定周期(默认值为15秒)。每个周期内,controller manager根据每个HorizontalPodAutoscaler定义中指定的指标查询资源利用率。controller manager可以从resource metrics API(pod 资源指标)和custom metrics API(自定义指标)获取指标。
官网参考文档:
https://v1-17.docs.kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
二:HPA API对象
HPA的API有三个版本,通过kubectl api-versions | grep autoscal可看到: autoscaling/v1 autoscaling/v2beta1 autoscaling/v2beta2 注释: autoscaling/v1只支持基于CPU指标的缩放; autoscaling/v2beta1支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)的缩放; autoscaling/v2beta2支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)和ExternalMetrics(额外指标)的缩放
三:基于CPU自动扩容,进行讲述:
1:以tomcat为例,创建资源配置清单
-6-96 tomcat-hpa]# vi dp.yaml kind: Deployment metadata: name: tomcat-hpa namespace: app spec: selector: matchLabels: app: tomcat-hpa template: metadata: labels: app: tomcat-hpa spec: containers: - name: tomcat-hpa image: harbor.auth.com/base/tomcat:v1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 resources: limits: cpu: 200m requests: cpu: 80m -6-96 tomcat-hpa]# cat svc.yaml apiVersion: v1 kind: Service metadata: name: tomcat-hpa-svc namespace: app spec: ports: - port: 8080 protocol: TCP selector: app: tomcat-hpa type: ClusterIP
2:应用资源配置清单
k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/dp.yaml k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/svc.yaml
3:创建HPA
tomcat-hpa服务正在运行,使用kubectl autoscale创建自动缩放器,实现对tomcat-hpa这个deployment创建的pod自动扩缩容,下面的命令将会创建一个HPA,HPA将会根据CPU,内存等资源指标增加或减少副本数,创建一个可以实现如下目的的hpa:
1)让副本数维持在1-10个之间(这里副本数指的是通过deployment部署的pod的副本数)
2)将所有Pod的平均CPU使用率维持在50%(通过kubectlrun运行的每个pod如果是80毫核,这意味着平均CPU利用率为40毫核
给上面tomcat-hpa这个deployment创建HPA
k8s-6-94 ~]# kubectl autoscale deployment tomcat-hpa -n app --cpu-percent=50 --min=1 --max=10
注释:
kubectl autoscale deployment tomcat-hpa (tomcat-hpa表示deployment的名字) --cpu-percent=50(表示cpu使用率不超过50%) --min=1(最少一个pod) --max=10(最多10个pod)
4:验证HPA
-6-95 ~]# kubectl get hpa -n app NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE tomcat-hpa Deployment/tomcat-hpa 2%/50% 1 10 1 4m3s
5:进行压测查看pod的数量变化
1:查看svc地址为:10.100.114.140 2:进行压力测试: while true; do wget -q -O- http://10.100.114.140:8080/test/index.html; done 3:查看hpa负载 -6-95 ~]# kubectl get hpa -n app NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE tomcat-hpa Deployment/tomcat-hpa 210%/50% 1 10 1 4m8s 4:查看pod数量变化 -6-95 ~]# kubectl get pods -n app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-hpa-664cc9d9f9-24r8s 1/1 Running 0 6s 172.6.95.8 k8s-6-95.host.com <none> <none> tomcat-hpa-664cc9d9f9-4xpsb 1/1 Running 0 6s 172.6.95.7 k8s-6-95.host.com <none> <none> tomcat-hpa-664cc9d9f9-8w7tk 1/1 Running 0 7m52s 172.6.94.5 k8s-6-94.host.com <none> <none> tomcat-hpa-664cc9d9f9-gk9k6 1/1 Running 0 6s 172.6.94.6 k8s-6-94.host.com <none> <none> 5:测试停止后,pod数量减少为1 -6-95 ~]# kubectl get pods -n app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-hpa-664cc9d9f9-4xpsb 1/1 Running 0 8m36s 172.6.95.7 k8s-6-95.host.com <none> <none>
注释:如果要删除存在的HPA:kubectl delete hpa tomcat-hpa -n app
四:基于内存自动扩容
1:修改资源配置清单
-6-96 tomcat-hpa]# cat dp.yaml apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-hpa namespace: app spec: selector: matchLabels: app: tomcat-hpa template: metadata: labels: app: tomcat-hpa spec: containers: - name: tomcat-hpa image: harbor.auth.com/base/tomcat:v1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 resources: limits: memory: 500Mi requests: memory: 300Mi -6-96 tomcat-hpa]# cat tomcat-memory-hpa.yaml apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: tomcat-hpa namespace: app spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: tomcat-hpa metrics: - type: Resource resource: name: memory targetAverageUtilization: 20
注释:添加hpa资源配置清单。targetAverageUtilization: 20 表示使用内存的20%(也就是300Mi的20%)
2:应用资源配置清单
-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/dp.yaml -6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/tomcat-memory-hpa.yaml
3:验证HPA,进行测试,观察pod数量变化
-6-94 ~]# kubectl get hpa -n app NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE tomcat-hpa Deployment/tomcat-hpa 27%/20% 1 10 1 18s -6-94 ~]# kubectl get pods -n app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-hpa-59764c648b-2mqq4 1/1 Running 0 17s 172.6.95.7 k8s-6-95.host.com <none> <none> tomcat-hpa-59764c648b-d4rxt 1/1 Running 0 17m 172.6.94.5 k8s-6-94.host.com <none> <none>