完了したジョブをクリーンアップするcronジョブを作成する以外に、完了したジョブを自動的に削除する方法はありますか?
K8s Job Documentation は、完了したジョブの意図された動作は、手動で削除されるまで、完了した状態のままにすることであると述べています。私はk8s cronjobを介して1日に数千のジョブを実行しているため、完了したジョブを保持したくないのです。
これは、バージョン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}')
「古いジョブを削除するのはユーザー次第」というドキュメントに記載されているように、 http://kubernetes.io/docs/user-guide/jobs/#job-termination-and-cleanup を参照してください
ポッドを実行して、ジョブ名と特定の条件に基づいてこのクリーンアップを実行するため、少なくともここでプロセスの可用性をkubernetesが処理できます。このために繰り返しジョブを実行できます(kubernetes 1.5を実行すると仮定)。
最近、このタスクを実行するためにkubernetes-operatorを作成しました。
デプロイ後、選択したネームスペースを監視し、エラー/リスタートなしで完了した場合、完了したジョブ/ポッドを削除します。
Jsonpathの使用:
kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
Cronジョブを実行してそれらを削除する簡単な方法:
kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do kubectl delete jobs $line; done
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