Pod 纵向自动扩缩功能可自动设置 Kubernetes Pod 中容器的 CPU 和内存资源请求和限制。Pod 纵向自动扩缩功能会分析历史资源用量和当前资源用量,以提供建议,这些建议可以通过显示或通过更新 Pod 自动应用。此功能通过合理调整资源分配来提高稳定性和成本效益。
准备工作
在配置垂直 Pod 自动扩缩之前,请确保满足以下前提条件:
- 您有一个正在运行的裸金属集群。
- 您拥有对集群的
kubectl
访问权限。 - 集群中提供 Metrics Server。裸金属集群默认包含 Metrics Server。
启用 Pod 纵向自动扩缩
通过设置预览版注释并配置集群规范,在裸金属集群上启用 Pod 纵向自动扩缩:
在集群自定义资源上添加或更新预览版注释。
直接修改集群自定义资源,或修改集群配置文件并使用
bmctl update
。metadata: annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
修改集群自定义资源的
spec
,以添加verticalPodAutoscaling
字段并指定enableUpdater
和enableMemorySaver
模式:apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: cluster1 namespace: cluster-cluster1 annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable spec: # ... other cluster spec fields verticalPodAutoscaling: enableUpdater: true # Set to true for automated updates enableMemorySaver: true # Set to true to reduce recommender memory usage
如果您修改了集群配置文件,请使用以下命令应用更改:
bmctl update cluster -c CLUSTER_NAME --kubeconfig KUBECONFIG
替换以下内容:
CLUSTER_NAME
:您的集群的名称。KUBECONFIG
:集群 kubeconfig 文件的路径。
创建 VerticalPodAutoscaler
自定义资源
在集群上启用 Pod 纵向自动扩缩后,定义一个 VerticalPodAutoscaler
自定义资源以定位特定工作负载:
在目标工作负载所在的命名空间中定义
VerticalPodAutoscaler
资源。此自定义资源使用
targetRef
和任何资源政策指定其目标 Pod。apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"]
使用以下命令应用
VerticalPodAutoscaler
清单:kubectl apply -f VPA_MANIFEST \ --kubeconfig KUBECONFIG
替换以下内容:
VPA_MANIFEST
:VerticalPodAutoscaler
清单文件的路径。KUBECONFIG
:集群 kubeconfig 文件的路径。
了解 Pod 纵向自动扩缩模式
Pod 纵向自动扩缩功能以不同模式运行,这些模式控制着它如何应用资源建议。
建议模式
在建议模式下,Pod 纵向自动扩缩会安装推荐器组件。此组件会分析资源使用情况,并在您创建的 VerticalPodAutoscaler
自定义资源的状态部分中发布 CPU 和内存请求及限制的建议值。
如需查看资源请求和限制建议,请使用以下命令:
kubectl describe vpa VPA_NAME \
--kubeconfig KUBECONFIG \
-n CLUSTER_NAMESPACE
Replace the following:
* `VPA_NAME`: the name of the `VerticalPodAutoscaler`
that's targeting the workloads for which you are considering resource
adjustments.
* `KUBECONFIG`: the path of the cluster kubeconfig
file.
* `CLUSTER_NAMESPACE`: the name of the cluster that's
running vertical Pod autoscaling.
响应应包含一个类似于以下示例的 Status
部分:
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
在此模式下,Pod 不会自动更新。您可以根据这些建议手动更新 Pod 配置。如果未设置 enableUpdater
或将其设置为 false
,则这是默认行为。
自动更新模式
当您将 enableUpdater
enableUpdater
设置为 true
时,除了推荐器之外,裸金属生命周期控制器还会部署 Pod 纵向自动扩缩更新器和准入控制器组件。更新程序会监控当前资源请求与建议值相差很大的 Pod。
VerticalPodAutoscaler
资源中的更新政策指定了更新程序如何应用建议。默认情况下,更新模式为 Auto
,这意味着更新程序会在创建 Pod 时分配更新后的资源设置。以下 VerticalPodAutoscaler
示例展示了如何将更新模式设置为 Initial
:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: hamster-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: hamster
resourcePolicy:
updatePolicy:
updateMode: "Initial"
...
更新程序支持以下五种模式:
Auto
:更新程序驱逐 Pod。准入控制器会拦截新 Pod 的创建请求,并对其进行修改,以使用推荐器提供的建议 CPU 和内存值。更新资源需要重新创建 Pod,这可能会导致中断。使用更新程序遵循的 Pod 中断预算来管理逐出流程。此模式等同于Recreate
。Recreate
:更新程序会在重新创建 Pod 时逐出 Pod 并分配建议的资源请求和限制。InPlaceOrRecreate
(Alpha 版):更新程序会尽力尝试就地更新,但如果无法就地更新,可能会回退到重新创建 Pod。如需了解详情,请参阅就地调整 Pod 大小文档。Initial
:更新程序仅在创建 Pod 时分配资源请求,之后不再加以更改。Off
:更新程序不会自动更改 Pod 的资源要求。系统会计算建议,并在VerticalPodAutoscaler
对象中对其进行检查。
如需详细了解 VerticalPodAutoscaler
自定义资源,请使用 kubectl
检索安装在 1.33.0 版或更高版本集群上的 verticalpodautoscalercheckpoints.autoscaling.k8s.io
自定义资源定义。
以下示例展示了资源建议在 hamster
容器的 Status
部分中可能显示的方式。该示例还展示了 Pod 逐出事件的示例,当更新程序在自动为重新创建的 Pod 分配建议的资源配置之前逐出 Pod 时,就会发生该事件:
Spec:
Resource Policy:
Container Policies:
Container Name: *
Controlled Resources:
cpu
memory
Max Allowed:
Cpu: 1
Memory: 500Mi
Min Allowed:
Cpu: 100m
Memory: 50Mi
Target Ref:
API Version: apps/v1
Kind: Deployment
Name: hamster
Update Policy:
Update Mode: Auto
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EvictedPod 49s vpa-updater VPA Updater evicted Pod hamster-7cb59fb657-lkrk4 to apply resource recommendation.
省内存模式
内存节省模式可减少 Pod 纵向自动扩缩推荐器组件的内存占用。将 enableMemorySaver
设置为 true
时,推荐器仅跟踪并计算具有匹配的 VerticalPodAutoscaler
自定义资源的 Pod 的汇总数据。
但缺点是,当您为现有工作负载创建新的 VerticalPodAutoscaler
自定义资源时,推荐器需要一些时间(最长 24 小时)来收集足够的历史记录,才能提供准确的建议。对于大多数集群类型,此模式默认处于 false
状态,但对于边缘集群,此模式默认处于 true
状态。
停用 Pod 纵向自动扩缩
从集群中移除 Pod 纵向自动扩缩的自定义资源和配置,以停用该功能:
删除您创建的所有
VerticalPodAutoscaler
自定义资源。修改集群自定义资源,并从
spec
中移除整个verticalPodAutoscaling
部分。您可以直接修改集群自定义资源,也可以修改集群配置文件并使用
bmctl update
。从 Cluster 自定义资源中移除
preview.baremetal.cluster.gke.io/vertical-pod-autoscaler
注释。
限制
使用 Pod 纵向自动扩缩时,请考虑以下限制:
- Pod 纵向自动扩缩目前还无法用于 JVM 工作负载,因为对此类工作负载的实际内存用量的了解有限。
- 更新程序要求 Deployment 至少有两个 Pod 副本,以便将 Pod 替换为修改后的资源值。
- 更新程序不会快速更新因内存不足 (OOM) 错误而陷入崩溃循环的 Pod。
- Pod 的
InPlaceOrRecreate
更新政策是 Pod 纵向自动扩缩功能中的一项 Alpha 版功能。它会尽力进行就地更新,但如果无法进行就地更新,可能会回退到重新创建 Pod。
后续步骤
- 探索 Pod 中断预算。