EKS搭配Cluster Autoscaler时如何自动排空仅存CloudWatch监控Pod的冗余节点
EKS 搭配 Cluster Autoscaler 实现仅运行CloudWatch监控Pod节点自动排空方案
无法自动缩容的核心原因
Cluster Autoscaler 判定节点可缩容的核心前提是:节点上所有运行的Pod都满足可驱逐条件。当前冗余节点无法被自动排空的触发原因分为三类:
- Cluster Autoscaler 默认规则拦截:使用的v1.18.3版本默认开启
--skip-nodes-with-system-pods=true规则,只要节点上存在kube-system命名空间下、非DaemonSet、非MirrorPod类型的Pod,就会跳过该节点的缩容评估 - CloudWatch监控Pod的驱逐策略拦截:如果CloudWatch相关组件的Pod被打上
cluster-autoscaler.kubernetes.io/safe-to-evict: false注解,Cluster Autoscaler将不会驱逐该类Pod,直接阻断节点缩容流程 - 手动缩容操作无效的原因:执行的
eksctl scale nodegroup命令传入的目标节点数与节点组当前desired容量完全一致,未达到容量变更的触发阈值,因此返回无变更提示
可落地的配置调整步骤
- 优化Cluster Autoscaler启动参数
修改kube-system命名空间下的cluster-autoscalerDeployment的启动命令,调整/新增以下配置:- 显式设置
--skip-nodes-with-system-pods=false,取消对系统命名空间Pod的默认缩容拦截 - 保持现有
--skip-nodes-with-local-storage=false配置不变 - 可选配置
--scale-down-unneeded-time=1m,缩短闲置节点等待缩容的时长
- 显式设置
- 配置CloudWatch监控Pod的驱逐许可
找到部署CloudWatch Agent对应的工作负载(DaemonSet或普通Deployment),在其Pod模板的注解中添加cluster-autoscaler.kubernetes.io/safe-to-evict: "true",告知Cluster Autoscaler该类Pod可被驱逐。
CloudWatch Agent为无状态节点采集组件,工作负载会自动将该Pod调度到留存的正常节点,不会造成监控中断 - 调整节点组的容量配置
当前spot节点组仅配置了desiredCapacity=1、maxSize=10,未设置明确的minSize,Cluster Autoscaler的缩容底线默认对齐节点组的minSize值。执行以下命令更新节点组配置,允许无业务负载时节点组缩容到0节点:eksctl scale nodegroup --cluster=mixedCluster --name=scale-spot --nodes-min=0 --nodes=1 - 清理无效注解
移除cluster-autoscalerDeployment元数据上挂载的cluster-autoscaler.kubernetes.io/safe-to-evict: false注解,避免驱逐逻辑产生误判
调整后预期效果
当业务Pod全部缩容至0时,Cluster Autoscaler会自动识别仅运行CloudWatch监控Pod的闲置节点,按照优雅驱逐流程将节点上的监控组件重新调度到留存的活跃节点上,完成排空后将节点从节点组中移除,不会产生冗余空节点。
内容的提问来源于stack exchange,提问作者Alfian Firmansyah
相关产品推荐
相关产品推荐

