想象你在城市最繁华的地段经营一家云上餐厅。工作日中午只有零散几桌客人,你却按周末高峰雇了10位厨师,大伙儿大部分时间都在擦灶台;真到了节假日,门口排起长龙,10个工位又忙不过来,上菜慢、差评不断。这座餐厅的困境,正是许多 Kubernetes 集群的真实写照:Pod 资源在低峰期闲置浪费,高峰期又扛不住压力。聪明的你引入两套自动化系统:第一套叫 HPA,它像前台经理,时刻盯着门口排队人数,人多了就加开厨师工位,人少了就关闭多余工位;第二套叫 VPA,它像后厨主厨,根据每道菜的复杂程度,校准每个工位的灶台数量和食材储备。两者配合,让餐厅在“不浪费”与“不拒客”之间找到完美平衡。这篇教程,我们借这座云上餐厅的故事,把 HPA 与 VPA 的原理、配置、协同实践讲透。

岗位关联

掌握HPA/VPA是AI推理服务成本优化的核心技能。学完这篇,你将能独立设计集群弹性伸缩方案,让每一份CPU和GPU算力都花在刀刃上。

目录
  1. 可视化演示
  2. 弹性伸缩概念
  3. HPA机制原理
  4. VPA机制原理
  5. 协同组合策略
  6. 性能影响评估
  7. 案例与适配建议
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

对比HPA水平扩Pod与VPA垂直调requests两种伸缩维度、三类指标来源触发机制、以及HPA与VPA组合下的负载自适应伸缩效果。

本节配有交互动效(进入视口后自动加载,约 3KB)。

HPA水平与VPA垂直伸缩 HPA按CPU或自定义指标扩减Pod VPA调整Pod的requests垂直扩缩 HPA+x / VPA+y 水平近无上限垂直需重启Pod

弹性伸缩概念

你的云上餐厅开业半年,账本让财务头疼:按照周末客流雇了10个厨师,结果工作日中午只有两三桌客人,大半厨师闲着擦灶台;真到节假日高峰,10个工位又忙不过来,上菜极慢,客人抱怨不断。这座餐厅的困境,正是许多Kubernetes集群的真实写照:为应对峰值而固定分配资源,低峰期必然产生大量闲置;而为了节省成本把资源配小,高峰期又会拖垮服务。生活总是这样教育我们:静态规划永远追不上动态的需求曲线。

Kubernetes里的每个Pod就像一个厨师工位:要跑业务,就要占用CPU和内存。负载低时,一堆Pod在空转浪费资源;负载高时,现有Pod又扛不住。传统的做法是提前按峰值容量固定副本数——相当于永远按周末的10个工位配置,成本极高。于是K8s提供了弹性伸缩机制,让集群能像聪明的餐厅一样,根据“客流”动态调整资源配置,既保证高峰期不拒客,又避免低峰期养闲人。

这套机制有两个方向。第一种叫Horizontal Pod Autoscaler(HPA),负责水平伸缩——像前台经理根据排队人数增减工位数,即调整Deployment的副本数。第二种叫Vertical Pod Autoscaler(VPA),负责垂直伸缩——像主厨调整每个工位的灶台和食材储备,即修改Pod的resources.requests和limits。两者一个管“数量”、一个管“容量”,共同构成K8s弹性伸缩的完整拼图。

理解了这个餐厅故事,你就掌握了弹性伸缩的核心:HPA把副本数从“拍脑袋固定值”变成“跟随负载的变量”,VPA把单个Pod的资源从“拍脑袋固定值”变成“有数据支撑的推荐值”。接下来我们分别看看这两个系统的看家本领,以及它们如何像经理与主厨那样默契配合。

HPA机制原理

HPA就像餐厅的前台经理。他的办公桌上放着一块仪表盘,实时显示门口排队人数。经理设了一条红线:排队超过10人就加开一个工位,排队少于3人就关掉一个工位。他每隔15秒刷新一次仪表盘,每次加完工位后还要等5分钟才允许撤工位,防止刚加完又要撤的忙乱。这套“看指标、做决策、留冷静”的循环,正是HPA的全部秘密。

