什么是 HPA?
- Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标 来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。「VPA 可以默认放弃,如果还有对外服务如果只能垂直升,那写的都是啥?」
实现原理
- Pod 由控制器
kube-controller-manager
周期性的进行管理,每个周期按照HorizontalPodAutoscaler
给到的指标确认利用率/度量值后与设置好的target对比后,将会进行资源利用率/原始数计算后给到扩容比例-
--horizontal-pod-autoscaler-sync-period
: 默认 30s HPA 审核应用使用资源情况或自定义指标的频率 -
--horizontal-pod-autoscaler-downscale-delay
: 默认 5m0s 缩容操作完成后,HPA 必须等待多长时间才能进行另外一次缩容操作 -
--horizontal-pod-autoscaler-upscale-delay
: 默认 3m0s 扩容操作完成后,HPA 必须等待多长时间才能进行另外一次扩容操作
-
-
需要注意如果是自定义度量值的话就是纯数字的对比了,不是百分比了。
- TargetUtilization 和 Target 的为目标利用率和目标利用值(平均值或总量值)
- 设置 Cpu 利用率为 40% 假设存在一个叫 A 的 Deployment,包含 3 个 Pod,每个副本的 Request 值是 1 核,当前获取的每个 Pod 的 Cpu 使用值为 0.5,0.8,0.7,则当前 Pod 的总 Cpu 利用率 x=(0.5+0.7+0.8)/(3 * 1)=66.7%;根据上面公式 targetPods=(66.7%)/(40%)*3=5
- 以网络接收字节数 Receive_bytes_total 为指标计算, 目标平均值 targetAverageValue 为 100,假设存在一个叫 A 的 Deployment,包含 3个 Pod,当前获取的每个 Pod 的 Receive_bytes_total 使用值为120,150,20,则当前 Pod 的 Receive_bytes_total 总平均使用值 x = (130+150+200)/3 = 160,根据上面公式 TargetPods = (160/100)*3 = 5
- Package podautoscaler
- podautoscaler > replica_calculator.go 「整不明白先看 replica_calculator_test.go」
- 核心方法
优雅使用
- AliyunContainerService/kubernetes-cronhpa-controller: 一款面向 Pod 水平定时伸缩场景的 CRD Controller,很好的解决了 HPA 启动 Pod 需要时间的问题
- Custom Metrics: 自定义指标场景
价值
- 成本:配合 Cluster Autoscaling + CronHpa/Custom Hpa 「我厂已有大佬实现,麻烦收下膝盖!!!」,可以非常好的控制成本,老省钱了「降本提效」
- 稳定性:发挥监控数据的价值提前自动化的扩容好服务 「好美 好美」
- 效率:无研发介入、无 infra 介入,全自动「真香」