×

OpenShift Container Platform垂直Pod自动缩放操作符(VPA)会自动检查Pod中容器的历史和当前CPU和内存资源,并可以根据它学习到的使用值更新资源限制和请求。VPA使用单独的自定义资源(CR)来更新与工作负载对象(例如DeploymentDeploymentConfigStatefulSetJobDaemonSetReplicaSetReplicationController)关联的所有Pod。

VPA帮助您了解Pod的最佳CPU和内存使用情况,并可以通过Pod生命周期自动维护Pod资源。

关于垂直Pod自动缩放操作符

垂直Pod自动缩放操作符(VPA)实现为API资源和自定义资源(CR)。CR确定VPA操作符应对项目中与特定工作负载对象(例如守护进程集、复制控制器等)关联的Pod采取的操作。

VPA操作符包含三个组件,每个组件在VPA命名空间中都有自己的Pod。

推荐器

VPA推荐器监控当前和过去的资源消耗,并根据这些数据确定关联工作负载对象中Pod的最佳CPU和内存资源。

更新程序

VPA更新程序检查关联工作负载对象中的Pod是否具有正确的资源。如果资源正确,更新程序不执行任何操作。如果资源不正确,更新程序将终止Pod,以便其控制器可以使用更新的请求重新创建它们。

准入控制器

VPA准入控制器在关联工作负载对象的每个新Pod上设置正确的资源请求,无论Pod是新的还是由于VPA更新程序操作而由其控制器重新创建。

您可以使用默认推荐器或使用您自己的替代推荐器来根据您自己的算法进行自动缩放。

默认推荐器会自动计算这些Pod中容器的历史和当前CPU和内存使用情况,并使用这些数据确定优化的资源限制和请求,以确保这些Pod始终高效运行。例如,默认推荐器建议减少请求的资源超过其使用的Pod的资源,并增加请求不足的Pod的资源。

然后,VPA会自动一次删除一个与这些建议不符的Pod,以便您的应用程序可以继续提供服务请求而不会出现停机。工作负载对象随后会使用原始资源限制和请求重新部署Pod。VPA使用变异准入Webhook在Pod被接纳到节点之前使用优化的资源限制和请求更新Pod。如果您不希望VPA删除Pod,您可以查看VPA资源限制和请求,并根据需要手动更新Pod。

默认情况下,工作负载对象必须至少指定两个副本才能使VPA自动删除其Pod。指定少于此最小值的副本数的工作负载对象不会被删除。如果您手动删除这些Pod,当工作负载对象重新部署Pod时,VPA确实会使用其建议更新新的Pod。您可以通过修改VerticalPodAutoscalerController对象来更改此最小值,如“更改VPA最小值”中所示。

例如,如果您有一个Pod使用了50%的CPU,但只请求了10%,则VPA会确定该Pod消耗的CPU超过了请求,并删除该Pod。工作负载对象(例如副本集)将重新启动Pod,VPA将使用其推荐的资源更新新Pod。

对于开发者而言,您可以使用垂直 Pod 自动伸缩器 (VPA) 来确保您的 Pod 在高需求期间保持运行,方法是将 Pod 调度到具有每个 Pod 适当资源的节点上。

管理员可以使用 VPA 来更好地利用集群资源,例如防止 Pod 预留超过需要的 CPU 资源。VPA 监控工作负载实际使用的资源,并调整资源需求,以便为其他工作负载提供可用容量。VPA 还维护初始容器配置中指定的限制和请求之间的比率。

如果您停止运行 VPA 或删除集群中特定的 VPA CR,则 VPA 已修改的 Pod 的资源请求不会更改。任何新的 Pod 都将获得工作负载对象中定义的资源,而不是 VPA 之前提供的建议。

安装垂直 Pod 自动伸缩器操作符

您可以使用 OpenShift Container Platform Web 控制台安装垂直 Pod 自动伸缩器操作符 (VPA)。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,单击**操作符** → **OperatorHub**。

  2. 从可用操作符列表中选择**VerticalPodAutoscaler**,然后单击**安装**。

  3. 在**安装操作符**页面上,确保选中**操作符推荐的命名空间**选项。这会将操作符安装到强制性的 `openshift-vertical-pod-autoscaler` 命名空间中,如果该命名空间不存在,则会自动创建。

  4. 单击**安装**。

