--- layout: blog title: "Kubernetes v1.33:HorizontalPodAutoscaler 可配置容差" slug: kubernetes-v1-33-hpa-configurable-tolerance math: true # for formulae date: 2025-04-28T10:30:00-08:00 author: "Jean-Marc François (Google)" translator: > [Xin Li](https://github.com/my-git9) (DaoCloud) --- 这篇文章描述了**水平 Pod 自动扩缩的可配置容差**, 这是在 Kubernetes 1.33 中首次出现的一个新的 Alpha 特性。 ## 它是什么? [水平 Pod 自动扩缩](/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/) 是 Kubernetes 中一个众所周知的特性,它允许你的工作负载根据资源利用率自动增减副本数量。 假设你在 Kubernetes 集群中运行了一个具有 50 个副本的 Web 应用程序。 你配置了 Horizontal Pod Autoscaler (HPA)根据 CPU 利用率进行扩缩, 目标利用率 75%。现在,假设所有副本的当前 CPU 利用率为 90%, 这高于预期的 75%。HPA 将使用以下公式计算所需的副本数量: ```math desiredReplicas = ceil\left\lceil currentReplicas \times \frac{currentMetricValue}{desiredMetricValue} \right\rceil ``` 在此示例中: ```math 50 \times (90/75) = 60 ``` 因此,HPA 将增加副本数量从 50 个提高到 60 个,以减少每个 Pod 的负载。 同样,如果 CPU 利用率降至 75% 以下,HPA 会相应地减少副本数量。 Kubernetes 文档提供了[扩缩算法的详细描述](/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details)。 为了避免在指标发生小波动时创建或删除副本, Kubernetes 应用了一种迟滞形式:仅当当前和期望的指标值差异超过 10% 时, 才改变副本数量。在上面的例子中,因为当前和期望的指标值比率是 \\(90/75\\), 即超出目标 20%,超过了 10% 的容差,所以扩容操作将继续进行。 这个 10% 的默认容差是集群范围的;在旧版本的 Kubernetes 中, 它无法进行微调。对于大多数使用场景来说,这是一个合适的值, 但对于大型部署而言则过于粗糙,因为 10% 的容差代表着数十个 Pod。 因此,社区长期以来[要求](https://github.com/kubernetes/kubernetes/issues/116984)能够调整这个值。 在 Kubernetes v1.33 中,现在这已成为可能。 ## 我如何使用它? 在你的 Kubernetes v1.33 集群中启用 `HPAConfigurableTolerance` [特性门控][/zh-cn/docs/reference/command-line-tools-reference/feature-gates/]后, 你可以为你的 HorizontalPodAutoscaler 对象添加期望的容差。 容差出现在 `spec.behavior.scaleDown` 和 `spec.behavior.scaleUp` 字段下,因此对于扩容和缩容可以有不同的设置。一个典型的用法是在扩容时指定一个小的容差(以快速响应峰值), 而在缩容时指定较大的容差(以避免因小的指标波动而过快地添加或移除副本)。 例如,一个在缩容时有 5% 容差,在扩容时没有容差的 HPA 配置如下所示: ```yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: my-app spec: ... behavior: scaleDown: tolerance: 0.05 scaleUp: tolerance: 0 ``` ## 所有细节 通过阅读 [KEP-4951](https://github.com/kubernetes/enhancements/tree/master/keps/sig-autoscaling/4951-configurable-hpa-tolerance) 获取所有技术细节,并关注 [Issue 4951](https://github.com/kubernetes/enhancements/issues/4951) 以获得**特性毕业**的通知。