k8s自动清理已完成的job
自动清理完成的 Job
完成的 Job 通常不需要留存在系统中。在系统中一直保留它们会给 API 服务器带来额外的压力。 如果 Job 由某种更高级别的控制器来管理,例如 CronJobs, 则 Job 可以被 CronJob 基于特定的根据容量裁定的清理策略清理掉。
TTL成品资源控制器
TTL控制器提供TTL(生存时间)机制来限制已完成执行的资源对象的生存期。TTL控制器仅处理 职位 目前,它可能会扩展为处理其他将完成执行的资源,例如Pods和自定义资源。
Alpha免责声明:此功能当前为Alpha,可通过kube-apiserver和kube-controller-manager功能gate 启用 TTLAfterFinished。
- 操作实践:
在kube-apiserver.yaml和kube-controller-manager.yaml加入- --feature-gates=TTLAfterFinished=true命令
cat /etc/kubernetes/manifests/kube-controller-manager.yaml
apiVersion: v1
...
spec:
containers:
- command:
...
- --service-account-private-key-file=/etc/kubernetes/pki/sa.key
- --use-service-account-credentials=true
- --feature-gates=TTLAfterFinished=true
e
...
cat /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
...
spec:
containers:
- command:
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
- --feature-gates=DynamicKubeletConfig=true,TTLAfterFinished=true
...
重启kubelet:systemctl restart kubelet
已完成 Job 的 TTL 机制
FEATURE STATE: Kubernetes v1.12 [alpha]
自动清理已完成 Job (状态为 Complete 或 Failed)的另一种方式是使用由 TTL 控制器所提供 的 TTL 机制。 通过设置 Job 的 .spec.ttlSecondsAfterFinished 字段,可以让该控制器清理掉 已结束的资源。
TTL 控制器清理 Job 时,会级联式地删除 Job 对象。 换言之,它会删除所有依赖的对象,包括 Pod 及 Job 本身。 注意,当 Job 被删除时,系统会考虑其生命周期保障,例如其 Finalizers。
例如:
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
Job pi-with-ttl 在结束 100 秒之后,可以成为被自动删除的标的。
如果该字段设置为 0,Job 在结束之后立即成为可被自动删除的对象。 如果该字段没有设置,Job 不会在结束之后被 TTL 控制器自动清除。
注意这种 TTL 机制仍然是一种 Alpha 状态的功能特性,需要配合 TTLAfterFinished 特性门控使用。有关详细信息,可参考 TTL 控制器的文档。
查看pod运行状态
kubectl describe jobs/pi-with-ttl
查看pod日志
pods=$(kubectl get pods --selector=job-name=pi-with-ttl --output=jsonpath='{.items[*].metadata.name}')
echo $pods
kubectl logs $pods