验证
  1. 通过列出 VPA 操作符组件来验证安装

    1. 导航到**工作负载** → **Pod**。

    2. 从下拉菜单中选择 `openshift-vertical-pod-autoscaler` 项目,并验证是否有四个 Pod 正在运行。

    3. 导航到**工作负载** → **部署**,以验证是否有四个部署正在运行。

  2. 可选:使用以下命令在 OpenShift Container Platform CLI 中验证安装

    $ oc get all -n openshift-vertical-pod-autoscaler

    输出显示四个 Pod 和四个部署

    示例输出
    NAME                                                    READY   STATUS    RESTARTS   AGE
    pod/vertical-pod-autoscaler-operator-85b4569c47-2gmhc   1/1     Running   0          3m13s
    pod/vpa-admission-plugin-default-67644fc87f-xq7k9       1/1     Running   0          2m56s
    pod/vpa-recommender-default-7c54764b59-8gckt            1/1     Running   0          2m56s
    pod/vpa-updater-default-7f6cc87858-47vw9                1/1     Running   0          2m56s
    
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    service/vpa-webhook   ClusterIP   172.30.53.206   <none>        443/TCP   2m56s
    
    NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/vertical-pod-autoscaler-operator   1/1     1            1           3m13s
    deployment.apps/vpa-admission-plugin-default       1/1     1            1           2m56s
    deployment.apps/vpa-recommender-default            1/1     1            1           2m56s
    deployment.apps/vpa-updater-default                1/1     1            1           2m56s
    
    NAME                                                          DESIRED   CURRENT   READY   AGE
    replicaset.apps/vertical-pod-autoscaler-operator-85b4569c47   1         1         1       3m13s
    replicaset.apps/vpa-admission-plugin-default-67644fc87f       1         1         1       2m56s
    replicaset.apps/vpa-recommender-default-7c54764b59            1         1         1       2m56s
    replicaset.apps/vpa-updater-default-7f6cc87858                1         1         1       2m56s

移动垂直 Pod 自动伸缩器操作符组件

垂直 Pod 自动伸缩器操作符 (VPA) 和每个组件在控制平面节点上的 VPA 命名空间中都有其自己的 Pod。您可以通过向 VPA 订阅和 `VerticalPodAutoscalerController` CR 添加节点选择器,将 VPA 操作符和组件 Pod 移动到基础设施节点或工作节点。

您可以创建并使用基础设施节点来仅托管基础设施组件,例如默认路由器、集成容器镜像注册表以及集群指标和监控组件。这些基础设施节点不计入运行环境所需的订阅总数。有关更多信息,请参见《创建基础设施机器集》。

您可以根据组织的需要将组件移动到同一节点或单独的节点。

以下示例显示 VPA Pod 到控制平面节点的默认部署。

示例输出
NAME                                                READY   STATUS    RESTARTS   AGE     IP            NODE                  NOMINATED NODE   READINESS GATES
vertical-pod-autoscaler-operator-6c75fcc9cd-5pb6z   1/1     Running   0          7m59s   10.128.2.24   c416-tfsbj-master-1   <none>           <none>
vpa-admission-plugin-default-6cb78d6f8b-rpcrj       1/1     Running   0          5m37s   10.129.2.22   c416-tfsbj-master-1   <none>           <none>
vpa-recommender-default-66846bd94c-dsmpp            1/1     Running   0          5m37s   10.129.2.20   c416-tfsbj-master-0   <none>           <none>
vpa-updater-default-db8b58df-2nkvf                  1/1     Running   0          5m37s   10.129.2.21   c416-tfsbj-master-1   <none>           <none>
步骤
  1. 通过向 VPA 操作符的 `Subscription` 自定义资源 (CR) 添加节点选择器来移动 VPA 操作符 Pod

    1. 编辑 CR

      $ oc edit Subscription vertical-pod-autoscaler -n openshift-vertical-pod-autoscaler
    2. 添加节点选择器以匹配要在其上安装 VPA 操作符 Pod 的节点上的节点角色标签

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        labels:
          operators.coreos.com/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler: ""
        name: vertical-pod-autoscaler
      # ...
      spec:
        config:
          nodeSelector:
            node-role.kubernetes.io/<node_role>: "" (1)
      1 指定要在其上移动 VPA 操作符 Pod 的节点的节点角色。

      如果基础设施节点使用污点,则需要向 `Subscription` CR 添加容忍。

      例如

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        labels:
          operators.coreos.com/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler: ""
        name: vertical-pod-autoscaler
      # ...
      spec:
        config:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          tolerations: (1)
          - key: "node-role.kubernetes.io/infra"
            operator: "Exists"
            effect: "NoSchedule"
      1 指定要在其上移动 VPA 操作符 Pod 的节点上的污点的容忍。
  2. 通过向 `VerticalPodAutoscaler` 自定义资源 (CR) 添加节点选择器来移动每个 VPA 组件

    1. 编辑 CR

      $ oc edit VerticalPodAutoscalerController default -n openshift-vertical-pod-autoscaler
    2. 添加节点选择器以匹配要在其上安装 VPA 组件的节点上的节点角色标签

      apiVersion: autoscaling.openshift.io/v1
      kind: VerticalPodAutoscalerController
      metadata:
       name: default
        namespace: openshift-vertical-pod-autoscaler
      # ...
      spec:
        deploymentOverrides:
          admission:
            container:
              resources: {}
            nodeSelector:
              node-role.kubernetes.io/<node_role>: "" (1)
          recommender:
            container:
              resources: {}
            nodeSelector:
              node-role.kubernetes.io/<node_role>: "" (2)
          updater:
            container:
              resources: {}
            nodeSelector:
              node-role.kubernetes.io/<node_role>: "" (3)
      1 可选:指定 VPA 准入 Pod 的节点角色。
      2 可选:指定 VPA 推荐器 Pod 的节点角色。
      3 可选:指定 VPA 更新器 Pod 的节点角色。

      如果目标节点使用污点,则需要向 `VerticalPodAutoscalerController` CR 添加容忍。

      例如

      apiVersion: autoscaling.openshift.io/v1
      kind: VerticalPodAutoscalerController
      metadata:
       name: default
        namespace: openshift-vertical-pod-autoscaler
      # ...
      spec:
        deploymentOverrides:
          admission:
            container:
              resources: {}
            nodeSelector:
              node-role.kubernetes.io/worker: ""
            tolerations: (1)
            - key: "my-example-node-taint-key"
              operator: "Exists"
              effect: "NoSchedule"
          recommender:
            container:
              resources: {}
            nodeSelector:
              node-role.kubernetes.io/worker: ""
            tolerations: (2)
            - key: "my-example-node-taint-key"
              operator: "Exists"
              effect: "NoSchedule"
          updater:
            container:
              resources: {}
            nodeSelector:
              node-role.kubernetes.io/worker: ""
            tolerations: (3)
            - key: "my-example-node-taint-key"
              operator: "Exists"
              effect: "NoSchedule"
      1 指定要在其上安装 Pod 的节点上的污点的准入控制器 Pod 的容忍。
      2 指定要在其上安装 Pod 的节点上的污点的推荐器 Pod 的容忍。
      3 指定要在其上安装 Pod 的节点上的污点的更新器 Pod 的容忍。
