控制器清理旧任务,避免集群被已完成的工作塞满

Kubernetes CronJob 需要历史清理策略

CronJob 本身不跑你的任务:它创建一个 Job,Job 再创建 Pod。Pod 跑完之后,Job 和 Pod 都不会自动消失。Pod 是故意留着的,好让你事后还能读到它的日志;Job 留着,是为了让你还能看到这次运行的状态。 这份默认对一次运行是对的,对一万次运行就是错的。每一个已完成的 Job 都是 etcd 里的一个对象、每次列表响应里的一行,以及所有关心 Job 的控制器都会收到的一次 watch 事件。给这堆东西设边界的有两套彼此独立的机制:CronJob 控制器按数量裁的历史上限,和 TTL 控制器按时间裁的 TTL。 已完成的 Job 并不免费 已完成的 Job 会留住它的 Pod,而 Pod 只要还在,容器日志就还在。于是保留策略成了你和“命名空间堆满墓碑”之间唯一的东西。按小时调度跑三十天就是 720 次运行:720 个 Job 加 720 个 Pod,每个都有自己的名字、状态、owner reference,以及你每次 kubectl get jobs 输出里的一行。已完成的 Job 也不是完全静止的:它的 status conditions 一直留在 API 里,被每个 watcher 反复读取。单个对象的开销微不足道,但它是随时间线性增长的,所以它长期保持隐形,直到某天突然变成问题。 ...

二月 25, 2028 · 2 分钟 · XB Field Notes