除了制作一个 CronJob 来清除已完成的作业之外,是否还有一种方法可以自动删除已完成的作业?
K8s 工作文件指出,已完成的作业的预期行为是让它们保持在完成状态,直到手动删除。因为我每天通过 CronJobs 运行成千上万的工作,我不想把已经完成的工作留在身边。
如文档中所述“由用户来删除旧作业”,请参见 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
您现在可以设置历史记录限制,或者完全禁用历史记录,这样失败或成功的 CronJobs 就不会无限期地保留下来。看我的答案 给你。文档是 给你。
设定 历史界限:
.spec.successfulJobsHistoryLimit和 .spec.failedJobsHistoryLimit字段是可选的。这些字段指定应保留多少个已完成和失败的作业。默认情况下,它们分别设置为3和1。对 0设置一个限制,相当于在完成任务之后不保留任何相应类型的任务。
.spec.successfulJobsHistoryLimit
.spec.failedJobsHistoryLimit
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
我最近构建了一个 kubernetes 运算符来完成这个任务。
部署之后,它将监视选定的名称空间,如果已完成的作业/pods 没有错误/重启,则删除它们。
Https://github.com/lwolf/kube-cleanup-operator
我已经找到了下面的工作
删除失败的作业:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 0' | awk '{print $1}')
删除已完成的作业:
kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')
使用 jsonpath:
kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
这可以从版本1.12 Alpha 和 ttlSecondsAfterFinished中得到。 自动清理已完成的作业的一个例子:
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
我用的是 Wernight/Kubectl的 Kubectl 图像
安排一个 cron 删除任何
completed
2 - 9 days old
它每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
另一种方式 使用字段选择器:
kubectl delete jobs --field-selector status.successful=1
这可以在一个错误的执行,类似于其他答案。
my-sa-name
# 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