验证
  • 您可以使用以下命令验证 Pod 是否已移动

    $ oc get pods -n openshift-vertical-pod-autoscaler -o wide

    Pod 不再部署到控制平面节点。

    示例输出
    NAME                                                READY   STATUS    RESTARTS   AGE     IP            NODE                              NOMINATED NODE   READINESS GATES
    vertical-pod-autoscaler-operator-6c75fcc9cd-5pb6z   1/1     Running   0          7m59s   10.128.2.24   c416-tfsbj-infra-eastus3-2bndt   <none>           <none>
    vpa-admission-plugin-default-6cb78d6f8b-rpcrj       1/1     Running   0          5m37s   10.129.2.22   c416-tfsbj-infra-eastus1-lrgj8   <none>           <none>
    vpa-recommender-default-66846bd94c-dsmpp            1/1     Running   0          5m37s   10.129.2.20   c416-tfsbj-infra-eastus1-lrgj8   <none>           <none>
    vpa-updater-default-db8b58df-2nkvf                  1/1     Running   0          5m37s   10.129.2.21   c416-tfsbj-infra-eastus1-lrgj8   <none>           <none>

关于使用垂直 Pod 自动伸缩器操作符

要使用垂直 Pod 自动伸缩器操作符 (VPA),您需要为集群中的工作负载对象创建一个 VPA 自定义资源 (CR)。VPA 会学习并应用与该工作负载对象关联的 Pod 的最佳 CPU 和内存资源。您可以将 VPA 与部署、有状态集、作业、守护程序集、副本集或复制控制器工作负载对象一起使用。VPA CR 必须与要监控的 Pod 位于同一项目中。

您可以使用 VPA CR 来关联工作负载对象并指定 VPA 的运行模式

  • `Auto` 和 `Recreate` 模式会在整个 Pod 生命周期中自动应用 VPA CPU 和内存建议。VPA 会删除项目中与建议不符的任何 Pod。当工作负载对象重新部署时,VPA 会使用其建议更新新的 Pod。

  • `Initial` 模式仅在 Pod 创建时自动应用 VPA 建议。

  • `Off` 模式仅提供推荐的资源限制和请求,允许您手动应用建议。`off` 模式不会更新 Pod。

您还可以使用 CR 将某些容器排除在 VPA 评估和更新之外。

例如,一个 Pod 具有以下限制和请求

resources:
  limits:
    cpu: 1
    memory: 500Mi
  requests:
    cpu: 500m
    memory: 100Mi

创建设置为 `auto` 的 VPA 后,VPA 会学习资源使用情况并删除 Pod。重新部署时,Pod 将使用新的资源限制和请求

resources:
  limits:
    cpu: 50m
    memory: 1250Mi
  requests:
    cpu: 25m
    memory: 262144k

