ジョブは、1 回限りのタスクを実行し、必要な数の Pod が正常に完了することを保証します。このトピックでは、ジョブの仕組みと、Container Service for Kubernetes (ACK) でコンソールまたは kubectl を使用してジョブを作成する方法について説明します。
ジョブの仕組み
Deployment、StatefulSet、DaemonSet は、ターゲット数の Pod を継続的に実行し続けますが、ジョブはそれらとは異なり、正常に完了した Pod の数を追跡します。必要な成功完了数を spec.completions で、最大同時実行数を spec.parallelism で設定します。
実行タイプ
実行タイプを選択します。
非並列 (シーケンシャル)
一度に 1 つの Pod を実行します。Pod が正常に終了すると、ジョブは完了です。
spec.completions |
spec.parallelism |
|---|---|
| 1 | 1 |
データベース移行などの 1 回限りの初期化タスクに使用します。
固定完了数での並列実行
複数の Pod を並列で実行します。spec.completions で指定した数の Pod が成功すると、ジョブは完了します。
spec.completions |
spec.parallelism |
|---|---|
| N | M (M ≤ N) |
-
M = N の場合:すべての N 個の Pod が並列で実行され、すべてが成功する必要があります。計算リソースが十分な場合に使用します。
-
M < N の場合:N 個の Pod が正常に完了するまで、最大 M 個の Pod が同時に実行されます。冗長性のために使用します。例えば、複数のゾーンにまたがるタスクで、1 つの結果のみが必要な場合などです。
リソース制約のある並列実行
N 個の Pod を並列で実行するリソースが不足している場合、spec.parallelism で同時実行数を制限します。
spec.completions |
spec.parallelism |
|---|---|
| N | M (M < N) |
一度に M 個の Pod が実行されます。各 Pod が正常に完了するたびに、N 個が成功するまで新しい Pod が開始されます。
前提条件
以下が準備できていることを確認してください。
-
パブリックネットワークアクセスが可能な ACK クラスター (サンプルイメージをプルするため)
-
クラスターに接続された kubectl (kubectl メソッドのみ)
パブリックネットワークアクセスを有効にするには:
-
(推奨) 既存の ACK クラスターからインターネットへのアクセスを有効にする — VPC 用に NAT ゲートウェイが作成され、すべてのクラスターリソースがパブリックアクセスできるようになります。
-
ノードに固定パブリック IP アドレスを割り当てる — ワークロードを実行するすべてのノードにパブリック IP が必要です。
ジョブの作成
ACK コンソールを使用したジョブの作成
-
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[クラスター] ページで、対象のクラスター名をクリックします。左側のペインで、[ワークロード] > [ジョブ] を選択します。
-
[ジョブ] ページで、[イメージから作成] をクリックします。
-
[基本情報] ステップで、基本設定を行い、[次へ] をクリックします。
-
[一般] セクションで、[イメージ名] フィールドに
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latestと入力します。[ライフサイクル] セクションの [開始] 部分で、[コマンド] フィールドに/bin/shと入力し、[パラメーター] フィールドに["-c", "echo 'starting...'; COUNTER=0; while [ $COUNTER -lt 5 ]; do sleep 2; COUNTER=$((COUNTER+1)); echo $COUNTER; done; echo 'finished'; exit 0"]と入力します。次に、[次へ] をクリックします。重要registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latestイメージをプルするには、インターネットアクセスが必要です。 クラスターの作成時に [VPC の SNAT を設定]を有効にした場合、クラスターはすでにインターネットにアクセスできます。 既存のクラスターの場合は、インターネットアクセスを有効にする必要があります。
-
[詳細設定] ステップで、[ジョブ設定] を構成します。この例では、[完了回数] を 2 に設定し、[作成] をクリックします。
パラメーター 説明 補完 正常に完了する必要がある Pod の数。 spec.completionsにマッピングされます。並列度 同時に実行される Pod の最大数。 spec.parallelismにマッピングされます。タイムアウト ジョブの最大持続時間 (秒単位)。 spec.activeDeadlineSecondsにマッピングされます。デフォルト:600。この時間を超えると、成功した Pod の数に関係なくジョブは終了します。バックオフ制限 ジョブが失敗するまでの Pod の最大失敗回数。 spec.backoffLimitにマッピングされます。デフォルト:6。再起動 Pod の再起動ポリシー。 template.spec.restartPolicyにマッピングされます。オプション:[Never] (既存の Pod を再起動し、spec.backoffLimitにはカウントされません) または [OnFailure] (失敗した Pod を置き換えるために新しい Pod を作成します)。[Pod ラベル] Pod のラベル。ACK はデフォルトで app:<application-name>を追加します。Pod アノテーション Pod のアノテーション。一部の ACK 機能は、構成にアノテーションを使用します。 
-
ACK コンソールでジョブのログを表示します。両方の Pod は同じ出力を生成します。

kubectl を使用したジョブの作成
続行する前に、kubectl を使用してクラスターに接続します。 「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
-
job.yamlファイルを作成します。apiVersion: batch/v1 kind: Job metadata: name: example-job spec: completions: 2 # 2 つの Pod が正常に終了した後にジョブを停止します。 parallelism: 1 # 一度に 1 つの Pod のみ実行します。 template: spec: containers: - name: counter image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest command: - /bin/sh - -c - | echo "starting..."; COUNTER=0; while [ $COUNTER -lt 5 ]; do sleep 2; COUNTER=$((COUNTER+1)); echo "${COUNTER}"; done; echo "finished"; exit 0 restartPolicy: Never -
マニフェストを適用します。
kubectl apply -f job.yaml想定される出力:
job.batch/example-job created -
約 15 秒後、ジョブのステータスを確認します。
kubectl get job example-job1 つの Pod が成功し、ジョブはまだ実行中です。
NAME STATUS COMPLETIONS DURATION AGE example-job Running 1/2 16s 16s -
約 40 秒後、再度確認します。
kubectl get job example-jobジョブは完了しています。
NAME STATUS COMPLETIONS DURATION AGE example-job Complete 2/2 27s 37s -
すべての Pod からログを表示します。
kubectl logs -l job-name=example-job出力 (Pod ごとに 1 つ、合計 2 つの同じセット):
starting... 1 2 3 4 5 finished starting... 1 2 3 4 5 finished
次のステップ
-
CronJob の作成 — 定期的にジョブをスケジュールします。
-
ワークロードに関するよくある質問 — ワークロードのよくある問題を解決します。
-
Pod のトラブルシューティング — Pod の例外を診断し、修正します。