本文概述如何使用 Azure Kubernetes 服务 (AKS) 中基于开源 Kubernetes 版本的垂直 Pod 自动缩放程序 (VPA)。
配置该程序后,VPA 将根据过去的使用量自动设置每个工作负载中容器的资源请求和限制。 VPA 释放 CPU 和内存供其他 Pod 使用,并帮助确保有效利用 AKS 群集。 垂直 Pod 自动缩放提供一段时间内的资源使用情况建议。 若要管理资源使用量的突然增加,请使用水平 Pod 自动缩放程序,它可以根据需要缩放 Pod 副本数。
好处
垂直 Pod 自动缩放程序提供以下优势:
- 分析应用程序所需的处理器和内存资源并将其调整为合适的大小。 VPA 不仅负责根据一段时间内的资源使用量来扩展规模,还负责缩减规模。
- 如果需要更改其资源请求,将逐出缩放模式设置为“自动”或“重新创建”的 Pod。
- 可以通过指定资源策略为单个容器设置 CPU 和内存限制。
- 确保节点中有适当的资源用于 Pod 调度。
- 提供对处理器或内存资源所做调整的可配置日志记录。
- 提高群集资源利用率,并为其他 Pod 释放 CPU 和内存。
限制和注意事项
使用垂直 Pod 自动缩放程序时,请考虑以下限制和注意事项:
- VPA 支持每个集群中与
VerticalPodAutoscaler
对象关联的最多 1,000 个 Pod。 - VPA 可能建议的资源比群集中的可用资源多,这可以防止 Pod 分配到节点并因资源不足而运行。 可以通过将 LimitRange 设置为每个命名空间的最大可用资源来克服此限制,这可确保 Pod 请求的资源不会超过指定。 还可以设置
VerticalPodAutoscaler
对象中每个 Pod 允许的最大资源建议数。 VPA 无法完全克服节点资源不足的问题。 限制范围是固定的,但节点资源使用情况会动态更改。 - 不建议将 VPA 与水平 Pod 自动缩放程序配合使用,后者根据相同的 CPU 和内存使用情况指标进行缩放。
- VPA 推荐器最多只存储 8 天的历史数据。
- VPA 不支持基于 JVM 的工作负载,因为对工作负载的实际内存使用情况的可见性有限。
- VPA 不支持同时运行自己的 VPA 实现。 支持使用额外的或自定义的推荐器。
- 不支持 AKS Windows 容器。
VPA 概述
VPA 对象由三个组件组成:
- 推荐器:推荐器监视当前和过去的资源消耗量,包括指标历史记录、内存不足 (OOM) 事件和 VPA 部署规范,并使用收集的信息为容器 CPU 和内存请求/限制提供建议的值。
- 更新程序:更新程序监视托管 Pod 以确保正确设置其资源请求。 否则,它会删除这些 Pod,以便其控制器可以使用更新的请求重新创建它们。
- VPA 许可控制器:VPA 许可控制器根据更新程序的活动。为新 Pod 设置正确的资源请求(由其控制器创建或重新创建)。
VPA 许可控制器
VPA 许可控制器是一个二进制文件,用于将自身注册为可变许可 Webhook。 创建新 Pod 后,VPA 许可控制器会从 API 服务器获取请求,并评估是否存在匹配的 VPA 配置,或者查找相应的配置,并使用当前建议在 Pod 中设置资源请求。
独立作业 overlay-vpa-cert-webhook-check
在 VPA 许可控制器外运行。 overlay-vpa-cert-webhook-check
作业创建和续订证书,并将 VPA 许可控制器注册为 MutatingWebhookConfiguration
。
VPA 对象操作模式
垂直 Pod 自动缩放程序资源(通常为部署)为希望自动计算资源要求的每个控制器插入。
有四种运行 VPA 的模式:
Auto
:VPA 在 Pod 创建期间分配资源请求,并使用首选更新机制更新现有 Pod。Auto
相当于Recreate
,是默认模式。 免费重启或就地后,更新 Pod 请求可用后,Auto
模式可以将它用作首选更新机制。 使用Auto
模式时,如果该 Pod 需要更改其资源请求,VPA 会驱逐该 Pod。 这可能会导致 Pod 一次性重启,从而导致应用程序不一致。 在这种情况下,可以使用 PodDisruptionBudget 限制重启,并保持一致性。Recreate
:VPA 在 Pod 创建期间分配资源请求,并通过在请求的资源与遵循 Pod 中断预算的新建议(如果定义,则采用 PodDisruptionBudget)明显不同时逐出现有 Pod 来更新这些请求。 仅当每当资源请求更改时需要确保重启 Pod 时,才应使用此模式。 否则,我们建议使用Auto
模式,该模式利用无重启更新(一旦可用)。Initial
:VPA 仅在 Pod 创建期间分配资源请求。 它不更新现有 Pod。 此模式可用于测试和了解 VPA 行为,而不会影响正在运行的 Pod。Off
:VPA 不会自动更改 Pod 的资源要求。 建议经过计算,可以在 VPA 对象中检查。
应用程序开发的部署模式
如果不熟悉 VPA,建议在应用程序开发期间使用以下部署模式,以确定其独特的资源利用率特征,测试 VPA 以验证它是否正常运行,并与其他 Kubernetes 组件一起测试以优化群集的资源利用率:
- 在生产群集中设置
UpdateMode = "Off"
,并在建议模式下运行 VPA,以便测试并熟悉 VPA。UpdateMode = "Off"
可以避免引入可能导致中断的错误配置。 - 首先,通过在给定时间段内收集实际资源利用遥测数据来建立可观测性。这有助于了解容器和 Pod 资源在受工作负载影响时的行为及其任何问题迹象。
- 熟悉监视数据以了解性能特征。 根据此见解,相应地设置所需的请求/限制,然后在下一次部署或升级中设置。
- 根据你的要求将
updateMode
值设为Auto
、Recreate
或Initial
。
后续步骤
若要了解如何在 AKS 群集上设置垂直 Pod 自动缩放程序,请参阅在 AKS 中使用垂直 Pod 自动缩放程序。