您可以使用以下命令查看 VPA 建议

$ oc get vpa <vpa-name> --output yaml

几分钟后,输出将显示 CPU 和内存请求的建议,类似于以下内容

示例输出
...
status:
...
  recommendation:
    containerRecommendations:
    - containerName: frontend
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      uncappedTarget:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 262m
        memory: "274357142"
    - containerName: backend
      lowerBound:
        cpu: 12m
        memory: 131072k
      target:
        cpu: 12m
        memory: 131072k
      uncappedTarget:
        cpu: 12m
        memory: 131072k
      upperBound:
        cpu: 476m
        memory: "498558823"
...

输出显示推荐的资源 `target`、最低推荐资源 `lowerBound`、最高推荐资源 `upperBound` 和最新的资源建议 `uncappedTarget`。

VPA 使用 `lowerBound` 和 `upperBound` 值来确定是否需要更新 Pod。如果 Pod 的资源请求低于 `lowerBound` 值或高于 `upperBound` 值,VPA 将终止并使用 `target` 值重新创建 Pod。

更改 VPA 最小值

默认情况下,工作负载对象必须指定至少两个副本才能使 VPA 自动删除和更新其 Pod。因此,指定少于两个副本的工作负载对象不会被 VPA 自动处理。如果 Pod 被 VPA 之外的某些进程重新启动,则 VPA 会更新来自这些工作负载对象的新 Pod。您可以通过修改 `VerticalPodAutoscalerController` 自定义资源 (CR) 中的 `minReplicas` 参数来更改此集群范围的最小值。

例如,如果您将 `minReplicas` 设置为 `3`,则 VPA 不会删除和更新为指定少于三个副本的工作负载对象。

如果将minReplicas设置为1,则 VPA 可能会删除仅指定一个副本的工作负载对象的唯一 Pod。只有在您的工作负载能够承受 VPA 删除 Pod 以调整其资源时带来的任何停机时间的情况下,才应将此设置与单副本对象一起使用。为了避免单副本对象出现意外停机,请将 VPA CR 的podUpdatePolicy设置为Initial,这会仅在 Pod 被 VPA 外部的一些进程重启时自动更新 Pod,或者设置为Off,这允许您在适合您的应用程序的时间手动更新 Pod。

VerticalPodAutoscalerController 对象示例
apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
  creationTimestamp: "2021-04-21T19:29:49Z"
  generation: 2
  name: default
  namespace: openshift-vertical-pod-autoscaler
  resourceVersion: "142172"
  uid: 180e17e9-03cc-427f-9955-3b4d7aeb2d59
spec:
  minReplicas: 3 (1)
  podMinCPUMillicores: 25
  podMinMemoryMb: 250
  recommendationOnly: false
  safetyMarginFraction: 0.15
1 指定 VPA 要对其进行操作的工作负载对象中的最小副本数。任何副本数少于最小副本数的对象都不会被 VPA 自动删除。

自动应用 VPA 建议

要使用 VPA 自动更新 Pod,请为特定工作负载对象创建 VPA CR,并将updateMode设置为AutoRecreate

为工作负载对象创建 Pod 后,VPA 会持续监控容器以分析其 CPU 和内存需求。VPA 会删除任何不符合 VPA 对 CPU 和内存建议的 Pod。重新部署时,Pod 将根据 VPA 建议使用新的资源限制和请求,遵守为您的应用程序设置的任何 Pod 中断预算。这些建议会添加到 VPA CR 的status字段中以供参考。

默认情况下,工作负载对象必须至少指定两个副本才能使VPA自动删除其Pod。指定少于此最小值的副本数的工作负载对象不会被删除。如果您手动删除这些Pod,当工作负载对象重新部署Pod时,VPA确实会使用其建议更新新的Pod。您可以通过修改VerticalPodAutoscalerController对象来更改此最小值,如“更改VPA最小值”中所示。

Auto模式下的 VPA CR 示例
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment (1)
    name:       frontend (2)
  updatePolicy:
    updateMode: "Auto" (3)
1 您希望此 VPA CR 管理的工作负载对象类型。
2 您希望此 VPA CR 管理的工作负载对象的名称。
3 将模式设置为AutoRecreate
  • Auto。VPA 在 Pod 创建时分配资源请求,并在请求资源与新的建议存在显著差异时通过终止它们来更新现有 Pod。

  • Recreate。VPA 在 Pod 创建时分配资源请求,并在请求资源与新的建议存在显著差异时通过终止它们来更新现有 Pod。此模式应很少使用,仅当您需要确保在资源请求更改时重新启动 Pod 时才使用。

在 VPA 能够确定资源建议并将推荐的资源应用于新 Pod 之前,必须存在并运行操作 Pod。

