关于k8s Pod的自动水平伸缩(HPA)

世事洞明皆学问,人情练达即文章。这篇文章主要讲述关于k8s Pod的自动水平伸缩(HPA)相关的知识,希望能为你提供帮助。
背景:
当访问量或资源需求过高时,kubectl scale命令可以实现对pod的快速伸缩功能,但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少。这就很麻烦了,总不能为了需求总是把pod设置为最多状态,这样太浪费资源;也不能当请求量上来以后再去伸缩pod,这样会有好多请求不成功。

  • k8s既然是云原生时代的产品,当然得有智能,自动这些特性。
所以现在引入一个新的概念:
  • HPA(Horizontal Pod Autoscaler )
pod的自动水平伸缩
有了HPA,我们就不用为上面的问题而烦恼,HPA会帮我们自动完成pod的扩缩容。
当资源需求过高时,会自动创建出pod副本;当资源需求低时,会自动收缩pod副本数。
注意:首先必须确保集群中已经安装metrics-server的组件,否则无法获取集群内资源数据,无法进行以下操作。
【关于k8s Pod的自动水平伸缩(HPA)】原理:
通过集群内的资源监控系统(metrics-server),来获取集群中资源的使用状态。
根据CPU、内存、以及用户自定义的资源指标数据的使用量或连接数为参考依据,来制定一个临界点,一旦超出这个点,HPA就会自动创建出pod副本。
版本:
通过kubectl api-versions可以看到,目前有3个版本:
autoscaling/v1#只支持通过cpu为参考依据,来改变pod副本数
autoscaling/v2beta1#支持通过cpu、内存、连接数以及用户自定义的资源指标数据为参考依据。
autoscaling/v2beta2#同上,小的变动
查询:
1 kubectl explain hpa##默认查询到的是autoscaling/v1版本
2
3 kubectl explain hpa --api-version=autoscaling/v2beta1##如果使用其他版本,可以使用--api-version指明版本
部署HPA:
哪个资源最多几个最少几个通过什么判断伸缩
例如:我有个deployment叫myapp现在只有一个副本数,最多只能8个副本数,当pod的cpu平均利用率超过百分之50或内存平均值超过百分之50时,pod将自动增加副本数以提供服务。
  • SVC、Deployment资源清单:
    1 apiVersion: v1 2 kind: Service 3 metadata: 4name: svc-hpa 5namespace: default 6 spec: 7selector: 8app: myapp 9type: NodePort##注意这里是NodePort,下面压力测试要用到。 10ports: 11- name: http 12port: 80 13 --- 14 apiVersion: apps/v1 15 kind: Deployment 16 metadata: 17name: myapp 18namespace: default 19 spec: 20replicas: 1 21selector: 22matchLabels: 23app: myapp 24template: 25metadata: 26name: myapp-demo 27namespace: default 28labels: 29app: myapp 30spec: 31containers: 32- name: myapp 33image: ikubernetes/myapp:v1 34imagePullPolicy: IfNotPresent 35ports: 36- name: http 37containerPort: 80 38resources: 39requests: 40cpu: 50m 41memory: 50Mi 42limits: 43cpu: 50m 44memory: 50Mi

- HPA资源清单如下:复制代码

1 apiVersion: autoscaling/v2beta1
2 kind: HorizontalPodAutoscaler
3 metadata:
4name: myapp-hpa-v2
5namespace: default
6 spec:
7minReplicas: 1##至少1个副本
8maxReplicas: 8##最多8个副本
9scaleTargetRef:
10apiVersion: apps/v1
11kind: Deployment
12name: myapp
13metrics:
14- type: Resource
15resource:
16name: cpu
17targetAverageUtilization: 50##注意此时是根据使用率,也可以根据使用量:targetAverageValue
18- type: Resource
19resource:
20name: memory
21targetAverageUtilization: 50##注意此时是根据使用率,也可以根据使用量:targetAverageValue
使用ab工具模拟压力测试:ab -c 1000 -n 5000000 http://192.168.1.103:31727/index.html 等待数分钟后,查看hpa及pod数量:

1 [root@K8s-master ~]# kubectl get hpa
2 NAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGE
3 myapp-hpa-v2Deployment/myapp5%/50%, 72%/50%18244m
4 [root@K8s-master ~]# kubectl get pods
5 NAMEREADYSTATUSRESTARTSAGE
6 myapp-558db64459-pwzsd1/1Running016m
7 myapp-558db64459-x9c4k1/1Running023s


    推荐阅读