在Kubernetes中,HPA控制器周期性地读取Pod的监控指标,与设定的目标值比对。最常见的指标是CPU利用率,也可以扩展到内存、QPS等自定义指标。它通过Metrics Server采集数据,得到一个平均值,再代入一个简洁公式计算目标副本数。这个公式初学者看着像天书,拆开看就是小学比例题:负载翻倍,工位翻倍;负载减半,工位减半。

值得注意的还有两个关键参数:minReplicas和maxReplicas。它们定义了副本数的“地板”和“天花板”,防止极端情况下把一个微服务扩到整个集群都装不下,或者缩到零导致服务不可用。冷却时间保证伸缩不抖动,避免“过山车”式的副本震荡——就像经理刚加完窗口,不会因为5分钟内排队人数又少了两个就立刻撤掉一个窗口,那样顾客会被反复折腾。前台经理虽然勤快,但他只管工位数量,不管每个工位的配置。如果一个工位本应该放5个灶头却只放了2个,他即使加了工位也忙不过来——这就是VPA的用武之地。

desiredReplicas=⌈currentReplicas×currentMetricValuedesiredMetricValue⌉\displaystyle \text{desiredReplicas} = \left\lceil \text{currentReplicas} \times \frac{\text{currentMetricValue}}{\text{desiredMetricValue}} \right\rceil
目标副本数 = 当前副本数 ×(当前负载 ÷ 目标负载),结果向上取整。相当于“现在的工位数 × 客流超了多少倍”。
  1. 当前副本数(currentReplicas)当前正在运行的Pod副本数量,相当于餐厅现在的工位数,是计算的基准值。
    currentReplicas\text{currentReplicas}
  2. 当前指标值(currentMetricValue)最近采集到的实际负载指标,比如CPU平均利用率,相当于现在门口排队的人数。
    currentMetricValue\text{currentMetricValue}
  3. 目标指标值(desiredMetricValue)运维人员设定的期望负载水平,比如50%利用率,相当于经理设定的“排队超过10人就加窗口”红线。
    desiredMetricValue\text{desiredMetricValue}
  4. 比例计算与向上取整将副本数按负载超标比例缩放,结果向上取整,保证小数字算不出小数Pod,餐厅也不会开出“半个工位”。
    ⌈currentReplicas×currentMetricValuedesiredMetricValue⌉\left\lceil \text{currentReplicas} \times \frac{\text{currentMetricValue}}{\text{desiredMetricValue}} \right\rceil

VPA机制原理

如果说HPA是前台经理,VPA就是后厨主厨。主厨不关心门口排了多少人,他关心的是每个厨师工位台面够不够。他翻出一周的出餐记录:张师傅负责的蒸菜档口,燃气一直在高负荷运转,台面小了;李师傅的凉菜档口,高峰期也不过用了两个灶头,台面却铺了四个。于是主厨重新给每个工位尺寸定了标准。VPA中的Recommender组件干的就是主厨的活儿:翻历史记录,算推荐值,定期校准。

VPA持续采集Pod的历史资源使用数据,通过统计方法计算一个推荐值。这个推荐值不是简单取平均——平均会被大量低负载时段拉低,导致高峰打穿——而是取一段时间内的较高分位数,同时叠加一个安全裕度。你可以把这个过程理解为:主厨不看“平均出餐量”,而是看“过去90%的忙碌时段里,这个灶头最大用到了多少火”,再留出10%的余量,保证绝大多数高峰期都罩得住。

