除了制作CronJob来清理已完成的作业外,是否有办法自动删除已完成的作业?
该K8S工作文件规定,完成作业的预期行为是他们留在已完成的状态,直到手动删除。因为我每天要通过CronJobs运行数千个Jobs,所以我不想保留完整的Jobs。
Answers:
现在,您可以设置历史记录限制,或完全禁用历史记录,这样就不会无限期地保留失败或成功的CronJob。在这里查看我的答案。文档在这里。
设置历史记录限制:
在
.spec.successfulJobsHistoryLimit
和.spec.failedJobsHistoryLimit
领域都是可选的。这些字段指定应保留多少已完成和失败的作业。默认情况下,它们分别设置为3和1。将限制设置为0
对应于在完成所有相应类型的作业后将其保留。
限制为0的配置如下所示:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
CronJob
对象(询问者提到的Job
对象),而不适用于对象。
从1.12 Alpha版本开始可以使用ttlSecondsAfterFinished
。自动清除已完成的作业中的一个示例:
apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-ttl
spec:
ttlSecondsAfterFinished: 100
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
Note that this TTL mechanism is alpha, with feature gate TTLAfterFinished
我不了解此功能门部分。
ttlSecondsAfterFinished
,没有特征门就没有效果。
我发现以下工作
要删除失败的作业:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 0' | awk '{print $1}')
删除完成的作业:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')
kubectl delete jobs $(kubectl get jobs | awk '$2 ~ 1/1' | awk '{print $1}')
我正在使用wernight / kubectl的kubectl图像
安排cron删除任何
completed
2 - 9 days old
(所以我有2天的时间来审查所有失败的工作)它每30分钟运行一次,所以我不负责10天以上的工作
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cleanup
spec:
schedule: "*/30 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: kubectl-runner
image: wernight/kubectl
command: ["sh", "-c", "kubectl get jobs | awk '$4 ~ /[2-9]d$/ || $3 ~ 1' | awk '{print $1}' | xargs kubectl delete job"]
restartPolicy: Never
awk
命令,您$2 ~ /^1/
不是要代替第二个条件$3 ~ 1
吗?我假设您正在查看的是第二列的完成列,至少对我而言,并且完成列的打印方式大约是这样0/1
,1/1
因此获取第一个字符很重要。也许您的输出kubectl get job
是不同的。
awk
命令组合为一个。我测试了以下内容,并将其替换为上述awk组件:awk '$4 ~ /^[2-9]d/ || $2 ~ /^1/ {print $1}'
我最近建立了一个kubernetes-operator来完成此任务。
部署后,它将监视选定的名称空间,并删除已完成的作业/窗格,如果它们已完成且没有错误/重新启动。
使用字段选择器的另一种方式:
kubectl delete jobs --field-selector status.successful=1
在cronjob中运行该脚本的另一种方法是,与另一个答案类似:
创建具有批处理/职位列表的服务帐户并删除权限;它使用bitnami kubectl,因为建议的kubectl图像没有field-selector
选项
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: jobs-cleanup
spec:
schedule: "*/30 * * * *"
jobTemplate:
spec:
template:
spec:
serviceAccountName: my-sa-name
containers:
- name: kubectl-container
image: bitnami/kubectl:latest
command: ["sh", "-c", "kubectl delete jobs --field-selector status.successful=1"]
restartPolicy: Never
如文档“由用户决定删除旧作业”中所述,请参见http://kubernetes.io/docs/user-guide/jobs/#job-termination-and-cleanup
我将运行一个Pod来根据工作名称和某些条件进行清理,从而让kubernetes至少在这里照顾您的过程的可用性。您可以为此执行一个定期作业(假设您运行kubernetes 1.5)。
通过运行cron作业删除它们的简单方法:
kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do kubectl delete jobs $line; done
kubectl delete job $(kubectl get jobs -o jsonpath='{.items[?(@.status.completionTime)].metadata.name}')