更新时间:2024-09-29 GMT+08:00

创建VPA策略

VPA策略即Vertical Pod Autoscaling,该功能可以在Kubernetes中实现Pod垂直弹性伸缩,可以根据容器资源历史使用情况自动调整Pod的CPU、Memory资源申请量。当业务负载急剧飙升时,VPA能够快速地在设定范围内扩大容器的资源申请值(Requests),以满足业务需求。而在业务负载变小时,VPA会根据实际情况适当缩小资源申请量,以节省计算资源。此外,VPA还能推荐更合理的资源申请量,在确保容器有足够的资源供使用的前提下,提升容器的资源利用率。

功能概述

VPA以容器为单位对资源指标进行聚合计算,根据容器的资源实际使用情况动态调整容器的资源申请值(Requests),同时保证调整前和调整后资源限制值(Limits)与资源申请值(Requests)的比值不变。目前支持CPU与Memory两类资源的垂直伸缩。

详细功能说明如下:

  • VPA计算CPU与Memory建议值时需要数依赖Metrics API采集的数据。
  • VPA在计算资源建议值时,Memory资源的单Pod最小理论建议值250Mi,Pod内单容器的最小理论建议值为250Mi/Pod容器数目。CPU资源的单Pod最小理论建议值为25m,Pod内单容器的最小理论建议值为25m/Pod容器数目。

    您可在创建VPA任务时,通过配置containerPolicies字段为容器配置弹性资源上下限。

  • 如果容器初始时同时配置了资源申请值与限制值,VPA计算后给出的建议值会修改该容器的资源申请值,而限制值则根据容器初始创建时申请值与限制值的比例进行计算。

    例如,某个容器原来配置了CPU资源申请值为100m与限制值为200m,申请值与限制值的比例为1:2。如果VPA计算后的资源申请值建议为80m,则该容器最终的CPU资源申请值为80m,限制值为160m。

  • VPA会尽量让建议值符合其他资源限制要求。但如果VPA建议值与资源限制出现冲突,VPA建议值不会根据资源限制进行调整,可能导致VPA配置值超出其他资源限制要求。

    例如,某一个命名空间的内存申请值不能超过2GiB,而VPA的建议值如果比较大,可能导致Pod更新后整个命名空间的资源申请量超过2GiB从而出现无法调度。

前提条件

  • 集群版本需满足v1.25及以上。
  • 使用VPA需要在集群中安装能够提供Metrics API的插件,您可根据实际需求选择其中之一:

注意事项

容器垂直伸缩功能目前处于试验阶段,请谨慎使用。

  • VPA对Pod资源进行动态更新时,会导致Pod的重建,重建的Pod可能会调度到一个新的节点上,且VPA无法保证重建的Pod调度成功。
  • 只有由副本控制管理器(例如Deployment、StatefulSet等)管理的Pod才会进行资源动态更新,独立运行的Pod不支持资源动态更新。
  • 目前VPA不能和监控CPU和内存度量的Horizontal Pod Autoscaler (HPA)同时运行。
  • VPA admission webhook会对Pod的配置进行更新,如果集群中有其他的admission webhook,需要确保它们不会与VPA发生冲突。
  • VPA会处理大部分的OOM(Out Of Memory)事件,但无法保证处理所有的OOM事件。
  • VPA的性能尚未在大规模集群中实践。
  • VPA建议值可能大于实际可分配的资源量(例如节点可分配资源上限、资源配额上限),导致重建的Pod处于Pending状态无法调度。
  • 为同一个负载的配置多个VPA可能会出现行为不一致的现象。

