一、先搞清楚:为什么需要两层伸缩?
很多人以为弹性伸缩就是"Pod多了自动加Pod"——这只说对了一半。
容器化应用的弹性伸缩,其实是两层独立但协同的机制:
| 层级 | 名称 | 缩写 | 管什么 | 响应速度 |
|---|---|---|---|---|
| 第一层 | 水平Pod自动伸缩 | HPA | Pod数量不够?自动加Pod | 秒级 |
| 第二层 | 集群自动伸缩 | CA | 节点不够放新Pod?自动加节点 | 分钟级 |
为什么需要两层?因为Pod需要节点来跑。
想象一下:流量洪峰来了,HPA拼命加Pod,但节点就那么几个,新Pod全部处于Pending状态——等不来节点,照样服务不了流量。
所以,正确的逻辑是:
流量洪峰 → HPA秒级增加Pod → Pod数超过节点容量 → CA分钟级增加节点 → 新Pod被调度 → 服务恢复
这两层配合起来,才是完整的弹性伸缩。缺了任何一层,要么扩容不及时,要么扩容了没地方放。
二、HPA:让Pod数量跟着流量走
2.1 HPA是什么?
HPA(Horizontal Pod Autoscaler)的工作原理非常简单:监控Pod的资源使用情况,超过阈值就加Pod,低于阈值就缩Pod。
它不管你的业务逻辑是什么,它只看一个指标——资源使用率。
| 监控指标 | 含义 | 适用场景 |
|---|---|---|
| CPU利用率 | Pod的CPU使用量 / CPU请求量 | CPU密集型应用,最常用 |
| 内存利用率 | Pod的内存使用量 / 内存请求量 | 内存密集型应用 |
| 自定义指标 | QPS、延迟、连接数等 | 需要额外适配器支持 |
2.2 HPA的核心参数:别瞎设
HPA的配置看起来简单,但参数设错了,要么扩容太慢,要么扩容太快,要么缩容太激进。
| 参数 | 含义 | 建议值 | 为什么 |
|---|---|---|---|
| minReplicas | 最小Pod数 | 2-3 | 生产环境至少2个,保证高可用 |
| maxReplicas | 最大Pod数 | 根据业务设定,通常是min的5-10倍 | 防止失控扩容把集群撑爆 |
| targetCPUUtilizationPercentage | 目标CPU利用率 | 60%-70% | 留30%余量应对突发流量 |
| targetMemoryUtilizationPercentage | 目标内存利用率 | 70%-80% | 内存比CPU更敏感,阈值设高一点 |
| 稳定窗口期 | 指标需持续多久才触发伸缩 | 3-5分钟 | 避免因瞬时抖动频繁扩缩容 |
最常见的错误:把目标CPU设成90%甚至100%。
这意味着什么?CPU已经快打满了才开始扩容——等新Pod起来,旧Pod可能已经被OOM Kill了。
正确做法:设在60%-70%。在资源还有余量的时候就开始扩容,给新Pod留出启动时间。
2.3 HPA的"冷启动"问题
HPA有一个天然的缺陷:新Pod需要时间启动,但流量不会等你。
从HPA检测到CPU超标,到新Pod启动完毕、加入Service、开始接收流量,通常需要30秒到2分钟。这段时间里,原有Pod还在扛——如果扛不住,服务就崩了。
解决方案:配合预 warm 机制或超额配置。
| 方案 | 做法 | 效果 |
|---|---|---|
| 预留资源 | Pod的CPU请求量设为实际使用量的80% | 给HPA留出缓冲空间 |
| 降低目标阈值 | targetCPU设为50%-60% | 提前扩容,不等打满 |
| 配合VPA | VPA调整资源请求,HPA调整Pod数量 | 双管齐下,更精准 |
| 预热Pod | 提前启动备用Pod,不接收流量 | 流量来了直接顶上 |
三、CA:让节点数量跟着Pod走
3.1 CA是什么?
CA(Cluster Autoscaler)的工作原理同样简单:监控集群中Pending状态的Pod,如果有Pod因为资源不足而调度失败,就自动加节点。
同时,当节点利用率过低时,CA会自动缩容——把空节点踢掉,节省成本。
| 触发条件 | 动作 | 响应时间 |
|---|---|---|
| 有Pod处于Pending状态超过一定时间 | 自动增加节点 | 2-5分钟 |
| 节点CPU利用率持续低于阈值(如50%)超过一定时间 | 自动删除节点 | 10-15分钟 |
3.2 CA的核心参数:防失控是第一要务
CA比HPA更"危险"——因为它操作的是节点,加一个节点意味着真金白银的成本。配错了,一晚上可能花掉你一个月的预算。
| 参数 | 含义 | 建议值 | 为什么 |
|---|---|---|---|
| minNodes | 最小节点数 | 与生产最低需求一致 | 保证基本服务能力 |
| maxNodes | 最大节点数 | 根据预算设定硬上限 | 防止失控扩容 |
| 缩容冷却时间 | 节点被标记可删除后,等多久才真删 | 10-15分钟 | 避免刚缩完又扩容,反复横跳 |
| 扩容冷却时间 | 加完节点后,多久不再加 | 2-3分钟 | 避免连续加节点 |
| 未就绪Pod阈值 | 多少个Pending Pod触发扩容 | 1-3个 | 太敏感会频繁扩容,太迟钝会影响服务 |
最致命的错误:不设maxNodes,或者设得太高。
某团队的真实事故:CA配置时忘了设maxNodes,凌晨流量暴涨触发HPA,HPA加Pod,Pod没地方跑触发CA,CA疯狂加节点——一晚上加了200个节点,账单直接爆了。
铁律:maxNodes必须设,而且要设一个你能接受的最大值。
3.3 CA的"缩容杀 Pod"问题
CA缩容时,会从利用率最低的节点开始删除。但如果那个节点上跑着关键服务的唯一实例——缩容直接把服务杀了。
解决方案:配合Pod反亲和性 + Pod优先级。
| 手段 | 做法 | 效果 |
|---|---|---|
| Pod反亲和性 | 同一服务的实例分散到不同节点 | CA缩容时不会一次性杀光所有实例 |
| Pod优先级 + 驱逐预算 | 关键服务设高优先级,CA缩容时优先驱逐低优先级Pod | 关键服务最后被缩容 |
| Pod Disruption Budget(PDB) | 设定最小可用实例数,如"至少保持2个" | CA缩容时不会让可用实例低于这个数 |
PDB是CA缩容的"刹车片"。没有PDB,CA可能把你的核心服务缩到只剩1个实例——下一个节点故障,服务就挂了。
四、HPA + CA 协同:最佳实践配置清单
| 配置项 | HPA设置 | CA设置 | 协同效果 |
|---|---|---|---|
| 最小副本 | 3 | 3节点 | 最低保障,任何一层都不会低于基线 |
| 最大副本 | 30 | 20节点 | 上限互锁,防止单方面失控 |
| 目标CPU | 60% | - | 提前扩容,不等打满 |
| 缩容冷却 | - | 10分钟 | 避免反复横跳 |
| PDB | 至少2个 | - | CA缩容不会杀到只剩1个 |
| 反亲和性 | AZ反亲和 | - | 实例跨AZ,CA缩容不会一锅端 |
这套配置的效果是:流量来了,HPA秒级加Pod;Pod没地方跑,CA分钟级加节点;流量退了,HPA缩Pod,CA缩节点——全自动,零人工干预。
五、进阶:VPA + HPA 组合拳
如果你觉得光靠HPA还不够精准,可以加上VPA(垂直Pod自动伸缩)。
| 对比 | HPA | VPA |
|---|---|---|
| 伸缩方向 | 水平(加Pod数量) | 垂直(调整单个Pod的CPU/内存) |
| 适用场景 | 流量波动大 | 资源配置不合理 |
| 响应速度 | 秒级 | 分钟级(需重启Pod) |
最佳组合:VPA管资源配置,HPA管Pod数量。
- VPA说:"这个Pod的CPU请求量应该从1核调到2核"
- HPA说:"现在需要从5个Pod扩到10个Pod"
两者配合,既保证每个Pod的资源合理,又保证Pod数量跟得上流量。
但注意:HPA和VPA不能同时调整同一指标(如CPU),否则会打架。通常的做法是:VPA管内存,HPA管CPU,各管各的。
六、实战避坑:弹性伸缩最容易犯的五个错
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 没有PDB就开CA | CA缩容把核心服务杀光 | 先配PDB,再开CA |
| HPA目标CPU设太高 | 扩容太慢,服务先崩 | 设60%-70%,提前扩容 |
| CA不设maxNodes | 失控扩容,账单爆炸 | 必须设硬上限 |
| 所有Pod挤在一个AZ | CA缩容一锅端 | 配置反亲和性,跨AZ分布 |
| 只配HPA不配CA | Pod加了但没地方跑 | 两层必须同时配 |
七、写在最后:弹性伸缩不是"锦上添花",是"生死线"
很多团队觉得弹性伸缩是"等业务做大了再配"——大错特错。
弹性伸缩应该在你上线第一天就配好。 因为你永远不知道流量什么时候会来。可能是一次正常的业务增长,可能是一次意外的热点事件,也可能是一次竞争对手的攻击。
没有弹性伸缩的集群,就像一辆没有安全气囊的车——平时开着没问题,出事了就是致命的。
HPA让你的Pod数量跟着流量走,CA让你的节点数量跟着Pod走,PDB让缩容不会杀死你的核心服务,反亲和性让故障不会一锅端。
这四件套配齐了,你的集群才真正"活"了——它会呼吸,会生长,会收缩,会自我保护。
你不需要半夜起来手动加节点了。你不需要盯着CPU曲线担心服务崩了。你不需要在流量退去后手动缩容省钱了。
这一切,都是弹性伸缩在替你扛。
现在就去检查你的集群:HPA开了吗?CA开了吗?PDB配了吗?反亲和性设了吗?maxNodes设了吗?
如果有任何一项没配——现在就去配。五分钟的事,可能救你一次生产事故。