除了制作 CronJob 来清理已完成的作业之外,还有没有办法自动删除已完成的作业?
K8s作业文档指出,已完成作业的预期行为是让它们保持已完成状态,直到手动删除。因为我每天通过 CronJobs 运行数千个作业,我不想保留已完成的作业。
除了制作 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
这可以从 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
我发现下面的工作
要删除失败的作业:
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 --field-selector status.successful=1
这可以在 cronjob 中执行,类似于其他答案。
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
我正在使用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
我最近构建了一个 kubernetes-operator 来完成这项任务。
部署后,它将监控选定的命名空间并删除已完成的作业/pod,如果它们完成且没有错误/重新启动。
使用 jsonpath:
kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
如文档“由用户决定是否删除旧作业”中所述,请参阅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