创建VPA策略

  1. 使用kubectl连接集群,详情请参见通过kubectl连接集群
  2. 部署一个示例工作负载。如果已有工作负载可忽略本步骤。

    kubectl create -f hamster.yaml
    hamster.yaml文件内容如下:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hamster
    spec:
      selector:
        matchLabels:
          app: hamster
      replicas: 2
      template:
        metadata:
          labels:
            app: hamster
        spec:
          containers:
            - name: hamster
              image: registry.k8s.io/ubuntu-slim:0.1
              resources:
                requests:
                  cpu: 100m
                  memory: 50Mi
              command: ["/bin/sh"]
              args:
                - "-c"
                - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done" 

  3. 创建VPA任务。

    kubectl create -f hamster-vpa.yaml
    hamster-vpa.yaml文件内容如下:
    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: hamster-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: hamster
      updatePolicy:
        updateMode: "Off"
      resourcePolicy:
        containerPolicies:
          - containerName: '*'
            minAllowed:
              cpu: 100m
              memory: 50Mi
            maxAllowed:
              cpu: 1
              memory: 500Mi
            controlledResources: ["cpu", "memory"]
    表1 VPA关键字段说明

    字段

    是否必填

    说明

    spec.targetRef

    指定VPA负载对象。

    支持Deployment、Statefulset、Damonset等负载类型。

    spec.updatePolicy.updateMode

    VPA建议值动态更新策略,默认值为“Auto”。

    可选配置如下:

    • Off:仅生成建议值,不更新Pod资源申请量。
    • Recreate:生成建议值,并自动更新Pod资源申请量。
    • Initial:生成建议值,仅在Pod新建时更新资源申请量,不动态更新正在运行的Pod的资源申请量。
    • Auto:与Recreate配置策略行为一致。

    spec.resourcePolicy.containerPolicies

    为不同的容器指定的VPA策略、VPA资源上下限。详细参数说明请参见表2

    表2 containerPolicy关键字段说明

    字段

    是否必填

    说明

    containerName

    容器名称。

    minAllowed

    指定容器VPA资源下限,即VPA建议值不能低于该值。

    可选资源类型:

    • cpu
    • memory

    maxAllowed

    指定容器VPA资源上限,即VPA建议值不能高于该值。

    可选资源类型:

    • cpu
    • memory

    controlledResources

    指定容器VPA资源类型,默认值为["cpu", "memory"]。

    可选资源类型:

    • cpu
    • memory

    mode

    该容器的VPA策略是否生效,默认值为“Auto”。

    可配置值:

    • Auto:打开该容器的VPA策略。
    • Off:关闭该容器的VPA策略。

  4. 等待VPA生成资源期望值,执行以下命令查看VPA资源详情。

    kubectl get vpa hamster-vpa -oyaml

    回显如下:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: hamster-vpa
      namespace: default
    spec:
      resourcePolicy:
        containerPolicies:
        - containerName: '*'
          controlledResources:
          - cpu
          - memory
          maxAllowed:
            cpu: 1
            memory: 500Mi
          minAllowed:
            cpu: 100m
            memory: 50Mi
      targetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: hamster
      updatePolicy:
        updateMode: "Off"
    status:
      conditions:
      - lastTransitionTime: "2024-06-27T07:37:01Z"
        status: "True"
        type: RecommendationProvided
      recommendation:
        containerRecommendations:
        - containerName: hamster
          lowerBound:
            cpu: 475m
            memory: 262144k
          target:
            cpu: 587m
            memory: 262144k
          uncappedTarget:
            cpu: 587m
            memory: 262144k
          upperBound:
            cpu: 673m
            memory: 262144k

    其中status.recommendation字段为VPA给出的资源配置建议值。

    如果updateMode配置为“Auto”,该值会动态更新到正在运行的Pod资源申请配置上,将会导致Pod重建

    表3 containerRecommendation关键字段说明

    字段

    说明

    containerName

    VPA策略生效的容器名称。

    target

    VPA建议值,该值是结合了containerPolicy字段配置的资源上下限后的计算结果。

    VPA使用该值弹性配置Pod资源申请量。

    lowerBound

    VPA下限建议值。

    upperBound

    VPA上限建议值。

    uncappedTarget

    实际计算的VPA建议值,该值是未结合containerPolicy字段配置的资源上下限的计算结果。