普通状态下的job,如果用 apply 或者 create 会出现 unchanged 或者是 name 已经存在的问题
但是很多情况下,我有一个yaml,就是需要偶尔手动执行一下 (不需要cron)
- 首先使用 generateName + kubectl create , 每次回生成一个新的名字
- 加入 ttl ,这样创建的旧job 会得到及时清理
apiVersion: batch/v1
kind: Job
metadata:
generateName: pi-with-ttl-
spec:
ttlSecondsAfterFinished: 10
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
需要额外注意的是 job ttl 是 1.21 的新特性,在旧版本的 Kubernetes 中你可能需要使用 cronjob 来定期清理这些执行过的job
kubectl delete jobs `kubectl get jobs -o custom-columns=:.metadata.name -n lizhe` -n lizhe
但是上面的解决方案还有一个硬伤就是 cronjob 可能会误删除正在运行中的 job
要格外小心