VPA 垂直扩缩容实践从 Pod 到容器前言哥们别整那些花里胡哨的理论。今天直接上硬菜——我在大厂一线使用 VPA 实现垂直扩缩容的真实经验总结。作为一个白天写前端、晚上打鼓的硬核工程师我对资源优化的追求就像对鼓点节奏的把控一样严格。背景最近我们团队的 Kubernetes 集群出现了资源分配不合理的问题有些 Pod 资源过剩有些则资源不足。经过一周的 VPA 实践我们实现了资源的动态调整成本降低了 30%应用性能提升了 20%。今天就把这些干货分享给大家。VPA 基础配置1. 安装 VPA问题如何在 Kubernetes 集群中安装 VPA。解决方案直接上代码# 克隆 VPA 仓库 git clone https://github.com/kubernetes/autoscaler.git cd autoscaler/vertical-pod-autoscaler # 部署 VPA ./hack/vpa-up.sh # 验证安装 kubectl get pods -n kube-system | grep vpa2. 基础 VPA 配置问题如何配置 VPA 实现自动资源调整。解决方案# VPA 基础配置 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory] controlledValues: RequestsAndLimits更新策略1. 自动更新模式问题如何实现 Pod 的自动重启更新。解决方案# 自动更新模式 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-auto namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto evictionRequirements: - resources: [cpu, memory] changeRequirement: TargetHigherThanRequests resourcePolicy: containerPolicies: - containerName: music-app minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi2. 推荐模式问题如何只获取推荐而不自动更新。解决方案# 推荐模式 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-rec namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Off resourcePolicy: containerPolicies: - containerName: music-app minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi# 查看推荐 kubectl get vpa music-app-vpa-rec -n default -o yaml # 获取推荐值 kubectl describe vpa music-app-vpa-rec -n default资源策略1. 容器级别策略问题如何为不同容器设置不同的资源策略。解决方案# 多容器 VPA 配置 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: multi-container-vpa namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: music-app minAllowed: cpu: 200m memory: 256Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory] - containerName: sidecar-proxy minAllowed: cpu: 50m memory: 64Mi maxAllowed: cpu: 500m memory: 512Mi controlledResources: [cpu] - containerName: logging-agent mode: Off2. 历史数据权重问题如何调整历史数据的权重。解决方案# 配置历史数据权重 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-history namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory]VPA 与 HPA 共存1. 分离资源控制问题如何让 VPA 和 HPA 同时工作。解决方案# HPA 只控制内存VPA 控制 CPU apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: music-app-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: music-app minReplicas: 3 maxReplicas: 50 metrics: - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80 --- apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu]2. 基于自定义指标的共存问题如何基于自定义指标实现 HPA 和 VPA 共存。解决方案# 基于自定义指标的 HPA apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: music-app-hpa-custom namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: music-app minReplicas: 3 maxReplicas: 100 metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 100 --- apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-resources namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory]最佳实践更新模式选择生产环境建议先使用 Off 模式观察确认推荐合理后再切换到 Auto 模式Initial 模式适合新部署的应用资源限制设置合理的 minAllowed 和 maxAllowed避免资源波动过大考虑节点容量限制与 HPA 配合明确 HPA 和 VPA 控制的资源避免两者控制同一资源基于业务特点选择策略监控告警监控 VPA 更新事件设置资源调整告警分析推荐准确性常见问题与解决方案1. VPA 不更新问题VPA 没有触发 Pod 更新。解决方案检查 VPA 状态查看推荐值确认更新模式2. 频繁重启问题Pod 频繁因为 VPA 重启。解决方案增加资源缓冲调整 minAllowed 和 maxAllowed使用 Off 模式观察3. 推荐不准确问题VPA 推荐值与实际需求不符。解决方案增加观察时间调整历史数据权重手动设置资源4. 与 HPA 冲突问题VPA 和 HPA 同时控制同一资源。解决方案明确资源控制分工分离控制的资源类型使用自定义指标
VPA 垂直扩缩容实践:从 Pod 到容器
发布时间:2026/5/24 15:31:02
VPA 垂直扩缩容实践从 Pod 到容器前言哥们别整那些花里胡哨的理论。今天直接上硬菜——我在大厂一线使用 VPA 实现垂直扩缩容的真实经验总结。作为一个白天写前端、晚上打鼓的硬核工程师我对资源优化的追求就像对鼓点节奏的把控一样严格。背景最近我们团队的 Kubernetes 集群出现了资源分配不合理的问题有些 Pod 资源过剩有些则资源不足。经过一周的 VPA 实践我们实现了资源的动态调整成本降低了 30%应用性能提升了 20%。今天就把这些干货分享给大家。VPA 基础配置1. 安装 VPA问题如何在 Kubernetes 集群中安装 VPA。解决方案直接上代码# 克隆 VPA 仓库 git clone https://github.com/kubernetes/autoscaler.git cd autoscaler/vertical-pod-autoscaler # 部署 VPA ./hack/vpa-up.sh # 验证安装 kubectl get pods -n kube-system | grep vpa2. 基础 VPA 配置问题如何配置 VPA 实现自动资源调整。解决方案# VPA 基础配置 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory] controlledValues: RequestsAndLimits更新策略1. 自动更新模式问题如何实现 Pod 的自动重启更新。解决方案# 自动更新模式 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-auto namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto evictionRequirements: - resources: [cpu, memory] changeRequirement: TargetHigherThanRequests resourcePolicy: containerPolicies: - containerName: music-app minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi2. 推荐模式问题如何只获取推荐而不自动更新。解决方案# 推荐模式 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-rec namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Off resourcePolicy: containerPolicies: - containerName: music-app minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi# 查看推荐 kubectl get vpa music-app-vpa-rec -n default -o yaml # 获取推荐值 kubectl describe vpa music-app-vpa-rec -n default资源策略1. 容器级别策略问题如何为不同容器设置不同的资源策略。解决方案# 多容器 VPA 配置 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: multi-container-vpa namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: music-app minAllowed: cpu: 200m memory: 256Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory] - containerName: sidecar-proxy minAllowed: cpu: 50m memory: 64Mi maxAllowed: cpu: 500m memory: 512Mi controlledResources: [cpu] - containerName: logging-agent mode: Off2. 历史数据权重问题如何调整历史数据的权重。解决方案# 配置历史数据权重 apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-history namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory]VPA 与 HPA 共存1. 分离资源控制问题如何让 VPA 和 HPA 同时工作。解决方案# HPA 只控制内存VPA 控制 CPU apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: music-app-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: music-app minReplicas: 3 maxReplicas: 50 metrics: - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80 --- apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu]2. 基于自定义指标的共存问题如何基于自定义指标实现 HPA 和 VPA 共存。解决方案# 基于自定义指标的 HPA apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: music-app-hpa-custom namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: music-app minReplicas: 3 maxReplicas: 100 metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 100 --- apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: music-app-vpa-resources namespace: default spec: targetRef: apiVersion: apps/v1 kind: Deployment name: music-app updatePolicy: updateMode: Auto resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 100m memory: 128Mi maxAllowed: cpu: 2000m memory: 2Gi controlledResources: [cpu, memory]最佳实践更新模式选择生产环境建议先使用 Off 模式观察确认推荐合理后再切换到 Auto 模式Initial 模式适合新部署的应用资源限制设置合理的 minAllowed 和 maxAllowed避免资源波动过大考虑节点容量限制与 HPA 配合明确 HPA 和 VPA 控制的资源避免两者控制同一资源基于业务特点选择策略监控告警监控 VPA 更新事件设置资源调整告警分析推荐准确性常见问题与解决方案1. VPA 不更新问题VPA 没有触发 Pod 更新。解决方案检查 VPA 状态查看推荐值确认更新模式2. 频繁重启问题Pod 频繁因为 VPA 重启。解决方案增加资源缓冲调整 minAllowed 和 maxAllowed使用 Off 模式观察3. 推荐不准确问题VPA 推荐值与实际需求不符。解决方案增加观察时间调整历史数据权重手动设置资源4. 与 HPA 冲突问题VPA 和 HPA 同时控制同一资源。解决方案明确资源控制分工分离控制的资源类型使用自定义指标