如果工作负载的资源使用情况(例如 CPU 和内存)一致,则 VPA 可以在几分钟内确定资源建议。如果工作负载的资源使用情况不一致,则 VPA 必须在不同的资源使用间隔收集指标,才能做出准确的建议。

在 Pod 创建时自动应用 VPA 建议

要仅在首次部署 Pod 时使用 VPA 应用推荐的资源,请为特定工作负载对象创建 VPA CR,并将updateMode设置为Initial

然后,手动删除与您要使用 VPA 建议的工作负载对象关联的任何 Pod。在Initial模式下,VPA 不会删除 Pod,也不会在学习新的资源建议时更新 Pod。

Initial模式下的 VPA CR 示例
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment (1)
    name:       frontend (2)
  updatePolicy:
    updateMode: "Initial" (3)
1 您希望此 VPA CR 管理的工作负载对象类型。
2 您希望此 VPA CR 管理的工作负载对象的名称。
3 将模式设置为Initial。VPA 在创建 Pod 时分配资源,并且在 Pod 的生命周期内不会更改资源。

在 VPA 能够确定推荐的资源并将建议应用于新 Pod 之前,必须存在并运行操作 Pod。

为了获得 VPA 最准确的建议,请至少等待 8 天让 Pod 运行并让 VPA 稳定。

手动应用 VPA 建议

要仅使用 VPA 确定推荐的 CPU 和内存值,请为特定工作负载对象创建 VPA CR,并将updateMode设置为off

为该工作负载对象创建 Pod 后,VPA 会分析容器的 CPU 和内存需求,并将这些建议记录在 VPA CR 的status字段中。VPA 在确定新的资源建议时不会更新 Pod。

Off模式下的 VPA CR 示例
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment (1)
    name:       frontend (2)
  updatePolicy:
    updateMode: "Off" (3)
1 您希望此 VPA CR 管理的工作负载对象类型。
2 您希望此 VPA CR 管理的工作负载对象的名称。
3 将模式设置为Off

您可以使用以下命令查看建议。

$ oc get vpa <vpa-name> --output yaml

有了这些建议,您可以编辑工作负载对象以添加 CPU 和内存请求,然后使用推荐的资源删除并重新部署 Pod。

在 VPA 能够确定推荐的资源并将建议应用于新 Pod 之前,必须存在并运行操作 Pod。

为了获得 VPA 最准确的建议,请至少等待 8 天让 Pod 运行并让 VPA 稳定。

豁免容器应用 VPA 建议

如果您的工作负载对象具有多个容器,并且您不希望 VPA 评估和处理所有容器,请为特定工作负载对象创建 VPA CR 并添加resourcePolicy以选择退出特定容器。

当 VPA 使用推荐的资源更新 Pod 时,任何具有resourcePolicy的容器都不会被更新,并且 VPA 不会在 Pod 中显示这些容器的建议。

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment (1)
    name:       frontend (2)
  updatePolicy:
    updateMode: "Auto" (3)
  resourcePolicy: (4)
    containerPolicies:
    - containerName: my-opt-sidecar
      mode: "Off"
1 您希望此 VPA CR 管理的工作负载对象类型。
2 您希望此 VPA CR 管理的工作负载对象的名称。
3 将模式设置为AutoRecreateOffRecreate模式应很少使用,仅当您需要确保在资源请求更改时重新启动 Pod 时才使用。
4 指定您要选择退出的容器并将mode设置为Off

例如,一个 Pod 具有两个容器,相同的资源请求和限制

# ...
spec:
  containers:
  - name: frontend
    resources:
      limits:
        cpu: 1
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
  - name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
# ...

在启动带有设置为选择退出的backend容器的 VPA CR 后,VPA 将终止并重新创建 Pod,仅将推荐的资源应用于frontend容器

...
spec:
  containers:
    name: frontend
    resources:
      limits:
        cpu: 50m
        memory: 1250Mi
      requests:
        cpu: 25m
        memory: 262144k
...
    name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
...

性能调整 VPA 运算符

作为集群管理员,您可以调整垂直 Pod 自动缩放器运算符 (VPA) 的性能,以限制 VPA 对 Kubernetes API 服务器发出请求的速率,并为 VPA 推荐器、更新器和准入控制器组件 Pod 指定 CPU 和内存资源。

此外,您可以配置 VPA 运算符仅监控由 VPA 自定义资源 (CR) 管理的工作负载。默认情况下,VPA 运算符会监控集群中的每个工作负载。这允许 VPA 运算符累积并存储所有工作负载的 8 天历史数据,如果为工作负载创建新的 VPA CR,运算符可以使用这些数据。但是,这会导致 VPA 运算符使用大量的 CPU 和内存,这可能会导致运算符失败,尤其是在较大的集群中。通过将 VPA 运算符配置为仅监控具有 VPA CR 的工作负载,您可以节省 CPU 和内存资源。一个权衡是,如果您有一个一直在运行的工作负载,并且您创建了一个 VPA CR 来管理该工作负载,则 VPA 运算符没有任何该工作负载的历史数据。因此,初始建议不如工作负载运行一段时间后的建议有用。