VPA有四种更新模式:Auto模式会自动修改Pod的resources并重建Pod,效果最好但会造成短暂重启;Recreate模式与Auto类似但只在Pod重建时生效;Initial模式只在Pod启动时注入推荐值,适合不允许中断的服务;Off模式只做推荐不自动执行,适合运维人员人工审核后再应用。实际生产中,Auto模式最省心,但要为Pod重启预留一定的服务中断容忍度。主厨把工位尺寸调准时,厨房里正在忙的师傅需要暂时停一下手——对应VPA重建Pod。所以主厨和经理必须错峰工作,否则菜就断了。下一节我们看看如何让这两位配合默契。

推荐资源量=percentile90(历史资源峰值序列)×(1+安全裕度)\displaystyle \text{推荐资源量} = \text{percentile}_{90}(\text{历史资源峰值序列}) \times (1 + \text{安全裕度})
VPA推荐 = 历史用量的90分位值 ×(1 + 安全裕度)。简单说:“按过去最忙时段来配,再宽裕一点”。
  1. 历史资源峰值序列VPA把过去一段时间内每个采样点的资源用量收集成一个序列,相当于主厨记录的一周出餐火力日志。
    历史资源峰值序列\text{历史资源峰值序列}
  2. 第90百分位数(percentile_90)将序列从小到大排序,取90%位置的值。意思是“90%的时段用量都在这个值以下”,避免被极端尖峰绑架。
    percentile90\text{percentile}_{90}
  3. 安全裕度乘以(1+裕度),通常取10%-15%,为突发流量留出缓冲,就像工位多备一袋食材应急。
    (1+安全裕度)(1 + \text{安全裕度})
  4. 最终推荐值两者相乘,得到VPA建议写入Pod的resources.requests值。
    percentile90(历史资源峰值序列)×(1+安全裕度)\text{percentile}_{90}(\text{历史资源峰值序列}) \times (1 + \text{安全裕度})

协同组合策略

有一天,前台经理和主厨同时发现蒸菜档口的燃气压力报警,都冲了过去。经理说人多,得加工位;主厨说不对,是灶头不够大,得换大灶头。两个人各调各的,反而把档口弄得一团糟。这一幕,就是HPA和VPA同时盯着CPU指标时的经典冲突。HPA把副本数加到4,单Pod平均负载降下来了;VPA一看负载变低,立刻把request调低;HPA发现利用率又飙高,继续加副本……如此反复,集群陷入“振荡”的旋涡。

业界的主流策略是“先VPA后HPA”:先让VPA根据历史用量把资源基线校准,再让HPA基于这个稳定基线去应对实时流量波动。这就好比餐厅先由主厨把所有工位的灶台尺寸定好,前台经理再在这个基础上灵活增减工位数量。如果工位本身忽大忽小,经理的增减判断就全乱套了。VPA调整后的request值会成为HPA计算利用率的新分母。

更稳妥的协同方式还有两个:一是让VPA只管内存、HPA只管CPU,两者各司其职互不干扰,相当于主厨只调菜量、经理只看客流;二是为VPA设置podUpdatePolicy.Recreate,避免Auto模式不断重建Pod打断HPA扩容节奏。部署时务必给两者都设合理的min/max边界,并开启Metrics Server与VPA Admission Controller。经理管“几个工位”,主厨管“多大工位”,只要分工明确、动线错开,云上餐厅就能既上菜快又不浪费。这套配合跑通后,别急着宣布大功告成——还需要一套科学的KPI评估它到底带来了多少收益。

实际利用率=实际CPU使用量VPA调整后的Request值×100%\displaystyle \text{实际利用率} = \frac{\text{实际CPU使用量}}{\text{VPA调整后的Request值}} \times 100\%
HPA判定是否扩容,看的是“实际用量 ÷ VPA校准后的请求量”这个百分比。基线一变,整个扩缩平衡点都会跟着移动。
  1. 实际CPU使用量Pod运行时真实消耗的CPU核数或时间片,相当于厨师实际开出的火候。
    实际CPU使用量\text{实际CPU使用量}
  2. VPA调整后的Request值VPA根据历史用量校准后的资源申请量,相当于主厨重新设定的灶台标准尺寸。
    VPA调整后的Request值\text{VPA调整后的Request值}
  3. 相除并乘100%得到HPA判定扩容/缩容的百分比依据。如果实际用量接近或超过这个Request值,HPA就会启动扩容。
    实际CPU使用量VPA调整后的Request值×100%\frac{\text{实际CPU使用量}}{\text{VPA调整后的Request值}} \times 100\%

