添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文概述 Azure Kubernetes 服务 (AKS) 中基于开源 Kubernetes 版本的垂直 Pod 自动缩放程序 (VPA)(预览版)。 配置该程序后,它将根据过去的使用量自动设置每个工作负载中容器的资源请求和限制。 VPA 可使某些 Pod 调度到具有所需 CPU 和内存资源的节点上。

垂直 Pod 自动缩放程序提供以下优势:

  • 分析应用程序所需的处理器和内存资源并将其调整为合适的大小。 VPA 不仅会根据一段时间内的资源使用量负责纵向扩展,而且还负责纵向缩减。

  • 如果某个 Pod 的缩放模式设置为“自动”或“重新创建”,当它需要更改其资源请求时,将逐出该 Pod。

  • 通过指定资源策略为单个容器设置 CPU 和内存限制

  • 确保节点中有适当的资源用于 Pod 调度

  • 对处理器或内存资源所做调整的日志记录可配置

  • 提高群集资源利用率并为其他 Pod 释放 CPU 和内存。

  • 垂直 Pod 自动缩放支持每个群集上的最多 500 个 VerticalPodAutoscaler 对象。
  • 在此预览版中,无法更改 managedCluster 对象的 controlledValue updateMode
  • 在开始之前

  • AKS 群集正在运行 Kubernetes 版本 1.24 和更高版本。

  • 安装并配置了 Azure CLI 版本 2.0.64 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅 安装 Azure CLI

  • kubectl 应连接到要安装 VPA 的群集。

    API 对象

    垂直 Pod 自动缩放程序是 Kubernetes 自动缩放 API 组中的一个 API 资源。 此预览版支持的版本是 0.11,可在 Kubernetes 自动缩放程序存储库 中找到。

    安装 aks-preview Azure CLI 扩展

    AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

  • AKS 支持策略
  • Azure 支持常见问题解答
  • 若要安装 aks-preview 扩展,请运行以下命令:

    az extension add --name aks-preview
    

    运行以下命令以更新到已发布的最新扩展版本:

    az extension update --name aks-preview
    

    注册“AKS-VPAPreview”功能标志

    使用 AKS-VPAPreview 命令注册 AKS-VPAPreview 功能标志,如以下示例所示:

    az feature register --namespace "Microsoft.ContainerService" --name "AKS-VPAPreview"
    

    状态显示为“已注册”需要几分钟时间。 使用 az feature show 命令验证注册状态:

    az feature show --namespace "Microsoft.ContainerService" --name "AKS-VPAPreview"
    

    当状态反映为“已注册”时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册:

    az provider register --namespace Microsoft.ContainerService
    

    在群集上部署、升级或禁用 VPA

    本部分介绍如何在群集上部署、升级或禁用垂直 Pod 自动缩放程序。

  • 若要在新群集上启用 VPA,请将 --enable-vpa 参数与 az aks create 命令结合使用。

    az aks create -n myAKSCluster -g myResourceGroup --enable-vpa
    

    片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。

  • (可选)若要在现有群集上启用 VPA,请将 --enable-vpaaz aks upgrade 命令结合使用。

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa
    

    片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。

  • (可选)若要在现有群集上禁用 VPA,请将 --disable-vpaaz aks upgrade 命令结合使用。

    az aks update -n myAKSCluster -g myResourceGroup --disable-vpa
    

    片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。

  • 若要验证垂直 Pod 自动缩放程序 Pod 是否已成功创建,请使用 kubectl get 命令。

    kubectl get pods -n kube-system
    

    该命令的输出包括以下特定于 VPA Pod 的结果。 Pod 应显示 running 状态。

    NAME                                        READY   STATUS    RESTARTS   AGE
    vpa-admission-controller-7867874bc5-vjfxk   1/1     Running   0          41m
    vpa-recommender-5fd94767fb-ggjr2            1/1     Running   0          41m
    vpa-updater-56f9bfc96f-jgq2g                1/1     Running   0          41m
    

    测试垂直 Pod 自动缩放程序安装

    以下步骤将创建包含两个 Pod 的部署,其中每个 Pod 运行单个容器,该容器请求 100 个毫核,并尝试利用数量略高于 500 的毫核。 这些步骤还会创建一个指向部署的 VPA 配置。 VPA 将观察 Pod 的行为,大约五分钟后,将通过更高的 CPU 请求更新 Pod。

  • 创建名为 hamster.yaml 的文件,并将 kubernetes/autoscaler GitHub 存储库中垂直 Pod 自动缩放程序示例的以下清单复制到该文件中。

  • 使用 kubectl apply 命令部署 hamster.yaml 垂直 Pod 自动缩放程序示例,并指定 YAML 清单的名称:

    kubectl apply -f hamster.yaml
    

    片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。

  • 运行以下 kubectl get 命令以从 hamster 示例应用程序中获取 Pod:

    kubectl get pods -l app=hamster
    

    示例输出如下所示:

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  • 对其中一个 Pod 使用 kubectl describe 命令以查看其 CPU 和内存预留量。 将“exampleID”替换为上一步骤的输出中返回的 Pod ID 之一。

    kubectl describe pod hamster-exampleID
    

    示例输出是有关群集的信息片段:

     hamster:
        Container ID:  containerd://
        Image:         k8s.gcr.io/ubuntu-slim:0.1
        Image ID:      sha256:
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/sh
        Args:
          while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        State:          Running
          Started:      Wed, 28 Sep 2022 15:06:14 -0400
        Ready:          True
        Restart Count:  0
        Requests:
          cpu:        100m
          memory:     50Mi
        Environment:  <none>
    

    在此示例中,Pod 预留了 100 millicpu(毫核 CPU)和 50 MiB 内存。 对于此示例应用程序,Pod 需要低于 100 millicpu 才能运行,因此没有可用的 CPU 容量。 此外,Pod 预留的内存也比需求量少得多。 垂直 Pod 自动缩放程序 vpa-recommender 部署将分析托管 hamster 应用程序的 Pod,以确定 CPU 和内存要求是否适当。 如果需要调整,vpa-updater 将使用更新的值重新启动 Pod。

  • 等待 vpa-updater 启动新的 hamster Pod,这需要几分钟时间。 可以使用 kubectl get 命令监视 Pod。

    kubectl get --watch pods -l app=hamster
    
  • 启动新的 hamster Pod 后,描述运行 kubectl describe 命令的 Pod 并查看已更新的 CPU 和内存预留量。

    kubectl describe pod hamster-<exampleID>
    

    示例输出是描述 Pod 的信息片段:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

    在上面的输出中,可以看到 CPU 预留量已增加到 587 millicpu,这是原始值的五倍多。 内存已增加到 262,144 KB(大约 250 MiB),即原始值的五倍。 此 Pod 资源不足,而垂直 Pod 自动缩放程序使用一个更合适的值更正了估算值。

  • 若要查看 VPA 提供的已更新建议,请运行 kubectl describe 命令来描述 hamster-vpa 资源信息。

    kubectl describe vpa/hamster-vpa
    

    示例输出是有关资源利用率的信息片段:

     State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

    自动设置 Pod 自动缩放程序请求

    当 updateMode 设置为 Auto 或 Recreate 时,垂直 Pod 自动缩放将使用 VerticalPodAutoscaler 对象来自动设置 Pod 的资源请求。

  • 运行以下命令为群集启用 VPA。 将群集名称 myAKSCluster 替换为你的 AKS 群集名称,并将 myResourceGroup 替换为群集所在资源组的名称。

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa
    
  • 创建名为 azure-autodeploy.yaml 的文件,并将其复制到以下清单中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: vpa-auto-deployment
      template:
        metadata:
          labels:
            app: vpa-auto-deployment
        spec:
          containers:
          - name: mycontainer
            image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    

    此清单描述了包含两个 Pod 的部署。 每个 Pod 包含一个请求 100 milliCPU 和 50 MiB 内存的容器。

  • 使用 kubectl create 命令创建 Pod,如以下示例所示:

    kubectl create -f azure-autodeploy.yaml
    

    片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。

  • 运行以下 kubectl get 命令以获取 Pod:

    kubectl get pods
    

    输出如以下示例所示,其中显示了 Pod 的名称和状态:

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-kchc5   1/1     Running   0          52s
    vpa-auto-deployment-54465fb978-nhtmj   1/1     Running   0          52s
    
  • 创建名为 azure-vpa-auto.yaml 的文件,并将描述 VerticalPodAutoscaler 的以下清单复制到其中:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: vpa-auto
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       vpa-auto-deployment
      updatePolicy:
        updateMode: "Auto"
    

    targetRef.name 值指定由名为 vpa-auto-deployment 的部署所控制的任何 Pod 都属于此 VerticalPodAutoscalerupdateModeAuto 表示垂直 Pod 自动缩放程序控制器可以删除 Pod,调整 CPU 和内存请求,然后启动新 Pod。

  • 使用 kubectl apply 命令将清单应用于群集:

    kubectl create -f azure-vpa-auto.yaml
    
  • 等待几分钟,然后运行以下 kubectl get 命令再次查看正在运行的 Pod:

    kubectl get pods
    

    输出如以下示例所示,其中显示了 Pod 名称已更改,并显示了 Pod 状态:

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-qbhc4   1/1     Running   0          2m49s
    vpa-auto-deployment-54465fb978-vbj68   1/1     Running   0          109s
    
  • 使用 Kubectl get 命令获取有关正在运行的 Pod 的详细信息。 将 podName 替换为在上一步骤中检索的某个 Pod 的名称。

    kubectl get pod podName --output yaml
    

    输出如以下示例所示,其中显示了垂直 Pod 自动缩放程序控制器已将内存请求增加到 262144k,并已将 CPU 请求增加到 25 milliCPU。

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaObservedContainers: mycontainer
        vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory
          request'
      creationTimestamp: "2022-09-29T16:44:37Z"
      generateName: vpa-auto-deployment-54465fb978-
      labels:
        app: vpa-auto-deployment
    spec:
      containers:
      - args:
        - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        command:
        - /bin/sh
        image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        imagePullPolicy: IfNotPresent
        name: mycontainer
        resources:
          requests:
            cpu: 25m
            memory: 262144k
    
  • 若要获取有关垂直 Pod 自动缩放程序及其 CPU 和内存建议的详细信息,请使用 kubectl get 命令:

    kubectl get vpa vpa-auto --output yaml
    

    输出如以下示例所示:

     recommendation:
      containerRecommendations:
      - containerName: mycontainer
        lowerBound:
          cpu: 25m
          memory: 262144k
        target:
          cpu: 25m
          memory: 262144k
        uncappedTarget:
          cpu: 25m
          memory: 262144k
        upperBound:
          cpu: 230m
          memory: 262144k
    

    结果显示,target 属性指定无需更改 CPU 或内存目标即可使容器以最佳方式运行。 如果目标 CPU 和内存建议更高,结果可能有所不同。

    垂直 Pod 自动缩放程序使用 lowerBoundupperBound 属性来确定是否要删除 Pod 并将其替换为新 Pod。 如果 Pod 中的请求低于下限或高于上限,垂直 Pod 自动缩放程序会删除该 Pod,并将它替换为符合目标属性的 Pod。

    本文介绍了如何自动缩放群集节点的资源利用率(例如 CPU 和内存),以符合应用程序的要求。 还可以使用水平 Pod 自动缩放程序自动调整运行应用程序的 Pod 数。 有关使用水平 Pod 自动缩放程序的步骤,请参阅在 AKS 中缩放应用程序

  •