垂直 Pod 自动扩缩

本页面简要介绍了 Pod 纵向自动扩缩功能,并说明了如何利用这项功能来调整容器的 CPU 请求和限制以及内存请求和限制。本页面还提供了 VerticalPodAutoscaler 自定义资源和相关类型的参考资料。

概览

使用 Pod 纵向自动扩缩 (VPA) 时,您无需考虑为容器的 CPU 和内存请求指定哪些值。该自动扩缩程序可以为 CPU 和内存请求及限制提供建议值,也可以自动更新这些值。

Pod 纵向自动扩缩功能具有以下优势:

  • 因为 Pod 完全用其所需,所以集群节点使用效率高。

  • Pod 会被调度到具有适当可用资源的节点上。

  • 您不必运行耗时的基准测试任务来确定正确的 CPU 和内存请求值。

  • 该自动扩缩程序可以随时调整 CPU 和内存请求,而无需您执行任何操作,因此维护时间更短。

Pod 纵向自动扩缩功能存在以下限制:

  • 垂直 Pod 自动扩缩功能支持每个集群最多 500 个 VPA 对象。

  • 从版本 1.12.6 开始,区域级集群支持 Pod 纵向自动扩缩功能。

  • 不要对 CPU 或内存一并使用 Pod 纵向自动扩缩和 Pod 横向自动扩缩 (HPA)。但是,您可以对自定义外部指标一并使用 VPA 和 HPA。

  • Pod 纵向自动扩缩目前还无法用于 JVM 工作负载,因为对此类工作负载的实际内存用量的了解有限。

  • Pod 纵向自动扩缩无法自动为注入的 Sidecar 应用建议。如果您为已注入 Sidecar 的 Pod 创建一个 VerticalPodAutoscaler 对象,但未将 updateMode 设置为 "Off",则必须使用容器资源政策停用这些 Sidecar。请参阅参考文档部分中的 ContainerResourcePolicy 以及如何停用特定容器

    将 Pod 纵向自动扩缩与 Istio 一起使用时,存在一个已知问题。 这项 VPA 限制会影响 Istio Sidecar。要解决此问题,请在 VerticalPodAutoscaler 规范定义中附加以下内容以停用 Istio Sidecar:

    resourcePolicy:
          containerPolicies:
          - containerName: istio-proxy
            mode: "Off"
        

自动模式下的 Pod 纵向自动扩缩功能

如要修改正在运行的 Pod 的资源请求,唯一方式是重新创建该 Pod,原因是 Kubernetes 存在限制。因此,如果您创建了一个 updateMode"Auto"VerticalPodAutoscaler,则 VerticalPodAutoscaler 将在需要更改某个 Pod 的资源请求时逐出该 Pod。

如需限制 Pod 重启次数,请参阅 Pod 中断预算

如要确保集群可以处理新规模的工作负载,请参阅集群自动扩缩程序节点自动预配。 Pod 纵向自动扩缩程序会在更新之前通知集群自动扩缩程序,并在重新创建 Pod 之前提供运行大小经过调整的工作负载所需的资源,以最大限度地缩短中断时间。

后续步骤

参考

VerticalPodAutoscaler v1 autoscaling.k8s.io

字段

TypeMeta

API 组、版本和种类。

metadata

ObjectMeta

标准对象元数据

spec

VerticalPodAutoscalerSpec

所需的 VerticalPodAutoscaler 行为。

status

VerticalPodAutoscalerStatus

最近观察到的 VerticalPodAutoscaler 状态。

VerticalPodAutoscalerSpec v1 autoscaling.k8s.io

字段
targetRef

CrossVersionObjectReference

引用用于管理一组 Pod 以供自动扩缩程序控制的控制器,例如 Deployment 或 StatefulSet 控制器。 您可以将 VerticalPodOutoscaler 指向任何具有 Scale 子资源的控制器。一般而言,VerticalPodAutoscaler 从控制器的 ScaleStatus 中检索 Pod 集合。如果是 DaemonSet 等一些众所周知的控制器,VerticalPodAutoscaler 会从控制器的规范中检索 Pod 集合。

updatePolicy

PodUpdatePolicy

指定在 Pod 启动时是否应用推荐的更新,以及在 Pod 的生命周期内是否应用推荐的更新。

resourcePolicy

PodResourcePolicy

指定有关如何为各个容器调整 CPU 和内存请求的政策。

VerticalPodAutoscalerList v1 autoscaling.k8s.io

字段

TypeMeta

API 组、版本和种类。

metadata

ObjectMeta

标准对象元数据

items

VerticalPodAutoscaler array

VerticalPodAutoscaler 对象的列表。

PodUpdatePolicy v1 autoscaling.k8s.io

字段
updateMode

string

指定在 Pod 启动时是否应用推荐的更新,以及在 Pod 的生命周期内是否应用推荐的更新。可能的值为“关闭”、“初始”、“重新创建”和“自动”。

PodResourcePolicy v1 autoscaling.k8s.io

字段
containerPolicies

ContainerResourcePolicy array

各个容器的一系列资源政策。

ContainerResourcePolicy v1 autoscaling.k8s.io

字段
containerName

string

相关政策适用的容器的名称。如果未指定,则相关政策将用作默认政策。

mode

ContainerScalingMode

指定在容器启动时是否将推荐的更新应用于容器,以及在容器的生命周期内是否应用推荐的更新。可能的值为“关闭”和“自动”。

minAllowed

ResourceList

指定容器允许的最小 CPU 请求和内存请求。

maxAllowed

ResourceList

指定容器允许的最大 CPU 请求和内存请求。

VerticalPodAutoscalerStatus v1 autoscaling.k8s.io

字段
recommendation

RecommendedPodResources

最近推荐的 CPU 和内存请求。

conditions

VerticalPodAutoscalerCondition array

描述 VerticalPodAutoscaler 的当前状态。

RecommendedPodResources v1 autoscaling.k8s.io

字段
containerRecommendation

RecommendedContainerResources array

针对各个容器的一系列资源推荐。

RecommendedContainerResources v1 autoscaling.k8s.io

字段
containerName

string

推荐适用的容器的名称。

target

ResourceList

为容器推荐的 CPU 请求和内存请求。

lowerBound

ResourceList

为容器推荐的最小 CPU 请求和内存请求。该限额不足以保证应用的稳定性。使用较小的 CPU 和内存请求运行可能会对性能或可用性产生重大影响。

upperBound

ResourceList

为容器推荐的最大 CPU 请求和内存请求。高于这些推荐值的 CPU 和内存请求很可能造成浪费。

uncappedTarget

ResourceList

由自动扩缩程序计算的最新资源推荐值,该值仅基于实际资源用量,而不考虑 ContainerResourcePolicy。如果实际资源用量导致目标违反了 ContainerResourcePolicy,则该字段的值可能与限定的推荐值不同。此字段不会影响实际的资源分配,而是仅用于指示状态。

VerticalPodAutoscalerCondition v1 autoscaling.k8s.io

字段
type

VerticalPodAutoscalerConditionType

所描述条件的类型。可能的值为“RecommendationProvided”、“LowConfidence”、“NoPodsMatched”和“FetchingHistory”。

status

ConditionStatus

条件的状态。可能的值为 True、False 和 Unknown。

lastTransitionTime

Time

条件上次从一种状态转换到另一种状态的时间。

reason

string

上次从一种状态转换到另一种状态的原因。

message

string

人类可读的字符串,提供有关上次从一种状态转换到另一种状态的详细信息。