性能影响评估

餐厅老板想知道这套“经理+主厨”组合是否真的省钱又增效。他拿出三张报表:第一张是客流从低到高再到低,工位数量多久才能跟上;第二张是工位数是否一直在抖,让人眼花缭乱;第三张是工资成本同比到底省了多少。评估弹性伸缩方案,同样看三个维度:伸缩延迟、稳定性、成本效益。伸缩延迟决定负载尖峰来临时,服务能否及时跟上;稳定性决定副本数是否反复横跳,影响下游缓存和连接池;成本效益直接回答“省了多少钱”。

伸缩延迟是一条完整链条:从指标超阈值开始,到采集器上报、控制器计算、新Pod创建、调度到节点、拉取镜像、容器启动、探针通过、加入Service负载均衡——每个环节都在贡献延迟。最容易忽略的是Pod启动环节,如果镜像很大或启动探针超时,整个扩容周期可能长达数分钟。理解这条链路,才能定位“流量高峰来了但扩容跟不上”的瓶颈到底在哪个环节。

评估时建议持续采集三个经典信号:P99扩容延迟(即99%的扩容动作都能落在这个耗时以内)、副本抖动率(单位时间内扩缩方向切换次数)、资源闲置率(已分配与真实使用之差)。将评估接入Prometheus与Grafana持续观测,能及时发现冷却时间是否过长、请求峰值是否被低估等问题。三张报表看完,老板心里有了底:扩缩跟得上节奏、工位不抖、账本省钱,这套机制才算合格。最后,不同规模的餐厅该用哪种配置组合,我们给出针对性建议。

T总伸缩延迟=T指标采集+T同步周期+TPod就绪\displaystyle T_{\text{总伸缩延迟}} = T_{\text{指标采集}} + T_{\text{同步周期}} + T_{\text{Pod就绪}}
从负载超标到新Pod真正开始服务,总耗时=指标采集时间+控制器同步时间+Pod就绪时间。三段加起来就是一次扩容的“反应速度”。
  1. T_指标采集Metrics Server轮询Pod指标的时间间隔,默认十几秒到几十秒,相当于经理刷新仪表盘的速度。
    T指标采集T_{\text{指标采集}}
  2. T_同步周期HPA控制器按固定周期比对当前指标与目标的时间窗口,默认15秒一次,相当于经理每次看完仪表盘后思考多久。
    T同步周期T_{\text{同步周期}}
  3. T_Pod就绪新Pod从创建、调度、拉镜像、启动到通过探针Ready的总时间,相当于新工位从搭好到厨师真正能出菜的准备时间。
    TPod就绪T_{\text{Pod就绪}}

案例与适配建议

景区门口的网红小吃店和城区里的连锁中央厨房,管理方式显然不同。小吃店只需要在周末加两张桌子;中央厨房则需要统筹采购、菜品配送、多门店调拨——规模不同,弹性伸缩的策略也不同。在Kubernetes中,小规模集群通常用HPA搭配固定的资源request就够用了,配置简单、收益直接;中大规模集群则要引入VPA做资源画像、多指标HPA做容量保障,并配套完整的监控告警。

一个小规模AI推理服务的HPA可以这样配置:对部署了模型推理服务的Deployment设置最小2个副本、最大8个副本,当CPU平均利用率超过60%时自动扩容。这个配置像极了小吃店的周末预案:平时2个窗口够用,节假日最多开8个窗口,中间全自动。

