GKE抢占式节点上Pod长期处于Error/Completed状态的问题求助
问题背景
集群为GKE 1.24.7-gke.900,包含两个节点池:primary是抢占式highmem-n1节点、secondary为标准highmem-n1节点,节点池版本均为1.24.5-gke.600。抢占式节点因24小时回收或资源抢占被终止时,其上的非Job Pod会进入Failed/Completed状态(示例Pod状态如下),但Kubernetes未自动清理,导致大量此类Pod堆积:
Status: Failed
Reason: Terminated
Message: Pod was terminated in response to imminent node shutdown.
可行解决办法
调整PodGC触发阈值
Kubernetes的Pod垃圾回收器(PodGC)默认在终止状态Pod总数超过terminated-pod-gc-threshold(默认12500)时才启动清理。如果集群中抢占式节点数量多、Pod密度大,可能还没达到阈值就已经堆积大量Pod。
在GKE中,可通过更新集群配置,添加--kube-controller-manager-arg=terminated-pod-gc-threshold=<自定义数值>(比如设为1000)来降低触发阈值,让PodGC更早介入清理。给Pod配置TTL自动清理
Kubernetes 1.24中TTLAfterFinished特性已稳定,可为Pod添加ttlSecondsAfterFinished字段,指定Pod进入终止状态后多久自动被清理。
不管是单独创建的Pod,还是Deployment、StatefulSet等控制器管理的Pod,都可以在Pod模板中加入该配置:spec: containers: - name: your-container image: your-image ttlSecondsAfterFinished: 3600 # 终止后1小时自动清理,可按需调整时长检查GKE节点驱逐配置
确认GKE节点的pod-eviction-timeout配置(默认5分钟),确保节点在收到抢占通知后,能正常将Pod标记为终止状态,避免因驱逐异常导致Pod无法被PodGC识别。可通过GKE控制台或gcloud命令查看节点池的驱逐配置。应急手动清理
如果需要立即清理堆积的Pod,可使用kubectl批量删除:# 清理所有Failed状态的Pod kubectl delete pods --field-selector=status.phase=Failed # 清理所有Completed状态的Pod kubectl delete pods --field-selector=status.phase=Succeeded
内容的提问来源于stack exchange,提问作者Withel

