Kubernetes HPA 的理解

什么是 HPA?

  • Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标 来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。「VPA 可以默认放弃,如果还有对外服务如果只能垂直升,那写的都是啥?」
    Horizontal Pod Autoscaler

实现原理

  • 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 必须等待多长时间才能进行另外一次扩容操作
  • 需要注意如果是自定义度量值的话就是纯数字的对比了,不是百分比了。


    期望副本数 = ceil[(当前指标 / 期望指标) * 当前副本数]
  • 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」
  • 核心方法
    • GetObjectMetricReplicas
    • GetObjectPerPodMetricReplicas
    • GetExternalMetricReplicas
    • GetExternalPerPodMetricReplicas
  • HPA GitHub Readme
流程

优雅使用

  • AliyunContainerService/kubernetes-cronhpa-controller: 一款面向 Pod 水平定时伸缩场景的 CRD Controller,很好的解决了 HPA 启动 Pod 需要时间的问题
  • Custom Metrics: 自定义指标场景

价值

  • 成本:配合 Cluster Autoscaling + CronHpa/Custom Hpa 「我厂已有大佬实现,麻烦收下膝盖!!!」,可以非常好的控制成本,老省钱了「降本提效」
  • 稳定性:发挥监控数据的价值提前自动化的扩容好服务 「好美 好美」
  • 效率:无研发介入、无 infra 介入,全自动「真香」

你可能感兴趣的:(Kubernetes HPA 的理解)