这段配置告诉HPA:盯着ai-inference这个Deployment的CPU利用率,超过60%就开始按比例加副本,但不超过8个;低于60%就逐步缩容,但不少于2个。对于有经验的团队,还可以为Deployment配置内存、GPU或Kafka消费延迟等自定义指标,在YAML中增加一条metrics条目即可。中大规模集群则要把VPA纳入体系,让VPA每24小时推荐一次资源基线,并在业务低峰窗口由CronJob统一触发Pod滚动重建,应用新的资源设置。

无论规模大小,核心原则不变:先量化流量曲线,再定伸缩策略,最后用监控数据验证效果。从最小的HPA起步,逐步叠加VPA和多指标,就能让集群像中央厨房一样,把每一份算力都用在出餐的刀刃上。

yaml18 行
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:  name: ai-inference-hpaspec:  scaleTargetRef:    apiVersion: apps/v1    kind: Deployment    name: ai-inference  minReplicas: 2  maxReplicas: 8  metrics:    - type: Resource      resource:        name: cpu        target:          type: Utilization          averageUtilization: 60

AI 应用场景

AI推理服务的在线弹性伸缩

阶段:模型部署与在线推理

解决的问题:AI推理Pod平时占用GPU/CPU资源,但请求量在一天内波动极大。静态部署按峰值分配算力,夜间与凌晨大量资源闲置;按均值分配又会在高峰期打满CPU、拖慢推理响应。HPA按CPU利用率与QPS双指标动态调整副本数,VPA则基于历史用量画像为每个Pod推荐合理的内存与GPU请求,两者协同将闲置与超卖同时压到最低。

具体案例:一家人脸识别公司部署了门禁检测服务,工作日白天办公园区请求峰值可达2000 QPS,夜间几乎归零。团队为推理Deployment配置了minReplicas=2、maxReplicas=10的HPA,同时让VPA每24小时重新校准Pod的resources。运行一个月后,GPU平均利用率从35%提升到71%,云账单成本下降约40%。

离线批处理作业的资源画像

阶段:模型训练数据预处理

解决的问题:数据处理作业每天跑同一批Pipeline,但每份作业的数据量和计算复杂度不同。手动为每个作业设置资源请求,要么设太大浪费排队空间,要么设太小OOM Killer频繁触发。VPA会自动收集每次作业的历史用量,在新作业提交时给出经过校准的资源推荐,让作业能更快调度、更少失败。

具体案例:某推荐算法团队每天处理约1TB用户行为日志。引入VPA Off模式后,VPA对每个预处理作业输出推荐资源值,调度系统按推荐值自动填充作业的requests字段。一周后作业平均排队时间下降52%,OOM导致的失败重跑减少六成。

金融级混合负载平台的容量保障

阶段:多团队共享K8s集群的资源调度

解决的问题:多个AI团队共用一套K8s集群,在线推理、模型训练、数据分析负载互相争抢资源。需要一套既保证核心交易链路优先扩容,又让非核心作业合理利用闲散算力的调度机制。HPA支持自定义指标与优先级配置,VPA则为不同负载提供差异化资源画像。

具体案例:某金融科技公司的K8s集群同时运行风控推理服务、量化策略回测与特征工程任务。平台团队为风控服务配置了基于P99延迟的自定义指标HPA,优先级设为最高;对回测与特征工程任务采用VPA推荐+抢占式节点池,充分利用Spot实例的空闲容量。上线半年集群整体算力利用率提升25%,核心链路SLA保持在99.99%。

Python 演示

