本文概述 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-vpa
与 az aks upgrade 命令结合使用。
az aks update -n myAKSCluster -g myResourceGroup --enable-vpa
片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。
(可选)若要在现有群集上禁用 VPA,请将 --disable-vpa
与 az 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 都属于此 VerticalPodAutoscaler
。 updateMode
值 Auto
表示垂直 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 自动缩放程序使用 lowerBound
和 upperBound
属性来确定是否要删除 Pod 并将其替换为新 Pod。 如果 Pod 中的请求低于下限或高于上限,垂直 Pod 自动缩放程序会删除该 Pod,并将它替换为符合目标属性的 Pod。
本文介绍了如何自动缩放群集节点的资源利用率(例如 CPU 和内存),以符合应用程序的要求。 还可以使用水平 Pod 自动缩放程序自动调整运行应用程序的 Pod 数。 有关使用水平 Pod 自动缩放程序的步骤,请参阅在 AKS 中缩放应用程序。