这些调整允许您确保 VPA 拥有足够的资源以最佳效率运行,并防止限制和 Pod 准入的潜在延迟。

您可以通过编辑VerticalPodAutoscalerController自定义资源 (CR) 来对 VPA 组件执行以下调整

  • 为了防止限制和 Pod 准入延迟,请使用kube-api-qpskube-api-burst参数设置 VPA 对 Kubernetes API 服务器请求的每秒查询数 (QPS) 和突发速率。

  • 为了确保足够的 CPU 和内存,请使用标准的cpumemory资源请求设置 VPA 组件 Pod 的 CPU 和内存请求。

  • 要将 VPA 运算符配置为仅监控由 VPA CR 管理的工作负载,请为推荐器组件将memory-saver参数设置为true

下面的 VPA 控制器 CR 示例设置了 VPA API QPS 和突发速率,配置了组件 Pod 资源请求,并将推荐器的memory-saver设置为true

示例 VerticalPodAutoscalerController CR
apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
  name: default
  namespace: openshift-vertical-pod-autoscaler
spec:
  deploymentOverrides:
    admission: (1)
      container:
        args: (2)
          - '--kube-api-qps=30.0'
          - '--kube-api-burst=40.0'
        resources:
          requests: (3)
            cpu: 40m
            memory: 40Mi
    recommender: (4)
      container:
        args:
          - '--kube-api-qps=20.0'
          - '--kube-api-burst=60.0'
          - '--memory-saver=true' (5)
        resources:
          requests:
            cpu: 60m
            memory: 60Mi
    updater: (6)
      container:
        args:
          - '--kube-api-qps=20.0'
          - '--kube-api-burst=80.0'
        resources:
          requests:
            cpu: 80m
            memory: 80Mi
  minReplicas: 2
  podMinCPUMillicores: 25
  podMinMemoryMb: 250
  recommendationOnly: false
  safetyMarginFraction: 0.15
1 指定 VPA 准入控制器的调整参数。
2 指定 VPA 准入控制器的 API QPS 和突发速率。
  • kube-api-qps:指定向 Kubernetes API 服务器发出请求时的每秒查询数 (QPS) 限制。默认值为 5.0

  • kube-api-burst:指定向 Kubernetes API 服务器发出请求时的突发限制。默认值为 10.0

3 指定 VPA 准入控制器 Pod 的 CPU 和内存请求。
4 指定 VPA 推荐器的调整参数。
5 指定 VPA 运算符仅监控具有 VPA CR 的工作负载。默认值为 false
6 指定 VPA 更新器的调整参数。

您可以验证设置是否已应用于每个 VPA 组件 Pod。

示例更新器 Pod
apiVersion: v1
kind: Pod
metadata:
  name: vpa-updater-default-d65ffb9dc-hgw44
  namespace: openshift-vertical-pod-autoscaler
# ...
spec:
  containers:
  - args:
    - --logtostderr
    - --v=1
    - --min-replicas=2
    - --kube-api-qps=20.0
    - --kube-api-burst=80.0
# ...
    resources:
      requests:
        cpu: 80m
        memory: 80Mi
# ...
示例准入控制器 Pod
apiVersion: v1
kind: Pod
metadata:
  name: vpa-admission-plugin-default-756999448c-l7tsd
  namespace: openshift-vertical-pod-autoscaler
# ...
spec:
  containers:
  - args:
    - --logtostderr
    - --v=1
    - --tls-cert-file=/data/tls-certs/tls.crt
    - --tls-private-key=/data/tls-certs/tls.key
    - --client-ca-file=/data/tls-ca-certs/service-ca.crt
    - --webhook-timeout-seconds=10
    - --kube-api-qps=30.0
    - --kube-api-burst=40.0
# ...
    resources:
      requests:
        cpu: 40m
        memory: 40Mi
# ...
示例推荐器 Pod
apiVersion: v1
kind: Pod
metadata:
  name: vpa-recommender-default-74c979dbbc-znrd2
  namespace: openshift-vertical-pod-autoscaler
# ...
spec:
  containers:
  - args:
    - --logtostderr
    - --v=1
    - --recommendation-margin-fraction=0.15
    - --pod-recommendation-min-cpu-millicores=25
    - --pod-recommendation-min-memory-mb=250
    - --kube-api-qps=20.0
    - --kube-api-burst=60.0
    - --memory-saver=true
# ...
    resources:
      requests:
        cpu: 60m
        memory: 60Mi
# ...

使用替代推荐器

