当前位置: 首页 > news >正文

VPA 垂直扩缩容实践:从 Pod 到容器

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 vpa

2. 基础 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: 2Gi

2. 推荐模式

问题:如何只获取推荐而不自动更新。

解决方案

# 推荐模式 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: "Off"

2. 历史数据权重

问题:如何调整历史数据的权重。

解决方案

# 配置历史数据权重 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"]

最佳实践

  1. 更新模式选择

    • 生产环境建议先使用 Off 模式观察
    • 确认推荐合理后再切换到 Auto 模式
    • Initial 模式适合新部署的应用
  2. 资源限制

    • 设置合理的 minAllowed 和 maxAllowed
    • 避免资源波动过大
    • 考虑节点容量限制
  3. 与 HPA 配合

    • 明确 HPA 和 VPA 控制的资源
    • 避免两者控制同一资源
    • 基于业务特点选择策略
  4. 监控告警

    • 监控 VPA 更新事件
    • 设置资源调整告警
    • 分析推荐准确性

常见问题与解决方案

1. VPA 不更新

问题:VPA 没有触发 Pod 更新。

解决方案

  • 检查 VPA 状态
  • 查看推荐值
  • 确认更新模式

2. 频繁重启

问题:Pod 频繁因为 VPA 重启。

解决方案

  • 增加资源缓冲
  • 调整 minAllowed 和 maxAllowed
  • 使用 Off 模式观察

3. 推荐不准确

问题:VPA 推荐值与实际需求不符。

解决方案

  • 增加观察时间
  • 调整历史数据权重
  • 手动设置资源

4. 与 HPA 冲突

问题:VPA 和 HPA 同时控制同一资源。

解决方案

  • 明确资源控制分工
  • 分离控制的资源类型
  • 使用自定义指标
http://www.jsqmd.com/news/553767/

相关文章:

  • 从‘单打独斗’到‘集团作战’:我们如何用混合式调度搞定500台AGV的协同难题
  • Spring_couplet_generation 从零开始环境配置:Windows系统下的Python与CUDA安装
  • Python异步I/O性能翻倍实录:从阻塞到百万QPS,3个核心协程模式+5行关键代码重构
  • 不止于Navidrome:Music Tag Web的隐藏玩法,打造你的私人音乐数据库
  • Python从入门到精通(第11章):函数进阶:作用域与闭包
  • 【数据结构与算法】第12篇:栈(二):链式栈与括号匹配问题
  • YOLO26官方镜像深度体验:推理、训练、下载一站式教程
  • DAMOYOLO-S实战案例:纺织品瑕疵检测(结合裁剪+局部放大)
  • 基于A*、遗传、蚁群优化和元胞自动机四种经典算法实现四种场景下六边形网格路径规划研究(Python代码实现)
  • StructBERT情感分类模型部署案例:高校科研项目中文社会情绪追踪系统
  • Comsol模拟多道激光熔覆热流耦合模型和教学教程,用到的物理场为流体传热层流以及动网格
  • 5分钟掌握QuickRecorder:高效屏幕录制的macOS实用指南
  • Qwen3-TTS开源镜像实操:与LangChain集成构建多语种AI Agent语音接口
  • 3步搞定Windows启动画面:HackBGRT让UEFI启动界面焕然一新
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4环境部署详解:Anaconda虚拟环境配置
  • 拯救低清视频:AI视频增强技术全攻略
  • 昇腾NPU实战:PyTorch模型迁移与Ascend PyTorch Profiler深度调优
  • 3步解决显卡驱动残留问题:驱动清理工具DDU完全指南
  • 5个行业颠覆场景:用PptxGenJS实现办公自动化效率革命
  • 京东e卡怎么回收?这里有高价兑换的线上平台 - 团团收购物卡回收
  • 5步掌控Windows驱动仓库:DriverStore Explorer全方位优化指南
  • 科研开发神器:Miniconda-Python3.8镜像实测,轻松复现实验结果
  • Comsol三维激光切割:热流耦合模型与物理场解析
  • Ostrakon-VL-8B盲测挑战:与人类在图像描述任务上的对比
  • 哪里回收京东e卡?推荐可靠的线上兑换平台 - 团团收购物卡回收
  • Live2D资源解析技术解析与实战:从格式障碍到跨领域应用
  • OpenClaw知识库集成:Qwen3-VL:30B对接飞书Wiki作为外部记忆
  • 造相-Z-Image-Turbo 结合JavaScript动态网页:打造浏览器端实时AI绘图演示
  • ## 38|Python 分布式 ID 与雪花算法:高并发订单号设计
  • CTFhub实战:病毒文件解密、modbus协议解析与注册表取证