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

推薦する

ミニプログラムにTencentソーシャル広告を配置するにはどうすればよいですか?ここにガイドがありますので、ご利用ください

月収10万元の起業の夢を実現するミニプログラム起業支援プランミニプログラム開発者とやりとりする過程で...

A5マーケティング:インターネットの新時代がSEOに新たな意味を与える

はじめに:「SEOはますます複雑になっています。10年前、SEOはページにキーワードを積み重ねること...

Kubernetes アプリケーション アクセス管理の理解

追加ボックス ボーダーボックス rgba(0, 0, 0, 0);">種類: サービ...

supvps/スーパークラウド:香港クラウドサーバー(CN2ネットワーク)、199元/年から、2Gメモリ/2コア/40GNVMe/5M帯域幅、最大30%増

Chaoyun/supvpsは現在、ドラゴンイヤープロモーションを開催しており、香港のクラウドサーバ...

ビジネスサイトのキーワードを選択するための4つの簡単なステップ

最適化についてよく知らない人は、最適化作業とは記事を公開したり、外部リンクを投稿したり、フレンドリー...

SEO では、業界の経験と石を触りながら歩くことを組み合わせる必要があります。そうしないと、必ず転んでしまいます。

はじめに:SEOは技術と経験の積み重ねです。かつてはどんな業界にも応用できる万能技術だと思っていまし...

servercheap - $5.99/Windows/4g メモリ/50g SSD/1Gbps 無制限トラフィック/シカゴ

創業2年の企業であるservercheapは、新年に皆を驚かせた、OVZやKVMを含む超格安VPSを...

あなたのウェブサイトは訪問者を必要としていますか、それとも訪問者があなたのウェブサイトを必要としていますか?

ウェブマスターとして、ウェブサイトをリーダーに、訪問者を従業員に例えることもできます。では、誰が誰を...

Baidu の推奨エンジン = SEO の終焉が近づいている?

昨日、百度の推薦エンジンに関するニュースを見ました。百度のチーフアーキテクトであり推薦エンジンの責任...

ウェブマスターネットワークからの毎日のレポート:ジャック・マーがアリババグループのCEOを辞任、シノペックが電子商取引をテスト

1. シノペックが電子商取引をテスト:数百億ドルの非石油製品販売の背後にあるものアジア最大の石油精製...

キーワード競争力を判断する5つのポイント

SEO はウェブサイトを成功させるための基盤であり、成功する SEO には正確なコアキーワードが必要...

メイヤーの2番目の動きはQuoraとYelpの買収かもしれない

テンセントテクノロジーニュース(明宣)北京時間8月10日、外国メディアの報道によると、テクノロジーブ...

外部リンクの数はウェブサイトのランキングを測定する上で必須の要素ではない

SEO について知っている友人の多くは、「コンテンツは王様、外部リンクは女王」ということわざを知って...

#11.11# 刺激クラウド: 香港 CN2 回線、9 元/月、4G メモリ/4 コア/40g SSD/5M 帯域幅、イベント期間中の更新で 50% 割引

Stimulating Cloud [国内企業、ISPライセンス、IDCライセンス、クラウドライセン...

永続ストレージはクラウドネイティブ開発者にさらなる自由をもたらす

多くの組織では、DevOps チームがビジネス目標と戦略をサポートする傾向が高まっています。ソフトウ...