python53 行
"""模拟 HPA / VPA 弹性伸缩行为的小工具, 展示核心计算逻辑.""" import math  class ElasticScaler:    """一个同时演示 HPA 与 VPA 逻辑的简化集群伸缩器."""     def __init__(self, min_replicas, max_replicas, target_util):        self.min_replicas = min_replicas        self.max_replicas = max_replicas        self.target_util = target_util        self.replicas = min_replicas        self.cpu_history = []     def observe(self, cpu_usage):        self.cpu_history.append(cpu_usage)        if len(self.cpu_history) > 60:            self.cpu_history.pop(0)     def hpa_scale(self, current_util):        if current_util <= 0:            return self.replicas        ratio = current_util / self.target_util        desired = math.ceil(self.replicas * ratio)        return max(self.min_replicas, min(self.max_replicas, desired))     def vpa_recommend(self, percentile=90, margin=0.1):        if not self.cpu_history:            return self.target_util        sorted_data = sorted(self.cpu_history)        idx = min(len(sorted_data) - 1,                  int(percentile / 100 * len(sorted_data)))        return int(sorted_data[idx] * (1 + margin))  def main():    scaler = ElasticScaler(min_replicas=2, max_replicas=8, target_util=50)    loads = [30, 45, 60, 85, 95, 70, 50, 35, 40, 55,             75, 90, 60, 42, 28, 38, 52, 68, 82, 58]     print("t(min) 负载(%)  副本变化         VPA推荐request")    for minute, load in enumerate(loads):        scaler.observe(load)        old = scaler.replicas        scaler.replicas = scaler.hpa_scale(load)        action = "扩容" if scaler.replicas > old else "缩容" if scaler.replicas < old else "稳定"        rec = scaler.vpa_recommend()        print(f"{minute:5d}  {load:5d}   {old} -> {scaler.replicas}  [{action}]   {rec}m")  if __name__ == "__main__":    main()
目的:用一个可运行的简化模型,直观展示HPA的“副本数按比例计算”与VPA的“90分位推荐算法”是如何配合工作的。
  1. class ElasticScaler:定义一个模拟弹性伸缩器的类,同时封装HPA与VPA行为
  2. self.replicas = min_replicas初始副本数设为最小值,相当于餐厅先开2个工位
  3. self.cpu_history = []维护历史负载样本列表,供VPA计算推荐值
  4. ratio = current_util / self.target_util计算当前负载与目标利用率的比值,这是HPA的核心决策依据
  5. desired = math.ceil(self.replicas * ratio)按比例缩放副本数并向上取整,确保Pod数是完整整数
  6. return max(self.min_replicas, min(self.max_replicas, desired))将结果夹在min和max之间,防止扩到失控或缩到零
  7. sorted_data = sorted(self.cpu_history)对历史样本排序,为计算百分位数做准备
  8. idx = min(len(sorted_data) - 1, int(percentile / 100 * len(sorted_data)))定位90分位在排序后列表中的索引
  9. scaler.observe(load)将当前负载记录进历史,相当于主厨记下今天的火力档位
  10. scaler.replicas = scaler.hpa_scale(load)应用HPA计算结果,更新当前副本数

常见误区

误区我配置了HPA后,Pod会自动扩容缩容,资源问题不就全解决了吗?为什么还要再学一个VPA?平时也不见它有什么动静。

正解HPA只解决“开几个工位”的问题,完全不关心“每个工位够不够大”。如果Pod的requests设得过大,HPA从1个副本扩到2个就以为能消化两倍流量,实际每个Pod都闲着大半个CPU;如果requests设得过小,HPA会拼命扩容,导致副本数虚高。VPA负责把“每个工位”校准到合理尺寸,是HPA判断正确的先决条件。

为何常见:HPA名字里带"Autoscaler"且效果立竿见影(副本数肉眼可见地增减),容易让人误以为它就是弹性伸缩的全部。

误区我同时打开了HPA和VPA,两者都盯着CPU指标,Kubernetes应该会自动处理它们的优先级吧?结果集群副本数像心跳一样上下波动,谁也劝不住。

正解HPA的扩缩会改变单Pod平均负载,VPA的推荐值也会改变分子的基准——两者同时干预同一指标,形成典型的负反馈振荡。正确做法是“先VPA后HPA”:先用VPA校准资源基线,再让HPA基于新基线做动态扩缩;或者干脆让VPA管内存、HPA管CPU,各管各的维度。

