集群节点自动扩缩容原理
在 Serverless 集群中,节点自动扩缩容是保障弹性与成本平衡的核心能力。本章深入剖析 Cluster Autoscaler 的工作原理、节点组与节点池的设计模式,以及扩缩容决策的完整流程,帮助您理解底层机制,为后续成本优化策略打下坚实基础。
Cluster Autoscaler 工作原理
Cluster Autoscaler(CA)是 Kubernetes 生态中负责节点级别自动扩缩容的标准组件。它持续监控集群中 Pod 的调度状态,当 Pod 因资源不足而处于 Pending 状态时,触发扩容;当节点利用率持续低于阈值且 Pod 可被重新调度时,触发缩容。
核心原则:CA 不直接管理 Pod 的创建与销毁,而是通过调整节点数量来满足 Pod 的调度需求。它始终以 Pod 的调度状态作为决策依据。
工作流程分解
- 扫描未调度 Pod:CA 定期(默认每 10 秒)检查集群中是否存在因资源不足而无法调度的 Pod。
- 模拟调度:对于每个未调度的 Pod,CA 尝试将其调度到现有节点上。如果失败,则进入扩容流程。
- 扩容决策:CA 根据节点组配置(如云服务商、实例类型、可用区)选择合适的节点组,并计算需要扩容的节点数量。
- 调用云服务商 API:CA 通过云服务商接口(如 AWS Auto Scaling Groups、GCP Managed Instance Groups、Azure VMSS)创建新节点。
- 节点注册与就绪:新节点启动后,自动注册到集群,kubelet 上报状态,节点变为 Ready 状态。
- Pod 调度:调度器将之前 Pending 的 Pod 调度到新节点上,完成扩容。
缩容流程
- 节点利用率评估:CA 定期(默认每 10 秒)检查所有节点的资源利用率(CPU、内存)。
- 候选节点筛选:利用率低于阈值(默认 50%)的节点进入候选列表。
- Pod 可迁移性检查:CA 模拟将候选节点上的所有 Pod 迁移到其他节点。如果所有 Pod 都能被成功调度,则该节点可被缩容。
- 节点排空与删除:CA 对目标节点执行
kubectl drain,驱逐 Pod,然后调用云服务商 API 删除节点。
避坑提示:CA 不会驱逐由 DaemonSet、本地存储 Pod 或设置了
cluster-autoscaler.kubernetes.io/safe-to-evict: false 注解的 Pod。在设计应用时,应避免使用本地存储,或为关键 Pod 设置合理的 PDB(PodDisruptionBudget)。
节点组与节点池设计
节点组(Node Group)是 CA 进行扩缩容的基本单元,它对应云服务商的一个实例组(如 AWS ASG、GCP MIG)。节点池(Node Pool)是更高层次的抽象,通常用于管理具有相同配置(如实例类型、标签、污点)的一组节点。
| 概念 | 定义 | 典型用途 | 扩缩容粒度 |
|---|---|---|---|
| 节点组 | 云服务商层面的实例组,CA 直接操作的对象 | 管理同一实例类型、同一可用区的节点集合 | 按组扩容,按节点缩容 |
| 节点池 | Kubernetes 层面的逻辑分组,可包含多个节点组 | 区分不同工作负载(如 GPU 池、Spot 池、通用池) | 按池配置扩缩容策略 |
节点池设计原则
- 按工作负载类型划分:将计算密集型、内存密集型、GPU 密集型工作负载分别放入不同的节点池,避免资源争抢。
- 按成本策略划分:为 Spot 实例、预留实例、按需实例分别创建节点池,实现成本分层。
- 按可用区划分:为每个可用区创建独立的节点组,实现高可用部署。
- 设置最小/最大节点数:为每个节点池设置合理的扩缩容边界,防止无限扩容导致成本失控。
成本陷阱:如果所有工作负载共享一个节点池,高优先级任务可能抢占低优先级任务的资源,导致低优先级任务频繁被驱逐,反而增加调度开销和成本。务必按优先级或工作负载类型隔离节点池。
扩缩容决策流程
CA 的扩缩容决策并非简单的“有 Pod Pending 就扩容”,而是经过多轮评估和模拟,确保决策的合理性和稳定性。
关键决策参数
| 参数 | 默认值 | 说明 | 优化建议 |
|---|---|---|---|
--scan-interval |
10s | CA 扫描集群状态的频率 | 对于突发流量场景,可缩短至 5s;对于稳定场景,可延长至 30s 以减少 API 调用 |
--scale-down-delay-after-add |
10m | 扩容后等待多久才允许缩容 | 避免频繁扩缩容导致的抖动,建议保持默认或适当延长 |
--scale-down-unneeded-time |
10m | 节点利用率低于阈值后,等待多久才触发缩容 | 对于波峰波谷明显的业务,可缩短至 5m;对于稳定业务,可延长至 15m |
--max-nodes-total |
无限制 | 集群最大节点数 | 必须设置,防止扩容失控导致成本爆炸 |
扩缩容决策中的常见问题
- 扩容延迟:云服务商创建节点需要时间(通常 2-5 分钟),导致 Pod 启动延迟。解决方案:使用 PDB(Pod Disruption Budget)配合 HPA 提前扩容,或使用“原地扩容”技术(如 Karpenter)。
- 缩容抖动:节点利用率在阈值附近波动,导致节点频繁被创建和删除。解决方案:设置
--scale-down-delay-after-add和--scale-down-unneeded-time参数,增加缩容的“冷静期”。 - 节点组选择错误:CA 可能选择成本较高的节点组进行扩容。解决方案:为节点组设置优先级标签,或使用自定义调度策略。
最佳实践:在生产环境中,建议同时启用 Cluster Autoscaler 和 HPA(Horizontal Pod Autoscaler)。HPA 负责 Pod 级别的水平伸缩,CA 负责节点级别的资源供给,两者协同工作,实现端到端的弹性伸缩。