除了创建CronJob清理已完成的任务,还有没有自动删除已完成任务的方法?
K8s Job文档指出,已完成的任务应该保持完成状态,直到手动删除。但因为我每天通过CronJobs运行数千个任务,不想保留已完成的任务。
除了创建CronJob清理已完成的任务,还有没有自动删除已完成任务的方法?
K8s Job文档指出,已完成的任务应该保持完成状态,直到手动删除。但因为我每天通过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
ttlSecondsAfterFinished
如果没有设置功能门则无效。 - technazi使用字段选择器的另一种方式:链接
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
我发现以下方法可行
要删除失败的作业:
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}')
- user2804197kubectl get jobs | awk '$2 ~ "1/1" {print $1}' | xargs kubectl delete job
。 - visit1985我正在使用wernight/kubectl的kubectl镜像
计划设定一个定时任务,删除以下任何内容:
已完成的作业
2 - 9天之前的作业
(这样我就有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
输出不同。 - Stephenawk
命令合并为一个。我测试了以下内容,它可以替换上面 awk 组件的功能:awk '$4 ~ /^[2-9]d/ || $2 ~ /^1/ {print $1}'
。 - Stephen我最近建立了一个Kubernetes操作器来执行此任务。
部署后,它将监视所选命名空间,并删除已完成的作业/ Pod(如果它们没有错误/重启)。
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
kubectl delete job $(kubectl get jobs -o jsonpath='{.items[?(@.status.completionTime)].metadata.name}')
- Payman
successfulJobsHistoryLimit
即可吗?例如,如果作业每天运行一次,则为7
;如果作业每天运行两次,则为14
,以此类推。 - David Parkskubectl create job --from=cronjob/cronjob-template foojob
创建的作业)。后者是有意不支持的。 - chb