为何常见:K8s官方文档分别介绍了HPA和VPA,但很少有人把“两者共用同一指标会打架”这条禁忌写在开头,新手组合使用就踩坑。

误区我用VPA的Auto模式改资源,以为它会像云硬盘扩容那样热插拔,Pod不用重启就能生效。结果业务低谷期Pod一个个重建,我一脸懵。

正解VPA调整resources字段后,需要重建Pod才能让新的requests/limits生效。Auto模式会自动执行“删除-重建”流程,所以必然带来短暂的中断。如果业务完全不能容忍重启,应改用Initial模式,或在业务低峰窗口配合CronJob统一滚动重启。

为何常见:很多云数据库和中间件提供了“在线扩容”能力,让人误以为K8s的资源调整也是无感知的,忽略了Pod是“不可变基础设施”这一前提。

误区我把HPA的min/max、目标利用率都设好了,还加了冷却时间,应该能稳定运行很久吧?后来发现流量翻倍后扩容还是跟不上,或者副本一直卡在上限。

正解弹性伸缩的配置需要持续校准。目标利用率设得太低会频繁扩容,设得太高会导致扩容滞后;镜像变大变重会拉长Pod就绪时间;业务流量模式变化也会让原本的推荐值失效。应该用Prometheus持续观测伸缩延迟、副本抖动率与资源闲置率,定期复盘并调整配置。

为何常见:弹性伸缩表面上是“设置完就自动跑”的机制,容易被忽略的是它依赖的指标、镜像、流量模式都在不断变化,需要像运营餐厅一样周期性翻台复盘。

面试题

Q1. 关于HPA的职责,下列说法正确的是?

单选题 · easy

  • A.按负载调整Pod副本数← 正确答案
  • B.按负载更新镜像版本号
  • C.按负载修改应用代码
  • D.按负载调整网络路由表

答案:A。HPA全称Horizontal Pod Autoscaler,水平Pod自动伸缩器,核心职责就是根据负载指标自动调整Deployment的副本数。它不负责改代码、换镜像、调网络;这些分别属于CI/CD和网络插件的工作。就像前台经理只管开几个工位,不会去改菜谱。

Q2. HPA计算期望副本数时采用的核心公式是?

单选题 · easy

  • A.副本数乘以负载数再除以目标值← 正确答案
  • B.副本数除以负载数再乘以目标值
  • C.目标值除以负载数再乘以副本数
  • D.负载数除以目标值再除以副本数

答案:A。HPA的核心公式是desiredReplicas = ceil(currentReplicas × currentMetricValue / desiredMetricValue)。负载是分子、目标是分母,比例大于1就扩容,小于1就缩容。把它想成“排队人数超过红线的倍数”就能记住:排队是分子,红线是分母。

Q3. VPA的四种更新模式中,哪种会在Pod创建时注入推荐值?

单选题 · easy

  • A.初始化模式← 正确答案
  • B.自动更新模式
  • C.关闭提醒模式
  • D.手动调整模式

答案:A。Initial模式只在Pod创建时注入VPA推荐值,后续不再更新,适合不允许中断的服务。Auto模式会自动重建Pod以应用新值;Off模式只出推荐不执行;没有“关闭提醒模式”这种说法。类比主厨只在开工前定一次灶台尺寸,就是Initial模式。

Q4. HPA默认的指标同步周期和缩容冷却时间分别是?

单选题 · mid

  • A.15秒同步与300秒冷却← 正确答案
  • B.30秒同步与120秒冷却
  • C.60秒同步与180秒冷却
  • D.5秒同步与30秒冷却

答案:A。HPA默认每15秒从Metrics Server同步一次指标,扩容不受冷却限制,但缩容默认有300秒(5分钟)冷却窗口。这个不对称设计是为了防止刚缩完容流量又回来,造成副本数抖动的“过山车”现象,相当于经理加完窗口要稳定一会儿再考虑撤。

Q5. HPA支持配置的常见指标包括哪些?

