web-dev-qa-db-ja.com

Kubernetesジョブクリーンアップ

私が理解していることから、Jobオブジェクトは一定時間後にポッドを刈り取ることになっています。しかし、私のGKEクラスター(Kubernetes 1.1.8)では、「kubectl get pods -a」は数日前からポッドをリストできるようです。

すべてはJobs APIを使用して作成されました。

Kubectl delete jobsでジョブを削除した後、ポッドも削除されたことに気付きました。

ここでの私の最大の懸念は、バッチジョブでクラスター上で数千から数万のポッドを実行することであり、内部バックログシステムを過負荷にしたくないことです。

22
Lior Regev

Kubernetes 1.6(およびv2alpha1 apiバージョン)から開始するように見えますが、cronjobsを使用してジョブを作成する(つまり、ポッドを作成する)場合、 limit 保持されている古いジョブの数。ジョブ仕様に次を追加するだけです。

successfulJobsHistoryLimit: X
failedJobsHistoryLimit: Y

XおよびYは、システムが保持する以前に実行されたジョブの数の制限です(デフォルトでは[バージョン1.5以降]でジョブを無期限に保持します)

編集2018-09-29

新しいK8Sバージョンの場合、これに関するドキュメントの更新されたリンクはこちらです:

50
JJC

ジョブを手動で削除する必要があったことは事実です。 @pujaの答えは執筆時点で正しかった。

Kubernetes 1.12.0はTTL機能(アルファ版)をリリースしました。この機能では、完了後指定された秒数でジョブを自動的にクリーンアップするように設定できます( changelog )。すぐにクリーンアップするためにゼロに設定できます。 Jobs docs を参照してください。

ドキュメントの例:

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

これは、Kubernetes 1.3でもJobsが意図した動作です。ジョブとそのポッドは、手動で削除するまでシステムに残ります。これは、すでに何らかのメカニズムによって外部に転送されていないポッドの結果を(つまりログを介して)確認したり、エラー、警告、またはその他の診断出力を確認したりする方法を提供します。

推奨/ 公式 ポッドを取り除く方法は、上記のようにジョブを削除することです。ガベージコレクターを使用するとポッドが削除されるだけですが、ジョブ自体はまだシステム内にあります。

ジョブを手動で削除したくない場合は、クラスターで実行されている小さなスクリプトを作成し、完了したジョブをチェックして削除します。悲しいことに、スケジュールされたジョブは 1.4で導入 のみですが、代わりに通常のポッドでスクリプトを実行できます。

2
puja

Kubernetes v1.2には、グローバルしきい値--terminated-pod-gc-threshold=12500コントローラマネージャ のフラグを参照してください。終了したポッドのGCメカニズムを認識していません。 v1.1.8では、スクリプト/ポッドを実行してポッド/ジョブを定期的にクリーンアップし、マスターコンポーネントが圧倒されるのを防ぐことができます。ところで、 GCしきい値を自動的に調整する]

1
Yu-Ju Hong

最近、このタスクを実行するためにkubernetes-operatorを作成しました。

展開後、選択したネームスペースを監視し、エラー/再起動なしで完了したジョブ/ポッドを削除します。

https://github.com/lwolf/kube-cleanup-operator

1
lwolf