除了制作cronjob以清理完整的作业外,是否有一种方法可以自动删除已完成的作业?
K8S的工作文件指出,完成的工作的预期行为是要保持完整状态,直到手动删除为止。因为我每天通过cronjobs跑来成千上万的工作,而我不想继续完成工作。
您现在可以设置历史记录限制或完全禁用历史记录,因此失败或成功的cronjobs不会无限期地保存。在这里查看我的答案。文档在这里。
设置历史限制:
.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
这是从具有ttlSecondsAfterFinished
的1.12 alpha版本中。自动清理完成作业的一个示例:
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
使用字段selector:
kubectl delete jobs --field-selector status.successful=1
可以在cronjob中执行,类似于其他答案。
- 创建一个服务帐户,例如
my-sa-name
- 在列表中创建角色,并删除资源作业的权限
- 将角色附加在服务帐户(角色调节)
- 创建一个将使用服务帐户的cronjob,该帐户将检查完整的作业并删除它们
# 1. Create a service account
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa-name
namespace: default
---
# 2. Create a role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-completed-jobs-cleaner-role
rules:
- apiGroups: [""]
resources: ["jobs"]
verbs: ["list", "delete"]
---
# 3. Attach the role to the service account
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my-completed-jobs-cleaner-rolebinding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: my-completed-jobs-cleaner-role
subjects:
- kind: ServiceAccount
name: my-sa-name
namespace: default
---
# 4. Create a cronjob (with a crontab schedule) using the service account to check for completed jobs
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
# I'm using bitnami kubectl, because the suggested kubectl image didn't had the `field-selector` option
command: ["sh", "-c", "kubectl delete jobs --field-selector status.successful=1"]
restartPolicy: Never
我找到了以下工作
删除失败的作业:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 0' | awk '{print $1}')
删除完成的作业:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')
我正在使用wernight/kubectl的kubectl image
计划删除任何
的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
我最近构建了一个kubernetes-operator来执行此任务。
部署后,它将监视选定的命名空间,并在没有错误/重新启动的情况下删除完成的作业/POD。
https://github.com/lwolf/kube-cleanup-operator
使用jsonpath:
kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
如文档中所述"由用户删除旧作业",请参见http://kubernetes.io/docs/docs/user-guide/jobs/job-tenration - 清洁
我会运行一个基于工作名称和某些条件进行清理工作的豆荚,从而让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