您可以使用您自己的推荐器根据您自己的算法进行自动缩放。如果您没有指定替代推荐器,OpenShift Container Platform 将使用默认推荐器,该推荐器根据历史使用情况建议 CPU 和内存请求。由于没有适用于所有类型工作负载的通用推荐策略,您可能需要为特定工作负载创建和部署不同的推荐器。

例如,当容器表现出某些资源行为(例如,监控应用程序使用的交替使用峰值和空闲的循环模式,或深度学习应用程序使用的重复模式)时,默认推荐器可能无法准确预测未来的资源使用情况。对这些使用行为使用默认推荐器可能会导致您的应用程序出现严重的过度配置和内存不足 (OOM) 终止。

创建推荐器的说明不在本文档的范围之内。

步骤

要为您的 Pod 使用替代推荐器

  1. 为替代推荐器创建一个服务帐户,并将该服务帐户绑定到所需的集群角色。

    apiVersion: v1 (1)
    kind: ServiceAccount
    metadata:
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    ---
    apiVersion: rbac.authorization.k8s.io/v1 (2)
    kind: ClusterRoleBinding
    metadata:
      name: system:example-metrics-reader
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:metrics-reader
    subjects:
    - kind: ServiceAccount
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    ---
    apiVersion: rbac.authorization.k8s.io/v1 (3)
    kind: ClusterRoleBinding
    metadata:
      name: system:example-vpa-actor
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-actor
    subjects:
    - kind: ServiceAccount
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    ---
    apiVersion: rbac.authorization.k8s.io/v1 (4)
    kind: ClusterRoleBinding
    metadata:
      name: system:example-vpa-target-reader-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-target-reader
    subjects:
    - kind: ServiceAccount
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    1 在部署推荐器的命名空间中创建一个服务帐户。
    2 将推荐器服务帐户绑定到 metrics-reader 角色。指定要部署推荐器的命名空间。
    3 将推荐器服务帐户绑定到 vpa-actor 角色。指定要部署推荐器的命名空间。
    4 将推荐器服务帐户绑定到 vpa-target-reader 角色。指定要部署推荐器的命名空间。
  2. 要将替代推荐器添加到集群,请创建一个类似于以下内容的 Deployment 对象

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alt-vpa-recommender
      namespace: <namespace_name>
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: alt-vpa-recommender
      template:
        metadata:
          labels:
            app: alt-vpa-recommender
        spec:
          containers: (1)
          - name: recommender
            image: quay.io/example/alt-recommender:latest (2)
            imagePullPolicy: Always
            resources:
              limits:
                cpu: 200m
                memory: 1000Mi
              requests:
                cpu: 50m
                memory: 500Mi
            ports:
            - name: prometheus
              containerPort: 8942
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop:
                  - ALL
              seccompProfile:
                type: RuntimeDefault
          serviceAccountName: alt-vpa-recommender-sa (3)
          securityContext:
            runAsNonRoot: true
    1 为您的替代推荐器创建一个容器。
    2 指定您的推荐器镜像。
    3 关联您为推荐器创建的服务帐户。

    将在同一命名空间中为替代推荐器创建一个新的 Pod。

    $ oc get pods
    示例输出
    NAME                                        READY   STATUS    RESTARTS   AGE
    frontend-845d5478d-558zf                    1/1     Running   0          4m25s
    frontend-845d5478d-7z9gx                    1/1     Running   0          4m25s
    frontend-845d5478d-b7l4j                    1/1     Running   0          4m25s
    vpa-alt-recommender-55878867f9-6tp5v        1/1     Running   0          9s
  3. 配置包含替代推荐器 Deployment 对象名称的 VPA CR。

    包含替代推荐器的示例 VPA CR
    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: vpa-recommender
      namespace: <namespace_name>
    spec:
      recommenders:
        - name: alt-vpa-recommender (1)
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment (2)
        name:       frontend
    1 指定替代推荐器部署的名称。
    2 指定您希望此 VPA 管理的现有工作负载对象的名称。

使用垂直 Pod 自动缩放器运算符

您可以通过创建 VPA 自定义资源 (CR) 来使用垂直 Pod 自动缩放器运算符 (VPA)。CR 指示它应该分析哪些 Pod,并确定 VPA 应该对这些 Pod 执行的操作。

先决条件
  • 您想要自动缩放的工作负载对象必须存在。

  • 如果您想使用替代推荐器,则必须存在包含该推荐器的部署。

步骤

