Kubernetes Pod水平自动伸缩(HPA)

scofield 菜鸟运维杂谈

HPA简介


HAP,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

Pod HAP工作机制示意图

实际生产中,广泛使用这四类指标:

1、Resource metrics - CPU核内存利用率指标
2、Pod metrics - 例如网络利用率和流量
3、Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
4、Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容

好了,概念就说这些,想了解更多,请参看官网,现在开始实战。

示例


1、首先我们部署一个nginx,副本数为2,请求cpu资源为200m。同时为了便宜测试,使用NodePort暴露服务。命名空间:hpa

apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: nginx  name: nginx  namespace: hpaspec:  replicas: 2  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - image: nginx        name: nginx        resources:          requests:            cpu: 200m            memory: 100Mi---apiVersion: v1kind: Servicemetadata:  name: nginx  namespace: hpaspec:  type: NodePort  ports:  - port: 80    targetPort: 80  selector:    app: nginx

2、查看部署结果

[root@k8s-node001 HPA]# kubectl  get po -n hpaNAME                     READY   STATUS    RESTARTS   AGEnginx-5c87768685-48b4v   1/1     Running   0          8m38snginx-5c87768685-kfpkq   1/1     Running   0          8m38s

3、创建HPA
简单说下:这里创建一个HPA,用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。
HPA 将通过增加或者减少 Pod 副本的数量(通过 Deployment)以保持所有 Pod 的平均 CPU 利用率在 50% 以内。
算法参见

apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:  name: nginx  namespace: hpaspec:  scaleTargetRef:    apiVersion: apps/v1    kind: Deployment    name: nginx  minReplicas: 1  maxReplicas: 10  metrics:  - type: Resource    resource:      name: cpu      target:        type: Utilization        averageUtilization: 50

4、查看部署结果

[root@k8s-node001 HPA]# kubectl  get hpa -n hpaNAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGEnginx   Deployment/nginx   0%/50%      1                10                 2          50s

5、压测,观察Pod数和HPA变化
执行压测命令

[root@k8s-node001 ~]# ab -c 1000 -n 100000000 http://192.168.100.185:30792/This is ApacheBench, Version 2.3 <$Revision: 1843412 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.100.185 (be patient)

观察变化

[root@k8s-node001 HPA]#  kubectl  get hpa -n hpaNAME    REFERENCE          TARGETS    MINPODS   MAXPODS   REPLICAS   AGEnginx   Deployment/nginx   303%/50%   1         10        7          12m[root@k8s-node001 HPA]# kubectl  get po -n hpaNAME                         READY   STATUS    RESTARTS   AGEpod/nginx-5c87768685-6b4sl   1/1     Running   0          85spod/nginx-5c87768685-99mjb   1/1     Running   0          69spod/nginx-5c87768685-cls7r   1/1     Running   0          85spod/nginx-5c87768685-hhdr7   1/1     Running   0          69spod/nginx-5c87768685-jj744   1/1     Running   0          85spod/nginx-5c87768685-kfpkq   1/1     Running   0          27mpod/nginx-5c87768685-xb94x   1/1     Running   0          69s

从以上输出可以看出,hpa TARGETS达到了303%,需要扩容。pod数自动扩展到了7个。
继续等待压测结束或者直接打断压测

[root@k8s-node001 ~]# kubectl get hpa -n hpaNAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGEnginx   Deployment/nginx   20%/50%   1         10        7          16m。。。N分钟后。。。[root@k8s-node001 ~]# kubectl get hpa -n hpaNAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGEnginx   Deployment/nginx   0%/50%    1         10        7          18m。。。再过N分钟后。。。[root@k8s-node001 ~]# kubectl  get po -n hpaNAME                     READY   STATUS    RESTARTS   AGEnginx-5c87768685-jj744   1/1     Running   0          11m

这时,CPU 利用率已经降到 0,所以 HPA 将自动缩减副本数量至 1。
这里需要注意下:为什么会将副本数降为1,而不是我们部署时指定的replicas: 2呢?
因为在创建HPA时,指定了副本数范围,这里是minReplicas: 1,maxReplicas: 10。所以HPA在缩减副本数时减到了1。
Tips:自动扩缩完成副本数量的改变可能需要几分钟的时间。

总结


PS:后续文章会同步到dev.kubeops.net

注:文中图片来源于网络,如有侵权,请联系我及时删除。

©著作权归作者所有:来自51CTO博客作者mb5fdb131956bf3的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 9:VMware Horizon View 8.0-安装副本连接服务器
  2. [灾备] 数据副本管理技术(CDM)
  3. kafka架构
  4. netcore使用 jenkins + supervisor 实现standalone下多副本自动
  5. Docker快速搭建Clickhouse集群(3分片3副本)
  6. android修改或添加SettingsProvider的默认值
  7. 应用内存限制
  8. Android(安卓)RemoteCallbackList类
  9. Android(安卓)撕衣服Demo(OnTouchListener 应用)

随机推荐

  1. 必须要会的 50 个React 面试题(上)[每日前
  2. C语言的for循环以及一些练习
  3. 必须要会的 50 个React 面试题(下)[每日前
  4. 今天记的笔记
  5. 2021.1.19
  6. JavaScript 的未来:它还少些什么? [每日前
  7. C语言学习心得(八)
  8. 爬取6271家死亡公司数据,看十年创业公司消
  9. yum的使用详解
  10. 王思聪究竟上了多少次热搜?