ジョブの実行

このページでは、Kubernetes Engine でジョブを実行する方法について説明します。

概要

Kubernetes Engine では、ジョブは有限のタスクを表すコントローラ オブジェクトです。ジョブは、他のコントローラ オブジェクトとは異なり、進行中の目的の状態(実行中のポッドの総数など)を管理するのではなく、実行されるタスクを完了するまで管理します。

ジョブは、大規模な計算やバッチ指向のタスクに役立ちます。ジョブは、ポッドの並列実行をサポートするために使用できます。ジョブを使用して、電子メールの送信、フレームのレンダリング、ファイルのコード変換、データベース キーのスキャンなど、独立しているが関連性のある作業項目を並行して実行できます。ただし、ジョブはバックグラウンド プロセスの連続するストリームのような密接なやり取りを行う並列処理を想定したものではありません。

Kubernetes Engine には、次の 2 種類のジョブがあります。

  • 非並列ジョブ: ポッドを 1 つだけ作成し(ポッドが正常に終了しなかった場合はポッドを再作成する)、ポッドが正常に終了したときに完了するジョブ。
  • 完了数を指定した並列ジョブ: 一定数のポッドが正常に終了すると完了するジョブ。completions フィールドを使用して必要な完了の数を指定します。

ジョブは、Kubernetes のジョブ オブジェクトで表されます。ジョブが作成されると、ジョブ コントローラが 1 つ以上のポッドを作成し、ジョブのポッドが正常に終了するかどうかを確認します。ポッドが終了すると、ジョブはタスクが正常に完了したポッドの数を追跡します。正常な完了が必要な数に達すると、ジョブは完了します。

他のコントローラと同様に、ジョブ コントローラはいずれかのポッドが失敗したり削除されたりすると、新しいポッドを作成します。

始める前に

このタスクを準備するには、次の手順を実行します。

  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone [COMPUTE_ZONE]

ジョブを作成する

ジョブを作成するには、マニフェスト ファイルを指定した kubectl apply または kubectl create を使用するか、ジョブの仕様を指定した kubectl run を実行します。

kubectl create

次の例は、config.yaml という名前のジョブ マニフェスト ファイルを示しています。

apiVersion: batch/v1
kind: Job
metadata:
  # Unique key of the Job instance
  name: example-job
spec:
  template:
    metadata:
      name: example-job
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl"]
        args: ["-Mbignum=bpi", "-wle", "print bpi(2000)"]
      # Do not restart containers after they exit
      restartPolicy: Never

このジョブは、円周率を 2,000 桁まで計算し、それを出力します。

ジョブ オブジェクトの唯一の要件として、ポッドの template フィールドは必須です。

このファイルからジョブを作成するには、次のコマンドを実行します。

kubectl create -f config.yaml

kubectl apply

次の例は、config.yaml という名前のジョブ マニフェスト ファイルを示しています。

apiVersion: batch/v1
kind: Job
metadata:
  # Unique key of the Job instance
  name: example-job
spec:
  template:
    metadata:
      name: example-job
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl"]
        args: ["-Mbignum=bpi", "-wle", "print bpi(2000)"]
      # Do not restart containers after they exit
      restartPolicy: Never

このジョブは、円周率を 2,000 桁まで計算し、それを出力します。

ジョブ オブジェクトの唯一の要件として、ポッドの template フィールドは必須です。

このファイルからジョブを作成するには、次のコマンドを実行します。

kubectl apply -f config.yaml

kubectl run

次の例では、円周率を 2,000 桁まで計算し、それを印刷しています。

kubectl run pi --image perl --restart Never -- perl -Mbignum bpi -wle 'print bpi(2000)'

ジョブの完了数

一定の数のポッドが正常に終了すると、ジョブが完了します。デフォルトでは、ポッドを 1 つだけ含む非並列ジョブは、ポッドが正常に終了した直後に完了します。

並列ジョブを使用する場合は、オプションの completions フィールドを使用してジョブの完了数を設定できます。このフィールドには、ジョブが完了するまでに正常に終了する必要があるポッドの数を指定します。completions フィールドにはゼロ以外の正の値を指定できます。

completions を省略するか、ゼロを指定すると、いずれかのポッドの正常終了がすべてのポッドの正常終了を示すようになります。

完了数を指定するには、マニフェスト ファイルのジョブの spec フィールドに completions の値を追加します。たとえば、次の設定では、8 個の正常な完了が必要であることが指定されています。

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  completions: 8
  template:
    metadata:
      name: example-job
    spec:
      ...

completions のデフォルト値は 1 です。completions が設定されている場合、parallelism フィールドは特に設定しない限り 1 に設定されます。両方のフィールドが設定されていない場合、デフォルト値はどちらも 1 です。

並列処理を管理する

デフォルトでは、ジョブのポッドは並列で実行されません。オプションの parallelism フィールドは、ジョブで同時に実行するポッドの最大数を指定します。

残りの作業が parallelism の値より少ない場合は、定常状態で実行されているポッドの実際の数が parallelism の値より少なくなる可能性があります。completions も設定されている場合、並列で実行されるポッドの実際の数が残りの完了数を超えることはありません。ポッドの作成に何度も失敗する場合、ジョブはポッドの作成を抑制することがあります。

