Kubernetes 1.22.1版本CronJobs执行完成后未自动清理Pod问题求助
问题成因
该问题是Kubernetes 1.22版本CronJob特性调整、配置错误或控制器异常共同导致的,核心可能的原因如下:
- 参数配置位置错误:
successfulJobsHistoryLimit和failedJobsHistoryLimit必须显式声明在CronJob的spec根层级,不能嵌套在jobTemplate.spec下,很多用户升级后修改配置时放错位置会直接导致参数不生效,你提供的测试YAML就未在正确层级声明这两个参数。 - CronJob控制器异常:升级后kube-controller-manager的CronJob同步线程未正常启动,或是启动参数
--concurrent-cron-job-syncs被设置为0,导致没有进程处理CronJob的历史清理逻辑。 - 资源存在残留Finalizer:集群内自定义控制器绑定的Finalizer残留在已完成的Job/Pod资源上,会拦截GC删除请求,导致资源无法被自动回收。
- 旧API版本资源冲突:Kubernetes 1.21起CronJob正式从
batch/v1beta1迁移到batch/v1,如果升级过程中旧版本API的CronJob资源未完全迁移,会和新版本资源冲突,导致控制器逻辑异常。
排查解决步骤
- 修正CronJob参数配置位置
这是1.22版本升级后最常见的错误,将两个历史保留参数放到CronJob的spec根层级,正确配置示例如下:
配置更新后执行apiVersion: batch/v1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" # 两个保留参数必须放在当前层级 successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 5 jobTemplate: spec: template: spec: containers: - name: hello image: busybox imagePullPolicy: IfNotPresent command: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailurekubectl apply -f <cronjob配置文件路径>,等待2~3个调度周期即可看到超出保留数量的历史Pod被自动清理。 - 检查kube-controller-manager状态
执行kubectl get pods -n kube-system | grep kube-controller-manager确认控制器Pod处于Running状态,查看控制器日志是否存在CronJob相关报错:
同时确认启动参数中没有设置kubectl logs -n kube-system <kube-controller-manager的Pod名称> | grep cronjob--concurrent-cron-job-syncs=0,该参数为0会直接关闭CronJob的同步清理逻辑。 - 清理残留Finalizer
执行kubectl get job <已完成的Job名称> -o yaml查看metadata.finalizers字段,如果存在非官方的自定义Finalizer且对应控制器已不在集群中,可手动删除Finalizer触发资源回收:kubectl patch job <已完成的Job名称> -p '{"metadata":{"finalizers":[]}}' --type=merge - 清理旧版本API残留资源
执行kubectl get cronjobs.batch/v1beta1 -A检查是否有旧版本API的CronJob残留,如果有可导出配置后删除旧版本资源,重新用batch/v1API创建即可。
内容的提问来源于stack exchange,提问作者cjw-k8
相关产品推荐
相关产品推荐

