一、认识HPA
参考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/
HPA全称是Horizontal Pod Autoscaler,中文意思是POD水平自动伸缩.
可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 数量。
除了 CPU 利用率,内存占用外,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。
自定义度量参考: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/custom-metrics-api.md
Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。
控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。
二、HPA工作机制

Pod 水平自动扩缩器的实现是一个控制回路,由控制器管理器的 <code>--horizontal-pod-autoscaler-sync-period</code> 参数指定周期(默认值为 15 秒)。
每个周期内,控制器管理器根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。 控制器管理器可以从资源度量指标 API(按 Pod 统计的资源用量)和自定义度量指标 API(其他指标)获取度量值。
对于按 Pod 统计的资源指标(如 CPU), 控制器从资源指标 API 中获取每一个 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果设置了目标使用率, 控制器获取每个 Pod 中的容器资源使用情况,并计算资源使用率。 如果设置了 target 值,将直接使用原始数据(不再计算百分比)。 接下来,控制器根据平均的资源使用率或原始值计算出扩缩的比例,进而计算出目标副本数。
需要注意的是,如果 Pod 某些容器不支持资源采集,那么控制器将不会使用该 Pod 的 CPU 使用率。
如果 Pod 使用自定义指示,控制器机制与资源指标类似,区别在于自定义指标只使用 原始值,而不是使用率。
如果 Pod 使用对象指标和外部指标(每个指标描述一个对象信息)。 这个指标将直接根据目标设定值相比较,并生成一个上面提到的扩缩比例。 在 <code>autoscaling/v2beta2</code> 版本 API 中,这个指标也可以根据 Pod 数量平分后再计算。
通常情况下,控制器将从一系列的聚合 API(<code>metrics.k8s.io</code>、<code>custom.metrics.k8s.io</code> 和 <code>external.metrics.k8s.io</code>)中获取度量值。 <code>metrics.k8s.io</code> API 通常由 Metrics 服务器(需要额外启动)提供。
确认安装metrics-server
三、HPA API对象
HPA的API有三个版本
APA版本
描述
autoscaling/v1
只支持基于CPU指标的缩放
autoscaling/v2beta1
支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)的缩放;
autoscaling/v2beta2
支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)和ExternalMetrics(额外指标)的缩放。
四、kubectl对HPA的支持
与其他 API 资源类似,<code>kubectl</code> 以标准方式支持 HPA。
通过 <code>kubectl create</code> 命令创建一个 HPA 对象
通过 <code>kubectl get hpa</code> 命令来获取所有 HPA 对象
通过 <code>kubectl describe hpa</code> 命令来查看 HPA 对象的详细信息
通过 <code>kubectl delete hpa</code> 命令删除对象。
此外,还有个简便的命令 <code>kubectl autoscale</code> 来创建 HPA 对象。
例如,命令 <code>kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80</code> 将会为名 为 foo 的 ReplicationSet 创建一个 HPA 对象, 目标 CPU 使用率为 <code>80%</code>,副本数量配置为 2 到 5 之间。
五、HPA演示案例
参考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
得到pod-IP为<code>10.3.104.15</code>,此IP下面测试需要用到
说明:
--cpu-percent=50表示所有Pod的平均CPU使用率维持在50%,超过就要扩容
--min=1 --max=10表示pod数量的范
用另一个终端(我这里是master2)使用busybox镜像产生一个测试pod,对<code>10.3.104.15</code>进行压测
不断查询hpa状态,大概一分钟后才会看到效果
要等几分钟甚至更久后,就看到cpu与pod数量都回去了
换一个终端(master2),进入pod后进行dd命令测试
ctrl+c取消后,删除dd的文件
等几分钟甚至更久后,就看到cpu与pod数量都回去了
写在最后,更多功能可以自己去探索。虽然目前HPA功能还在beta版,但以后肯定会越来越成熟。