首页/云/Kubernetes 速查/节点自动扩缩容(Cluster Autoscaler 思路)
调度与资源52 条

节点自动扩缩容(Cluster Autoscaler 思路)

Pod 因资源不足 Pending 时增加节点、节点长期低压时缩容;与 HPA 分工不同:HPA 调副本数,CA 调节点数。

Kubernetes 速查云更新于 2026-10-13

谁在调节点数量

Cluster Autoscaler 管的是节点维度:Pod 因资源不足一直 Pending 时,它尝试扩容节点池;节点长期低负载且上面的 Pod 可以迁移时,它缩容回收节点。它和 HPA 的分工不同——HPA 调副本数,Cluster Autoscaler 调节点数,两者配合才能既扩出容量又有地方落地。云上通常是托管组件或独立部署的控制器,工作效果依赖节点池的标签、污点与云侧配额设置。

基本信息

适用场景具备弹性节点池的集群,云上与自建环境形态不同
扩容触发Pod 因资源不足 Pending,且现有节点无法容纳
缩容触发节点长期低负载且上面的 Pod 可以被迁移
关键依赖节点池标签与污点需匹配 Pod 的调度约束
观察入口Pending 的 Pod 事件与控制器日志

典型使用场景

  • 突发流量:副本扩出来后需要新节点承接,避免长期 Pending
  • 夜间收敛:低峰期回收空闲节点降低资源成本
  • 节点池分层:按机型划分池子,让不同任务落到合适机型
  • 容量告警:借扩容动作发现容量规划与业务增长的偏差
  • 演练容灾:观察节点不可用时 Pod 能否被重新调度到新节点

观察链路

观察链路
kubectl get pod -A --field-selector status.phase=Pending
kubectl describe pod pending-x | grep -A3 Events            # 区分资源不足与约束不匹配
kubectl get nodes -L topology.kubernetes.io/zone -L node.kubernetes.io/instance-type
kubectl get events -A --field-selector reason=NotTriggerScaleUp | tail -5
kubectl -n kube-system logs deploy/cluster-autoscaler --tail=30

常见现象与确认方向

现象可能原因确认方向
Pod 长期 Pending节点容量不足或调度约束过严看事件是资源不足还是约束不匹配
扩了节点仍然 Pending新节点标签或污点不匹配核对节点池模板与 Pod 约束
节点不缩容存在不可迁移的 Pod 或预算保护查预算、本地存储与 DaemonSet
完全没有扩容动作云侧配额或节点池上限看控制器日志与云配额余量
只配 HPA 不管节点容量,副本扩出来照样没有地方调度,最终还是停在 Pending:副本弹性与节点弹性要作为一件事来评估。
缩容受可用性约束:有本地存储、被可用性预算保护、或无法迁移的 Pod 都会阻滞回收,节点长期回收不掉时优先检查这些原因。

易错点

  • 节点池标签或污点与 Pod 约束不匹配:扩出来的节点也放不下,看起来像扩容没生效
  • 云侧配额已满:扩容请求被拒绝,只有控制器日志里有明确提示,容易误判为组件无动作
  • 忽略缩容的可用性约束:缩容与业务高峰叠加,出现容量紧张
  • 不看 Pending 的具体原因:把调度约束问题当成容量问题,反复扩容却始终没有效果

数据来源与参考

  • Kubernetes 社区项目文档 · Cluster Autoscaler
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