尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VPA频繁扩缩容重启Pod?三步阈值配置实操指南

VPA频繁扩缩容重启Pod?三步阈值配置实操指南 VPA频繁扩缩容重启Pod三步阈值配置实操指南【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler如果你的 Kubernetes 集群里部署了 Vertical Pod AutoscalerVPA垂直 Pod 自动扩缩器多半经历过这样的场景白天 Pod 的 CPU 请求从 500m 跳到 800m晚上又跳回去每次调整都伴随 Pod 重建业务抖动一波接一波。其实问题往往不在 VPA 本身而在于你没有给它划清能动多少和怎么动的边界。在 autoscaler 仓库的 vertical-pod-autoscaler 组件中resourcePolicy的上下限、controlledResources的资源分工、updatePolicy.updateMode的更新策略这三处配置就是控制 VPA 行为的核心开关。本文带你按原理 → 配置 → 验证的顺序用不到 30 分钟的阅读时间把它讲透。先搞懂VPA 为什么会手抖在动手改配置前值得花一分钟看清 VPA 的工作闭环否则调参只是碰运气。VPA 由三个组件协作完成整体数据流如下图所示组件职责类比recommender推荐器持续采集 Pod 历史用量算出目标推荐值及上下边界记账员只算不动手updater更新器对比当前 requests 与推荐值超差才触发更新执行者admission-controller准入控制器Pod 创建时注入推荐值保证新 Pod 直接用对配置门卫手抖的根源在于推荐值本身就在随用量波动而波动而 updater 只关心当前值是否落在推荐边界内。如果你的用量在 300m~800m 之间来回摆推荐值也会跟着摆updater 就会反复触发改配和驱逐 Pod。解决思路因此只有两条把推荐值锁进一个窄区间阈值以及让每次调整的代价尽量小更新策略。下面的三步配置正是围绕这两点展开。第一步用 resourcePolicy 给推荐值套上笼子VPA 的推荐值是一个区间而不是一个点。你可以在resourcePolicy.containerPolicies里显式声明minAllowed和maxAllowed相当于告诉推荐器算出来的结果无论多离谱最终落值必须夹在这个框里。apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-app-vpa spec: targetRef: apiVersion: apps/v1 kind: Deployment name: my-app resourcePolicy: containerPolicies: - containerName: * minAllowed: cpu: 500m memory: 200Mi maxAllowed: cpu: 800m memory: 500Mi设置原则很简单下限取你应用能稳定跑的资源水位避免推荐器把值压得太低导致性能劣化上限贴着业务峰值留一点余量既防止偶发毛刺推高请求、也避免 Pod 因要不到这么多资源而调度不上去。一个容易被忽略的细节如果集群里同时配置了 LimitRange当两者冲突时VPA 会优先遵循自己的资源策略而忽略 LimitRange 约束见 docs/features.md 的 Limits control 一节。所以阈值冲突时改 VPA 的resourcePolicy才是正解。第二步用 controlledResources 划清 VPA 与 HPA 的地盘频繁扩缩容的另一个常见诱因是 VPA 和 HPA 在同一个资源维度上抢活。controlledResources让你精确指定 VPA 只管哪一类资源取值含义典型搭配[memory]只调内存CPU 交给 HPA 按负载伸缩副本数[cpu]只调 CPU内存使用稳定的无状态服务[cpu, memory]全管默认没有 HPA 的独立工作负载resourcePolicy: containerPolicies: - containerName: * controlledResources: [memory]把 CPU 从 VPA 手里摘出去之后VPA 的推荐维度少了一半触发调整的概率自然下降。官方 FAQ 里也给出了同款配置示例和适用场景可对照 docs/faq.md 中 configure VPA to manage only specific resources 一节。提示如果你的工作负载只有 1 个副本updater 默认要求--min-replicas2才会动手单副本场景要记得在 deploy/updater-deployment.yaml 里加--min-replicas1否则推荐值会一直只算不动。第三步选对 updateMode把每次调整的代价降到最低阈值管的是动多少updatePolicy.updateMode管的是怎么动。各模式的取舍如下updateMode行为适用场景Off只出推荐值永不修改先观察、再决策的灰度期Recreate驱逐 Pod 让控制器按新配置重建通用、语义明确推荐显式使用替代已废弃的AutoInPlaceOrRecreate优先原地改容器资源失败再回退重建对中断敏感、且集群版本够新的工作负载updatePolicy: updateMode: InPlaceOrRecreate关于InPlaceOrRecreate有三个前提要注意详见 docs/features.md 的 In-Place Updates 一节集群需为 Kubernetes 1.33且InPlacePodVerticalScaling特性门已启用VPA 版本需 1.4.0 及以上1.5.0 起默认开启1.7.0 起特性门已移除原地更新并非零中断容器运行时负责实际 resize且 Pod 的 QoS 等级若会变化则会直接回退到重建。如果还想更精细地控制什么时候允许驱逐可以加evictionRequirements比如只在推荐值高于当前请求时才允许驱逐updatePolicy: updateMode: Recreate evictionRequirements: - resources: [cpu, memory] changeRequirement: TargetHigherThanRequests完整写法见 docs/examples.md 中 Controlling eviction behavior 一节。验证配置是否真的生效改完 YAML 别急着关浏览器按下面三步确认链路是通的看推荐值kubectl get vpa my-app-vpa -o yaml确认status.recommendation已经落进你设的 min/max 区间内看准入控制器kubectl get pod -n kube-system | grep vpa-admission-controller它不跑的话新 Pod 拿不到推荐值只会出现重启了但配置没变的怪象看更新器日志kubectl logs -n kube-system -l componentvpa-updater确认它识别到 VPA 对象且在正常评估。如果推荐值本身还在阈值外漂多半是历史数据里有毛刺。可以在 recommender 的启动参数里加--round-cpu-millicores50、--round-memory-bytes134217728之类做取整把推荐值吸附到整齐的档位上波动会平滑很多docs/features.md 中有完整说明。避坑清单症状可能原因处理Pod 被重启但资源没变化admission-controller 未运行或 webhook 未注册按 docs/faq.md 首个条目排查 webhook 与 service推荐值一直不应用副本数低于 updater 阈值调低--min-replicasPod 因推荐值过大 Pending推荐值超过最大节点可分配资源在 recommender 加--container-recommendation-max-allowed-cpu/memory全局封顶或收紧maxAllowed原地更新没生效集群版本低于 1.33或 resize 后 QoS 变化升级集群 / 检查 QoS必要时接受回退重建只调 CPU 却内存也被改了默认 controlledResources 为两者都管显式设置controlledResources一个真实感更强的对照某服务默认配置下CPU 请求在 300m~800m 间反复横跳VPA 几乎每小时都在改值重建。按本文思路把minAllowed.cpu设为 500m、maxAllowed.cpu设为 800m并用controlledResources收敛了管理维度后请求值稳定在 500m~800m 不再来回摆重建频率从每小时降到偶尔一次业务侧的抖动基本消失。下一步行动打开你线上那个最闹腾的 VPA 对象先只加minAllowed/maxAllowed两个字段观察一个完整业务周期再决定是否叠加controlledResources与InPlaceOrRecreate——小步收紧比一次改完更稳。【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表