kubernetes HPA

Horizontal Pod Autoscaling可以根据CPU利用率(内存为不可压缩资源)自动伸缩一个Replication Controller、Deployment 或者Replica Set中的Pod数量;

目前HPA只支持两个版本,其中v1版本只支持核心指标的定义;

[root@node1 k8s-prom]# kubectl api-versions |grep autoscaling
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2

创建一个pod

[root@node1 ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=1 --requests='cpu=50m,memory=256Mi' --limits='cpu=50m,memory=256Mi' --labels='app=myapp' --expose --port=80
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
service/myapp created
deployment.apps/myapp created

下面我们让myapp 这个pod能自动水平扩展,用kubectl autoscale,其实就是创建HPA控制器的;

[root@node1 ~]# kubectl autoscale deployment myapp --min=1 --max=8 --cpu-percent=60
horizontalpodautoscaler.autoscaling/myapp autoscaled
[root@node1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myapp Deployment/myapp <unknown>/60% 1 8 0 12s

–min:表示最小扩展pod的个数 
–max:表示最多扩展pod的个数
–cpu-percent:cpu利用率

修改type为NodePort做压测

[root@node1 ~]# kubectl patch svc myapp -p '{"spec":{"type": "NodePort"}}'
service/myapp patched
[root@node1 ~]# kubectl get svc |grep myapp
myapp NodePort 10.254.203.52 <none> 80:45764/TCP 61s
[root@node2 ~]# yum -y install httpd-tools
[root@node2 ~]# ab -c 1000 -n 50000000 http://192.168.57.14:45764/index.html
[root@node1 ~]# kubectl describe hpa |grep -A 3 "resource cpu" 
 resource cpu on pods (as a percentage of request): 96% (48m) / 60%
Min replicas: 1
Max replicas: 8
Deployment pods: 2 current / 2 desired

[root@node1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-657fb86dd-2xbfq 1/1 Running 0 2m11s
myapp-657fb86dd-nmf28 1/1 Running 0 4m52s

等压测完,cpu使用率降下来,pod数量还会自动恢复为1个,如下

[root@node1 ~]# kubectl describe hpa |grep -A 3 "resource cpu" 
 resource cpu on pods (as a percentage of request): 0% (0) / 60%
Min replicas: 1
Max replicas: 8
Deployment pods: 1 current / 1 desired

hpa v2

上面用的是hpav1来做的水平pod自动扩展的功能,hpa v1版本只能根据cpu利用率括水平自动扩展pod。 
接下来我们看一下hpa v2的功能,它可以根据自定义指标利用率来水平扩展pod。

[root@node1 ~]# kubectl delete hpa myapp
horizontalpodautoscaler.autoscaling "myapp" deleted
[root@node1 ~]# vim hpa-v2-demo.yaml


apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa-v2
spec:
  scaleTargetRef: #根据什么指标来做评估压力
    apiVersion: apps/v1 #对谁来做自动扩展
    kind: Deployment
    name: myapp
  minReplicas: 1 #最少副本数量
  maxReplicas: 10 #最多副本数量
  metrics: #表示依据哪些指标来进行评估
  - type: Resource #表示基于资源进行评估
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50 #pod cpu使用率超过55%,就自动水平扩展pod个数
  - type: Resource
    resource:
      name: memory 
      targetAverageValue: 200Mi

[root@node1 ~]# kubectl apply -f hpa-v2-demo.yaml 
horizontalpodautoscaler.autoscaling/myapp-hpa-v2 created
[root@node1 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myapp-hpa-v2 Deployment/myapp <unknown>/50% 1 10 0 10s

再次启动压测查看结果 发现扩展到了3个

[root@node1 ~]# kubectl describe hpa |grep -A 3 "resource cpu" 
 resource cpu on pods (as a percentage of request): 102% (51m) / 50%
Min replicas: 1
Max replicas: 10
Deployment pods: 1 current / 3 desired
[root@node1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-657fb86dd-5jssn 1/1 Running 0 14s
myapp-657fb86dd-8876n 0/1 ContainerCreating 0 14s
myapp-657fb86dd-nmf28 1/1 Running 0 14m

hpa v2可以根据cpu和内存使用率进行伸缩Pod个数,还可以根据其他参数进行pod处理,如http并发量

这个需要依靠prometheus

[root@node1 ~]# cat hpa-v2-custom.yaml 
 apiVersion: autoscaling/v2beta2 #从这可以看出是hpa v2版本
 kind: HorizontalPodAutoscaler
 metadata:
   name: myapp-hpa-v2
 spec: 
   scaleTargetRef: #根据什么指标来做评估压力
     apiVersion: apps/v1 #对谁来做自动扩展 
     kind: Deployment 
     name: myapp 
   minReplicas: 1 #最少副本数量 
   maxReplicas: 10 
   metrics: #表示依据哪些指标来进行评估 
   - type: Pods #表示基于资源进行评估 
     pods: 
       metricName: http_requests #自定义的资源指标 
       targetAverageValue: 800m #m表示个数,表示并发数800

kubernetes HPA
http://www.jcwit.com/article/52/
作者
Carlos
发布于
2019年5月16日
许可协议