第36章 ジョブ

36.1. 概要

レプリケーションコントローラーとは対照的に、ジョブは Pod を任意の数のレプリカと共に完了するまで実行します。ジョブはタスクの全体的な進捗状況を追跡し、アクティブな Pod、成功および失敗した Pod についての情報でそのステータスを更新します。ジョブを削除すると、作成した Pod レプリカが削除されます。ジョブは Kubernetes API の一部であり、これは他のオプジェクトタイプと同様に oc コマンドで管理できます。

ジョブについての詳細は、Kubernetes のドキュメントを参照してください。

36.2. ジョブの作成

ジョブ設定は以下の主な部分で構成されます。

  • Pod テンプレート: Pod が作成するアプリケーションを記述します。
  • オプションの parallelism パラメーター: ジョブの実行に使用する、並行して実行される Pod のレプリカ数を指定します。これが指定されていない場合、デフォルトは completions パラメーターの値に設定されます。
  • オプションの completions パラメーター: ジョブの実行に使用する、並行して実行される Pod の数を指定します。これが指定されていない場合、デフォルト値は 1 に設定されます。

以下は、job リソースのサンプルです。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  parallelism: 1    1
  completions: 1    2
  template:         3
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: OnFailure    4
  1. ジョブが並行して実行する Pod のレプリカ数のオプションの値です。デフォルトでは completions の値に設定されます。
  2. ジョブを完了としてマークするために必要な Pod の正常な完了数のオプションの値です。デフォルトは 1 に設定されます。
  3. コントローラーが作成する Pod のテンプレートです。
  4. Pod の再起動ポリシーです。これは、ジョブコントローラーには適用されません。詳細は、「既知の制限」を参照してください。

oc run を使用して単一コマンドからジョブを作成し、起動することもできます。以下のコマンドは直前の例に指定されている同じジョブを作成し、これを起動します。

$ oc run pi --image=perl --replicas=1  --restart=OnFailure \
    --command -- perl -Mbignum=bpi -wle 'print bpi(2000)'

36.2.1. 既知の制限

ジョブ仕様の再起動ポリシーは Pod にのみ適用され、ジョブコントローラー には適用されません。ただし、ジョブコントローラーはジョブを完了まで再試行するようハードコーディングされます。

そのため restartPolicy: Never または --restart=Never により、restartPolicy: OnFailure または --restart=OnFailure と同じ動作が実行されます。つまり、ジョブが失敗すると、成功するまで (または手動で破棄されるまで) 自動で再起動します。このポリシーは再起動するサブシステムのみを設定します。

Never ポリシーでは、ジョブコントローラー が再起動を実行します。それぞれの再試行時に、ジョブコントローラーはジョブステータスの失敗数を増分し、新規 Pod を作成します。これは、それぞれの試行が失敗するたびに Pod の数が増えることを意味します。

OnFailure ポリシーでは、kubelet が再起動を実行します。それぞれの試行によりジョブステータスでの失敗数が増分する訳ではありません。さらに、kubelet は同じノードで Pod の起動に失敗したジョブを再試行します。

36.3. ジョブのスケーリング

ジョブは oc scale コマンドを --replicas オプションと共に使用してスケールアップしたり、スケールダウンしたりすることができます。これはジョブの場合には spec.parallelism パラメーターを変更します。これにより、並行して実行されている Pod のレプリカ数が変更され、ジョブが実行されます。

以下のコマンドは上記のジョブサンプルを使用し、parallelism パラメーターを 3 に設定します。

$ oc scale job pi --replicas=3
注記

レプリケーションコントローラーのスケーリングでは、oc scale コマンドを --replicas オプションと共に使用しますが、レプリケーションコントローラー設定の replicas パラメーターを変更します。

36.4. 最長期間の設定

ジョブ を定義する際に、activeDeadlineSeconds フィールドを設定して最長期間を定義することができます。これが秒単位で指定され、デフォルトでは設定されません。設定されていない場合は、実施される最長期間はありません。

最長期間は、最初の Pod がスケジュールされた時点から計算され、ジョブが有効である期間を定義します。これは実行の全体の時間を追跡し、完了の数 (タスクを実行するために必要な Pod のレプリカ数) とは無関係に追跡されます。指定されたタイムアウトに達すると、ジョブは OpenShift Container Platform で終了されます。

以下の例は、activeDeadlineSeconds フィールドを 30 分に指定する ジョブ の一部を示しています。

  spec:
    activeDeadlineSeconds: 1800

36.5. ジョブ失敗のバックオフポリシー

ジョブは、設定の論理的なエラーなどの理由により再試行の設定回数を超えた後に失敗とみなされる場合があります。ジョブの再試行回数を指定するには、.spec.backoffLimit プロパティーを設定します。このフィールドはデフォルトで 6 に設定されます。ジョブに関連付けられた失敗した Pod は 6 分を上限として指数関数的バックオフ遅延値 (10s20s40s …) に基づいて再作成されます。この制限は、コントローラーのチェック間で失敗した Pod が新たに生じない場合に再設定されます。