如何防止AWS EKS集群自动扩缩容终止CronJob运行中的Pod
解决方案
1. 核心配置:添加Cluster Autoscaler驱逐保护Annotation
你遇到的节点删除是集群自动扩缩容组件(Cluster Autoscaler)的默认逻辑:当节点资源使用率低于阈值时,会尝试驱逐节点上所有Pod后删除节点以节省成本。你只需给脚本Pod添加指定Annotation,就能让Cluster Autoscaler判定该节点存在不可驱逐的Pod,不会主动触发该节点的缩容操作,从根源避免脚本被中断。
注意:Annotation的值必须为字符串格式的
"false",若省略引号被解析为布尔值会导致配置不生效。
2. 附加配置:高优先级类避免资源抢占
如果集群内存在其他可抢占的工作负载,可额外创建高优先级PriorityClass绑定给脚本Pod,确保脚本Pod的调度优先级高于普通业务Deployment,不会被其他工作负载挤占资源:
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority-batch-job value: 1000000 globalDefault: false description: "批量任务专用高优先级类,避免被驱逐"
3. 适配Spot实例中断场景
由于你使用的是Spot实例伸缩组,除了Cluster Autoscaler缩容外还可能遇到AWS主动回收Spot实例的场景,可额外做两个配置规避:
- 将Pod的
terminationGracePeriodSeconds设置为1800(即30分钟,大于脚本最大运行时长15分钟),就算节点收到Spot中断通知,kubelet也不会强制杀死正在运行的脚本Pod,会等脚本执行完成后再处理 - 可选:给Pod添加节点亲和性,优先调度到中断频率更低的Spot实例规格,或直接调度到按需实例节点,完全规避Spot中断风险
4. 完整CronJob配置示例
apiVersion: batch/v1 kind: CronJob metadata: name: daily-batch-script spec: schedule: "0 2 * * *" # 替换为你实际的定时规则 concurrencyPolicy: Forbid jobTemplate: spec: template: metadata: annotations: # 禁止Cluster Autoscaler驱逐该Pod cluster-autoscaler.kubernetes.io/safe-to-evict: "false" spec: priorityClassName: high-priority-batch-job containers: - name: script-runner image: your-script-image:latest # 替换为你实际的脚本镜像 resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "2" memory: "4Gi" restartPolicy: OnFailure # 终止宽限时间设为30分钟,大于脚本最大运行时长 terminationGracePeriodSeconds: 1800 backoffLimit: 2 # 脚本异常时最多重试2次
上述配置生效后,脚本运行期间所在节点不会被自动缩容,等脚本执行完成Pod销毁后,节点会自动进入正常的缩容逻辑,完全适配你的业务流程。
内容的提问来源于stack exchange,提问作者robliv
相关产品推荐
相关产品推荐

