Kubernetes ジョブを使用して 1 回限りのタスクを実行する方法

Kubernetes ジョブを使用して 1 回限りのタスクを実行する方法

ジョブコンセプト

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 戦略はありません)。

  1. なし: タスクが完了しない限り、新しいポッドが作成され、ジョブが完了するまで実行され、複数のポッドが生成されます。 (デフォルト)
  2. 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 を使用する場合は、次の点に注意してください。

  1. Job オブジェクトは、長時間実行されるサービスではなく、1 回限りのタスクまたはバッチ ジョブに適しています。
  2. ジョブ仕様で定義されたコンテナが正常に実行され、指定された操作を実行するために十分なリソースと権限があることを確認する必要があります。
  3. ジョブを設計するときは、ポッドの障害と再試行のシナリオを考慮し、適切な再試行回数と間隔を設定する必要があります。
  4. ジョブの実行時間が長すぎる場合は、過剰なリソース消費を避けるために適切な Pod ライフサイクルを設定する必要があります。
  5. ジョブ コントローラーを使用する場合は、コントローラーのバージョンが Kubernetes バージョンと互換性があることを確認してください。バージョン間で構文の変更や動作の違いがある場合があります。

その他の機能

参考公式サイト: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/

<<:  Kubernetes ベースの Jenkins 動的および静的ノード

>>:  クラウド プラットフォームの運用および保守仕様 - パート 1

推薦する

ユーザーのニーズを満たす入札ページを設計する方法

ウェブサイト構築では、ウェブサイトの速度、ウェブサイトのコンテンツの品質、ウェブサイトの最適化手順な...

ウェブサイトにキーワードランキングがない場合、どこからトラフィックを獲得できますか?

サイトの重みが増すほど、サイトのキーワードランキングが高くなり、検索エンジンからのトラフィックが増え...

ブランドマーケティングの破壊者

今年の前半が新たな消費の年だとすれば、後半は「仮想世界」の本拠地となるだろう。昨年10月にFaceb...

伝統的な企業は電子商取引で行き詰まっている:制度上の欠陥と認識が足かせとなる

[伝統的な企業は電子商取引に参入する際に固有の利点を持っているが、逆に制度上の欠陥や個人の認識が伝統...

エッジコンピューティング、エッジネットワーキング、エッジデータ管理がどのように連携するか

エッジ コンピューティング、エッジ ネットワーク、エッジ データ管理は、成功するエッジ コンピューテ...

クラウドネイティブの進化のトレンドにおける従来のデータベースアップグレードの実践

1. クラウドネイティブデータベースの概要1. クラウドコンピューティングはデジタル化のインフラであ...

#11.11# akkocloud: 生涯 20% オフ、3 億ドイツ CN2 GIA、ドイツネイティブ IP、Netflix のロック解除

akkocloud は比較的新しい中国の商人です。主な事業は、国内独立サーバー、国内 NAT ポート...

モバイルエキスパート:2025年までに世界のエッジコンピューティングサービス市場は70億ドルに達する

海外メディアの報道によると、Mobile Expertsは最近、エッジコンピューティングに関するレポ...

ウェブマスターネットワークからの毎日のレポート:通信回線障害のビデオウェブサイトが新しいエコシステムへと進化

1. 海外のホストが大量にブロックされ、MicrosoftやAlexaなどのウェブサイトにアクセスで...

女性を深く理解することによってのみ、インターネットの世界のために戦うことができるのでしょうか? !

11月13日、女性ユーザーグループはインターネット製品マネージャーの間で注目を集める存在となった。 ...

クラウド セキュリティにおけるエンドポイント セキュリティの役割

[[348456]]クラウド コンピューティング セキュリティの業界専門家が、エンドポイント セキュ...

ウェブサイト運営者はどのようにしてウェブサイトを素早く診断できるのでしょうか?

ウェブサイトの運営で遭遇する問題は、誰にとっても最大の頭痛の種ですが、特に、ウェブサイトを最適化する...

layerae: 米国 VPS、西海岸「スポケーン」、年間 15 ドル、AMD Ryzen 7950X+DDR5+NVMe 高性能 VPS、5 つのバックアップ付き

ドバイに登録されているlayer.aeは2017年に設立され、主にB2Bソーシャルメディア管理、イン...

#ブラックウィーク 5#: イーグルホスト - ホスト 25% オフ/ディストリビューター 40% オフ/セミバーチャルホスト 25% オフ/VPS 40% オフ

Hawkhost は毎年恒例のブラックフライデー プロモーションを開始し、仮想ホスティング、リセラー...