多选题 · mid

  • A.CPU利用率指标← 正确答案
  • B.内存利用率指标← 正确答案
  • C.自定义业务指标← 正确答案
  • D.镜像构建时长指标

答案:ABC。HPA v2支持三类指标:Resource指标(CPU/内存)、Pod与Object自定义指标(如QPS、请求延迟)、External外部指标(如Kafka积压量)。镜像构建时长属于CI/CD范畴,与运行时弹性伸缩无关。就像经理既看排队人数,也可以看翻台率,但不会关心采购员买菜花了多久。

Q6. 当VPA采用自动更新模式调整Pod资源时会发生什么?

单选题 · mid

  • A.副本数量自动增加一倍
  • B.镜像版本回滚到上一个
  • C.Pod重建以应用新资源← 正确答案
  • D.运行资源立即热更新

答案:C。Auto模式下VPA会调用API修改PodTemplate的resources字段,然后逐个删除并重建Pod,让新配置生效。这个过程必然伴随短暂中断。副本数由HPA或Deployment策略决定,VPA不会直接改副本数量,Pod资源也不支持热更新。就像主厨要换灶台,厨师得先停工片刻。

Q7. 为什么HPA与VPA同时使用CPU指标会发生振荡?

单选题 · mid

  • A.两者会改变副本数的基础比例
  • B.两者基于同一指标持续反复调节← 正确答案
  • C.两者都会重启Pod导致服务中断
  • D.两者会覆盖集群默认的资源设置

答案:B。HPA调整副本数改变“分摊到每个Pod的负载”,VPA调整request改变“利用率计算的基准线”,两者都在动CPU指标的分母或分子,形成负反馈循环:VPA调大request→利用率下降→HPA缩容→Pod变少→负载重新升高→VPA继续调大……映射到餐厅就是经理和主厨同时干预同一道菜的火候,永远达不成稳态。

Q8. 以下哪些组合策略有助于HPA和VPA协同?

多选题 · hard

  • A.先用VPA校准资源基线← 正确答案
  • B.VPA管内存HPA管CPU指标← 正确答案
  • C.同时基于CPU自动反复调节
  • D.配置Pod重启的安全窗口← 正确答案

答案:ABD。“先VPA后HPA”是主流实践,让资源基线稳定后再做副本弹性;让VPA管内存、HPA管CPU可以彻底避免指标冲突;配置Pod重启安全窗口(如仅在低峰期重建)能减少VPA重建对业务的影响。选项C同时基于CPU自动调节正是引发振荡的根源,应当避免。

Q9. 评估弹性伸缩稳定性时重点观察哪个指标?

单选题 · hard

  • A.集群总节点数量的规模
  • B.应用代码提交的频繁度
  • C.网络带宽的吞吐利用率
  • D.副本数短期内的抖动次数← 正确答案

答案:D。弹性伸缩的稳定性核心看“副本抖动率”——单位时间内扩缩方向切换的次数。抖动率高说明策略对指标过于敏感,会导致下游连接、缓存、负载均衡器反复重建。集群规模、代码提交频率和网络吞吐是其他维度的指标,不代表伸缩稳定性。相当于经理一分钟内加了又撤三个工位,客人肯定被折腾疯。

Q10. 关于不同规模场景的HPA/VPA适配建议,正确的有哪些?

多选题 · hard

  • A.小规模从HPA基础配置起步← 正确答案
  • B.大规模采用多维指标协同← 正确答案
  • C.所有场景都强制用VPA自动
  • D.运维能力有限先选简单方案← 正确答案

答案:ABD。小规模集群用HPA加固定requests就足够简单有效;大规模集群需要VPA资源画像、多指标HPA、监控告警等协同工作;运维能力有限时应优先选择复杂度最低的配置。选项C过于绝对,VPA Auto模式会重建Pod,很多允许中断敏感的业务并不适用。弹性伸缩没有银弹,只有与场景匹配的方案。