为特定工作负载对象创建 VPA CR

  1. 切换到您要缩放的工作负载对象所在的项目。

    1. 创建一个 VPA CR YAML 文件

      apiVersion: autoscaling.k8s.io/v1
      kind: VerticalPodAutoscaler
      metadata:
        name: vpa-recommender
      spec:
        targetRef:
          apiVersion: "apps/v1"
          kind:       Deployment (1)
          name:       frontend (2)
        updatePolicy:
          updateMode: "Auto" (3)
        resourcePolicy: (4)
          containerPolicies:
          - containerName: my-opt-sidecar
            mode: "Off"
        recommenders: (5)
          - name: my-recommender
      1 指定您希望此 VPA 管理的工作负载对象的类型:DeploymentStatefulSetJobDaemonSetReplicaSetReplicationController
      2 指定您希望此 VPA 管理的现有工作负载对象的名称。
      3 指定 VPA 模式
      • auto 自动将推荐的资源应用于与控制器关联的 Pod。VPA 将终止现有 Pod 并创建具有推荐资源限制和请求的新 Pod。

      • recreate 自动将推荐的资源应用于与工作负载对象关联的 Pod。VPA 将终止现有 Pod 并创建具有推荐资源限制和请求的新 Pod。recreate 模式应该很少使用,只有当您需要确保在资源请求更改时重新启动 Pod 时才使用。

      • initial 自动在与工作负载对象关联的 Pod 创建时应用推荐的资源。VPA 在学习新的资源建议时不会更新 Pod。

      • off 仅为与工作负载对象关联的 Pod 生成资源建议。VPA 在学习新的资源建议时不会更新 Pod,也不会将建议应用于新的 Pod。

      4 可选。指定您想要选择退出的容器并将模式设置为 Off
      5 可选。指定替代推荐器。
    2. 创建 VPA CR

      $ oc create -f <file-name>.yaml

      片刻之后,VPA 将学习与工作负载对象关联的 Pod 中容器的资源使用情况。

      您可以使用以下命令查看 VPA 建议

      $ oc get vpa <vpa-name> --output yaml

      输出显示 CPU 和内存请求的建议,类似于以下内容

      示例输出
      ...
      status:
      
      ...
      
        recommendation:
          containerRecommendations:
          - containerName: frontend
            lowerBound: (1)
              cpu: 25m
              memory: 262144k
            target: (2)
              cpu: 25m
              memory: 262144k
            uncappedTarget: (3)
              cpu: 25m
              memory: 262144k
            upperBound: (4)
              cpu: 262m
              memory: "274357142"
          - containerName: backend
            lowerBound:
              cpu: 12m
              memory: 131072k
            target:
              cpu: 12m
              memory: 131072k
            uncappedTarget:
              cpu: 12m
              memory: 131072k
            upperBound:
              cpu: 476m
              memory: "498558823"
      
      ...
      1 lowerBound 是最低推荐资源级别。
      2 target 是推荐的资源级别。
      3 upperBound 是最高的推荐资源级别。
      4 uncappedTarget 是最新的资源建议。

卸载垂直 Pod 自动缩放器运算符

您可以从 OpenShift Container Platform 集群中删除垂直 Pod 自动缩放器运算符 (VPA)。卸载后,现有 VPA CR 已修改的 Pod 的资源请求不会更改。任何新的 Pod 都将获得工作负载对象中定义的资源,而不是垂直 Pod 自动缩放器运算符之前做出的建议。

您可以使用 oc delete vpa <vpa-name> 命令删除特定的 VPA CR。对于资源请求,与卸载垂直 Pod 自动缩放器相同的操作适用。

删除 VPA 运算符后,建议您删除与运算符关联的其他组件,以避免潜在问题。

先决条件
  • 必须安装垂直 Pod 自动缩放器运算符。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,单击**运算符** → **已安装的运算符**。

  2. 切换到 openshift-vertical-pod-autoscaler 项目。

  3. 对于**垂直 Pod 自动伸缩器 (VerticalPodAutoscaler)** 运算符,单击“选项”菜单kebab 并选择**卸载运算符**。

  4. 可选:要删除与运算符关联的所有操作数,请在对话框中选中**删除此运算符的所有操作数实例**复选框。

  5. 单击**卸载**。

  6. 可选:使用 OpenShift CLI 删除 VPA 组件

    1. 删除 VPA 命名空间

      $ oc delete namespace openshift-vertical-pod-autoscaler
    2. 删除 VPA 自定义资源定义 (CRD) 对象

      $ oc delete crd verticalpodautoscalercheckpoints.autoscaling.k8s.io
      $ oc delete crd verticalpodautoscalercontrollers.autoscaling.openshift.io
      $ oc delete crd verticalpodautoscalers.autoscaling.k8s.io

      删除 CRD 将删除关联的角色、集群角色和角色绑定。

      此操作将从集群中删除所有用户创建的 VPA CR。如果重新安装 VPA,则必须重新创建这些对象。

    3. 运行以下命令删除MutatingWebhookConfiguration 对象

      $ oc delete MutatingWebhookConfiguration vpa-webhook-config
    4. 删除 VPA 运算符

      $ oc delete operator/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler