本页面简要介绍了 Google Kubernetes Engine (GKE) 中的 Pod 纵向自动扩缩,并提供了 VerticalPodAutoscaler
自定义资源和相关类型的参考资料。
Pod 纵向自动扩缩会针对不同时段的资源用量提供建议。如果资源使用量突然增加,请使用水平 Pod 自动扩缩器。
如需了解如何使用 Pod 纵向自动扩缩,请参阅扩缩容器资源请求和限制。
如需了解自动扩缩的最佳实践,请参阅在 GKE 上运行费用经过优化的 Kubernetes 应用的最佳实践。
Pod 纵向自动扩缩的工作原理
借助 Pod 纵向自动扩缩,您可以分析和设置 Pod 所需的 CPU 和内存资源。您无需为 Pod 中的容器设置最新的 CPU 请求和限制以及内存请求和限制,而是可以配置 Pod 纵向自动扩缩,以便为可用于手动更新 Pod 的 CPU 和内存请求及限制提供建议值,也可以将 Pod 纵向自动扩缩配置为自动更新这些值。
在 Autopilot 集群中,Pod 纵向自动扩缩默认处于启用状态。
自动模式下的 Pod 纵向自动扩缩
由于 Kubernetes 的限制,修改正在运行的 Pod 的资源请求的唯一方法是重新创建 Pod。因此,如果您创建了一个 updateMode
为 Auto
的 VerticalPodAutoscaler
对象,则 VerticalPodAutoscaler
将在需要更改某个 Pod 的资源请求时逐出该 Pod。
如需限制 Pod 重新启动的数量,请使用 Pod 中断预算。 如需确保集群可以处理新规模的工作负载,请使用集群自动扩缩器和节点自动预配。
Pod 纵向自动扩缩会在更新之前通知集群自动扩缩器,并在重新创建工作负载之前提供规模经过调整的工作负载所需的资源,以最大限度地缩短中断时间。
优势
Pod 纵向自动扩缩具有以下优势:
- 为工作负载设置适当的资源请求和限制可以提高稳定性和成本效益。如果 Pod 资源大小低于工作负载所需的大小,则您的应用可能会受到限制,或者由于内存不足错误而可能发生故障。如果资源大小过大,则会造成浪费,进而产生高额账单。
- 因为 Pod 完全用其所需,所以集群节点使用效率高。
- Pod 会被安排到具有适当可用资源的节点上。
- 您不必运行耗时的基准测试任务来确定 CPU 和内存请求的正确值。
- 自动扩缩器可以随时间推移调整 CPU 和内存请求,而无需您执行任何操作,所以维护时间缩短。
与 Kubernetes 开源自动扩缩器相比,GKE Pod 纵向自动扩缩具有以下优势:
- 在确定推荐目标时,会考虑节点大小上限和资源配额。
- 通知集群自动扩缩器来调整集群容量。
- 使用历史数据,提供在启用 Pod 纵向自动扩缩器之前收集的指标。
- 将 Pod 纵向自动扩缩器 Pod 作为控制层面进程运行,而不是作为工作器节点上的部署运行。
限制
- 如需将 Pod 纵向自动扩缩与Pod 横向自动扩缩结合使用,请使用Pod 多维自动扩缩。您还可以为自定义和外部指标结合使用 Pod 纵向自动扩缩和 Pod 横向自动扩缩。
- Pod 纵向自动扩缩目前无法用于基于 JVM 的工作负载,因为对此类工作负载的实际内存用量的了解有限。
- Pod 纵向自动扩缩的默认设置至少为两个副本,以便 Deployment 将 Pod 替换为修改后的资源值。在 GKE 1.22 版及更高版本中,您可以通过在 PodUpdatePolicy 字段中指定
minReplicas
值来替换此设置。
最佳做法
- 为避免集群更新中断,我们建议您将每个集群的
VerticalPodAutoscaler
对象数量保持在 1,000 以下。 - Pod 纵向自动扩缩功能最适合长时间运行的同质工作负载。
API 参考文档
这是 v1
API 参考文档。我们强烈建议您使用此版本的 API。
VerticalPodAutoscaler v1 autoscaling.k8s.io
字段 | |
---|---|
|
API 组、版本和种类。 |
metadata |
标准对象元数据。 |
spec |
|
status |
最近观察到的 |
VerticalPodAutoscalerSpec v1 autoscaling.k8s.io
字段 | |
---|---|
targetRef |
引用用于管理一组 Pod 以供自动扩缩器控制的控制器,例如 Deployment 或 StatefulSet 控制器。您可以将 |
updatePolicy |
指定在 Pod 启动时是否应用推荐的更新,以及在 Pod 的生命周期内是否应用推荐的更新。 |
resourcePolicy |
指定如何为各个容器调整 CPU 和内存请求的政策。资源政策可用于设置针对各个容器的建议约束。如果未指定,自动扩缩器将计算 Pod 中所有容器的推荐资源,且不受其他限制。 |
recommenders |
负责为此 VPA 对象生成建议的 Recommender。留空可使用 GKE 提供的默认 Recommender。否则,列表只能为用户提供的备用 Recommender 提供一个条目。从 GKE 1.22 开始受支持。 |
VerticalPodAutoscalerList v1 autoscaling.k8s.io
字段 | |
---|---|
|
API 组、版本和种类。 |
metadata |
标准对象元数据。 |
items |
|
PodUpdatePolicy v1 autoscaling.k8s.io
字段 | |
---|---|
updateMode |
指定在 Pod 启动时是否应用推荐的更新,以及在 Pod 的生命周期内是否应用推荐的更新。可能的值为“关闭”“初始”“重新创建”和“自动”。 如果您未指定值,则默认值为“自动”。 |
minReplicas |
更新程序尝试 Pod 逐出所需的最小活跃副本数(等待其他检查,如 Pod 中断预算)。仅允许使用正值。默认为全局“--min-replicas”标志,该标志在 GKE 中设置为 2。从 GKE 1.22 开始受支持。 |
PodResourcePolicy v1 autoscaling.k8s.io
字段 | |
---|---|
containerPolicies |
各个容器的一系列资源政策。 每个命名容器最多只能有 1 个条目,可以选择性地使用 `containerName =“*”单个通配符条目,该条目可以处理所有不具有单独政策的容器。 |
ContainerResourcePolicy v1 autoscaling.k8s.io
字段 | |
---|---|
containerName |
政策适用的容器的名称。如果未指定,则政策将用作默认政策。 |
mode |
指定在容器启动时是否将推荐的更新应用于容器,以及在容器的生命周期内是否应用推荐的更新。可能的值为“关闭”和“自动”。 如果您未指定值,则默认值为“自动”。 |
minAllowed |
指定容器允许的最小 CPU 请求和内存请求。默认情况下,不会应用最小值。 |
maxAllowed |
指定容器允许的最大 CPU 请求和内存请求。默认情况下,不会应用最大值。 |
ControlledResources |
指定将由 |
VerticalPodAutoscalerRecommenderSelector v1 autoscaling.k8s.io
字段 | |
---|---|
name |
负责为此对象生成建议的 Recommender 的名称。 |
VerticalPodAutoscalerStatus v1 autoscaling.k8s.io
字段 | |
---|---|
recommendation |
最近推荐的 CPU 和内存请求。 |
conditions |
描述 |
RecommendedPodResources v1 autoscaling.k8s.io
字段 | |
---|---|
containerRecommendation |
针对各个容器的一系列资源推荐。 |
RecommendedContainerResources v1 autoscaling.k8s.io
字段 | |
---|---|
containerName |
推荐适用的容器的名称。 |
target |
容器的推荐 CPU 请求和内存请求。 |
lowerBound |
容器的最小推荐 CPU 请求和内存请求。该数量不足以保证应用的稳定性。使用较小的 CPU 和内存请求运行可能会对性能或可用性产生重大影响。 |
upperBound |
容器的最大推荐 CPU 请求和内存请求。高于推荐值的 CPU 和内存请求可能会被浪费。 |
uncappedTarget |
由自动调节程序计算的最新资源推荐基于实际资源使用情况,而不考虑 ContainerResourcePolicy。如果实际资源使用情况会导致目标违反 ContainerResourcePolicy,则可能与限定的建议不同。此字段不会影响实际的资源分配,而是仅用于指示状态。 |
VerticalPodAutoscalerCondition v1 autoscaling.k8s.io
字段 | |
---|---|
type |
正在描述的条件的类型。可能的值为“RecommendationProvided”“LowConfidence”“NoPodsMatched”和“FetchingHistory”。 |
status |
条件的状态。可能的值为True、False和Unknown。 |
lastTransitionTime |
条件上次从一种状态转换到另一种状态的时间。 |
reason |
上次从一种状态转换到另一种状态的原因。 |
message |
人类可读的字符串,提供有关上次从一种状态转换到另一种状态的详细信息。 |
后续步骤
- 了解如何扩缩容器资源请求和限制。
- 了解集群自动扩缩器。