並列処理を管理するには、マニフェスト ファイルのジョブの spec フィールドに parallelism の値を追加します。たとえば、次のマニフェストは 5 個の同時実行ポッドを実行することを指定しています。

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  parallelism: 5
  template:
    metadata:
      name: example-job
    spec:
      ...

parallelism フィールドを省略した場合や、別の値に設定しなかった場合のデフォルト値は、1 です。値を 0 に設定すると、値が増加するまでジョブは一時停止されます。

期限を指定する

デフォルトでは、ポッドが連続して失敗した場合、ジョブは新しいポッドを無期限に作成します。ジョブを無期限に再試行したくない場合は、オプションの activeDeadlineSeconds フィールドを使用して期限の値を指定できます。

期限によって、ジョブを終了する前にタスクを正常に完了するための時間(秒単位)がジョブに与えられます。

期限を指定するには、マニフェスト ファイルのジョブの spec フィールドに activeDeadlineSeconds の値を追加します。たとえば、次の設定では、ジョブが正常に完了するまでに 100 秒かかることが指定されています。

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  activeDeadlineSeconds: 100
  template:
    metadata:
      name: example-job
    spec:
      ...

期限前にジョブが正常に完了しなかった場合、ジョブは DeadlineExceeded ステータスで終了します。これにより、ポッドの作成が中止され、既存のポッドが削除されます。

ポッドセレクタを指定する

ジョブのポッド テンプレートを更新したいが、ジョブの現在のポッドを更新されたジョブで実行したい場合は、セレクタを手動で指定すると便利です。

ジョブは selector フィールドによってインスタンス化されます。selector はジョブのポッドを表す一意の識別子を生成します。生成された ID は他のジョブと重複しません。通常、ユーザーがこのフィールドを設定することはありません。設定した selector の値が別のジョブと重複すると、他のジョブのポッドに問題が発生する可能性があります。ユーザーがこのフィールドを設定するには、ジョブの spec フィールドに manualSelector: True を指定する必要があります。

たとえば、kubectl get job my-job --output=yaml を実行してジョブの仕様を表示すると、ジョブのポッドのために生成されたセレクタが仕様に含まれています。

kind: Job
metadata:
  name: my-job
...
spec:
  completions: 1
  parallelism: 1
  selector:
    matchLabels:
      controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
...

新しいジョブを作成するときに、manualSelector の値を True に設定し、selector フィールドの job-uid の値を次のように設定できます。

kind: Job
metadata:
  name: my-new-job
  ...
spec:
  manualSelector: true
  selector:
    matchLabels:
      job-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
  ...

my-new-job によって作成されたポッドは、上記のポッド UID を使用します。

ジョブを検査する

Console

kubectl を使用してジョブを作成した後は、次の手順に沿ってジョブを検査できます。

  1. GCP Console で Kubernetes Engine の [ワークロード] メニューにアクセスします。

    [ワークロード] メニューにアクセス

  2. メニューから目的のワークロードを選択します。

次の方法でジョブを検査できます。

  • ジョブのライブ設定を表示するには、[YAML] をクリックします。
  • ジョブに関連するすべてのイベントを表示するには、[イベント] をクリックします。
  • ジョブの変更履歴を表示するには、[変更履歴] をクリックします。

kubectl

ジョブのステータスを確認するには、次のコマンドを実行します。

kubectl describe job my-job

完了したジョブによって作成されたポッドを含むクラスタ内のすべてのポッドリソースを表示するには、次のコマンドを実行します。

kubectl get pods -a

-a フラグは、指定されたタイプのすべてのリソース(この場合は、ポッド)を表示するように指定します。

ジョブをスケーリングする

Console

ジョブをスケーリングするには、次の手順を行います。

  1. GCP Console で Kubernetes Engine の [ワークロード] メニューにアクセスします。

    [ワークロード] メニューにアクセス

  2. メニューから目的のワークロードを選択します。

  3. [スケール] をクリックします。
  4. [レプリカ] フィールドに、必要なレプリカの数を入力します。
  5. [スケール] をクリックします。

kubectl

ジョブをスケーリングするには、次のコマンドを実行します。

kubectl scale job my-job replicas [VALUE]

kubectl scale は、同時に実行されるポッドの数を変更します。具体的には、parallelism の値をユーザーが指定した [VALUE] に変更します。

ジョブを削除する

ジョブが完了すると、ジョブはポッドの作成を中止します。ジョブが完了しても、ジョブ API オブジェクトは削除されないため、ジョブのステータスを表示できます。ジョブによって作成されたポッドは削除されませんが、終了します。ポッドは保持されるため、ポッドのログを表示したり、ポッドを操作したりできます。

Console

ジョブを削除するには、次の手順を行います。

  1. GCP Console で Kubernetes Engine の [ワークロード] メニューにアクセスします。

    [ワークロード] メニューにアクセスする

  2. メニューから、目的のワークロードを選択します。

  3. [削除] をクリックします。
  4. 確認ダイアログのメニューで、[削除] をクリックします。

kubectl

ジョブを削除するには、次のコマンドを実行します。

kubectl delete job my-job

ジョブを削除すると、ジョブのポッドもすべて削除されます。

ジョブを削除してそのポッドを保持するには、--cascade false フラグを指定します。

kubectl delete jobs my-job --cascade false

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...