ジョブコンセプトKubernetes では、Deployment と DaemonSet が引き続きタスクを実行します。これらのポッド内のプロセスはクラッシュして終了すると再起動され、完了状態に達することはありません。プロセスが終了した後に再開しない、1 回限りの完全なタスクを実行する必要があるシナリオに遭遇することがあります。この場合、ジョブ リソース タイプが最適です。 Kubernetes は、ジョブ リソースを通じてこれをサポートしており、これにより、内部プロセスが正常に完了したときにコンテナを再起動しないポッドを実行できます。タスクが完了すると、ポッドは完了状態にあると見なされます。ノードに障害が発生すると、そのノード上のジョブによって管理されるポッドは、タスクが正常に完了できるように、レプリカセットのポッドと同じ方法で他のノードに再スケジュールされます。したがって、ジョブは通常、1 回限りのタスクまたはバッチ ジョブを実行するために使用されます。ジョブはポッドの数を制御して、特定の数のポッドがタスクを正常に完了するようにすることもできます。ジョブの一般的な使用シナリオ: - バッチジョブ: ジョブは、大量のデータの処理、機械学習モデルのトレーニングなど、大量のコンピューティング リソースを必要とするジョブを実行するために使用できます。
- データ処理: ジョブは、データのクリーニング、アーカイブ、バックアップなど、大量のデータの処理にも使用できます。
- スケジュールされたタスク: ジョブを使用すると、レポートの生成やデータのクリーンアップなどのタスクを定期的に実行できます。
- リソースの割り当て: ジョブ コントローラーを使用すると、CPU やメモリなどの必要なコンピューティング リソースを特定のタスクに割り当てて、タスクがスムーズに実行されるようにすることができます。
職務定義以下はジョブ構成の例です。 π を小数点以下 2000 桁まで計算し、結果を印刷します。この計算が完了するまでに約 10 秒かかります。ジョブ.yaml: apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never これを作成して、ジョブとポッドのステータスを確認します。ポッドのステータスは「実行中」で、すでに実行中であることを意味し、ジョブの「完了」は 0/1 で、ポッドは期待どおりに開始されましたが、まだ完了していないことを意味します。 [root@nsg]/tmp/test# kubectl apply -f job.yaml job.batch/pi created [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 0/1 39s 39s NAME READY STATUS RESTARTS AGE pod/pi-d5f6q 1/1 Running 0 39s 約10秒待つと、ステータスが「完了」に変わります。 kubectl logs を使用して、Pod の標準出力を表示できます。 [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 1/1 43s 47s NAME READY STATUS RESTARTS AGE pod/pi-d5f6q 0/1 Completed 0 47s # 查看日志[root@nsg]/tmp/test# kubectl logs -f pi-d5f6q 3. Job 失败处理 ジョブ失敗の処理ジョブには 2 つの再起動戦略しかありません (ポッドには Always 戦略はありません)。 - なし: タスクが完了しない限り、新しいポッドが作成され、ジョブが完了するまで実行され、複数のポッドが生成されます。 (デフォルト)
- OnFailure: ポッドが完了しない限り、ポッドは再起動され、タスクが再実行されます。
失敗したらどうなりますか?意図的にエラーを導入し、job.yaml を変更して実行コマンドを誤ったものに変更します。 ... command: ["per", "", "-", ""] 作成して、ジョブとポッドのステータスを確認します。再起動ポリシーが Never の場合、タスクが完了しない限り、新しいポッドが作成され、ジョブが完了するまで実行され、複数のポッドが生成されます。 [root@nsg]/tmp/test# kubectl apply -f job.yaml job.batch/pi created [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 0/1 3m14s 3m14s NAME READY STATUS RESTARTS AGE pod/pi-9shvk 0/1 StartError 0 3m10s pod/pi-gjwp7 0/1 StartError 0 2m pod/pi-mp96m 0/1 StartError 0 2m40s pod/pi-nrb64 0/1 StartError 0 3m14s pod/pi-nznrc 0/1 StartError 0 3m 再起動戦略が OnFailure の場合、ポッドが完了しない限り、ポッドは再起動され、タスクが再実行されます。 [root@nsg]/tmp/test# kubectl apply -f job.yaml job.batch/pi created [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 0/1 103s 103s NAME READY STATUS RESTARTS AGE pod/pi-drrft 0/1 RunContainerError 4 (8s ago) 103s フォールバック制限backoffLimit はバックオフ制限を示し、ジョブを失敗としてマークするまでの再試行回数を指定するために使用できます。明示的に指定されていない場合は、デフォルトで 6 になります。job.yaml: apiVersion: batch/v1 kind: Job metadata: name: pi spec: backoffLimit: 2 template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never 作成して、ジョブとポッドのステータスを確認します。 2 回再試行されましたが、それでも失敗し、その後再試行されなかったことがわかります。 [root@nsg]/tmp/test# kubectl apply -f job.yaml job.batch/pi created [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 0/1 80s 80s NAME READY STATUS RESTARTS AGE pod/pi-6hqmr 0/1 StartError 0 76s pod/pi-sj98k 0/1 StartError 0 80s pod/pi-xc5k4 0/1 StartError 0 66s ジョブを並列実行する複数のポッドを同時に実行して、ジョブの実行効率を向上させます。これは並列処理設定で設定できます。 平行性ジョブ.yaml: apiVersion: batch/v1 kind: Job metadata: name: pi spec: parallelism: 2 template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never 作成して、ジョブとポッドのステータスを確認します。ジョブは同じ AGE を持つ 2 つのポッドを起動します。これは、それらが並行して実行されていることを示しています。 [root@nsg]/tmp/test# kubectl apply -f job.yaml job.batch/pi created [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 2/1 of 2 8s 13s NAME READY STATUS RESTARTS AGE pod/pi-k9bfs 0/1 Completed 0 13s pod/pi-ztcxv 0/1 Completed 0 13s 完了また、job.yaml を変更して、完了を通じてジョブを正常に完了する Pod の合計数を設定することもできます。合計 6 個の Pod が正常に完了するまで、毎回 2 個の Pod を実行します。 apiVersion: batch/v1 kind: Job metadata: name: pi spec: parallelism: 2 completions: 6 template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never 作成して、ジョブとポッドのステータスを確認します。合計 6 つのポッドがタスクを完了したことがわかります。これは予想どおりです。補完と並列処理が指定されていない場合、デフォルト値は 1 になります。 [root@nsg]/tmp/test# kubectl apply -f job.yaml job.batch/pi created [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 6/6 25s 31s NAME READY STATUS RESTARTS AGE pod/pi-67vm7 0/1 Completed 0 31s pod/pi-bb8nl 0/1 Completed 0 22s pod/pi-fchrq 0/1 Completed 0 14s pod/pi-k47pr 0/1 Completed 0 22s pod/pi-rt8n8 0/1 Completed 0 14s pod/pi-zzc96 0/1 Completed 0 31s 完了したジョブを自動的にクリーンアップするジョブが完了した後も、ポッドがまだ存在していることがわかります。通常、完了したジョブをシステムに保持する必要はありません。これらをシステム内に保持すると、API サーバーにさらなる負荷がかかります。 完了したジョブ (ステータスが完了または失敗) を自動的にクリーンアップする別の方法は、 TTL コントローラーによって提供される TTL メカニズムを使用することです。ジョブの .spec.ttlSecondsAfterFinished フィールドを設定することで、コントローラーが完了したリソースをクリーンアップすることができます。このフィールドを 0 に設定すると、ジョブは終了直後に自動的に削除できるオブジェクトになります。このフィールドが設定されていない場合、ジョブは終了後に TTL コントローラによって自動的にクリアされません。試してみてください: job.yaml: apiVersion: batch/v1 kind: Job metadata: name: pi spec: ttlSecondsAfterFinished: 20 ##任务完成以后,20s自动清理Pod template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never 作成して、ジョブとポッドのステータスを確認します。 [root@nsg]/tmp/test# kubectl apply -f job.yaml job.batch/pi created [root@nsg]/tmp/test# kubectl get jobs,pods NAME COMPLETIONS DURATION AGE job.batch/pi 1/1 8s 27s NAME READY STATUS RESTARTS AGE pod/pi-2k4b6 0/1 Completed 0 27s # 等待20s后立即删除[root@nsg]/tmp/test# kubectl get jobs,pods No resources found in default namespace. スケジュールされたジョブの実行Linux には、スケジュールに基づいてタスクを実行する cron プログラムがあります。 Kubernetesの CronJob も同様の機能を提供しており、スケジュールに従ってジョブを実行できます。以下は CronJob 構成ファイルの例です: cronjob.yaml: apiVersion: batch/v1 kind: CronJob metadata: name: pi spec: schedule: "* * * * *" jobTemplate: spec: template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: OnFailure 作成して、cronjobs と Pod のステータスを確認します。ジョブが 1 分ごとに開始されていることがわかります。 [root@nsg]/tmp/test# kubectl apply -f cronjob.yaml cronjob.batch/pi created [root@nsg]/tmp/test# kubectl get cronjobs,pods NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE cronjob.batch/pi * * * * * False 1 7s 2m36s NAME READY STATUS RESTARTS AGE pod/pi-28255870-cd4mx 0/1 Completed 0 2m7s pod/pi-28255871-9tv6x 0/1 Completed 0 67s pod/pi-28255872-nl99x 0/1 Completed 0 7s ジョブの使用上の注意Kubernetes Job を使用する場合は、次の点に注意してください。 - Job オブジェクトは、長時間実行されるサービスではなく、1 回限りのタスクまたはバッチ ジョブに適しています。
- ジョブ仕様で定義されたコンテナが正常に実行され、指定された操作を実行するために十分なリソースと権限があることを確認する必要があります。
- ジョブを設計するときは、ポッドの障害と再試行のシナリオを考慮し、適切な再試行回数と間隔を設定する必要があります。
- ジョブの実行時間が長すぎる場合は、過剰なリソース消費を避けるために適切な Pod ライフサイクルを設定する必要があります。
- ジョブ コントローラーを使用する場合は、コントローラーのバージョンが Kubernetes バージョンと互換性があることを確認してください。バージョン間で構文の変更や動作の違いがある場合があります。
その他の機能参考公式サイト: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/ |