ジョブは、タスク内のポッドが正常に終了することを保証するために、1 回限りのタスクを処理します。このトピックでは、ジョブについて紹介し、Container Service for Kubernetes (ACK) コンソールまたは kubectl を使用してジョブを作成する方法について説明します。
ジョブの概要
Deployment、StatefulSet、および DaemonSet は、アプリケーションに対して一定数のポッドが実行されていることを保証するように設計されています。ジョブはポッドを作成し、指定された数のポッドが正常に終了することを保証します。ジョブの spec.completions パラメーターを構成して、正常に完了したポッドの数を指定できます。ジョブの spec.parallelism パラメーターを構成して、ジョブの実行中に並行して実行できるポッドの数を指定できます。
シナリオ |
|
| ジョブの動作 |
データベースの初期化など、1 回限りのタスクを実行する場合。 | 1 | 1 | ポッドが正常に終了するまで、一度に 1 つのポッドのみを実行します。 |
複数のポッドを並行して実行したいが、特定の数のポッドのみが正常に終了する必要がある場合。たとえば、複数のゾーンでタスクを実行して、高可用性を確保できます。ただし、1 つのタスクのみが出力を返す必要があります。 | M (M < N) | N | M 個のポッドが正常に終了するまで、N 個のポッドを並行して実行します。 |
指定された数のポッドを並行して実行するには、計算リソースが不足しています。 | N | M (M < N) | N 個のポッドが正常に終了するまで、M 個のポッドを並行して実行します。 |
データ処理タスクなどのタスクを並行して実行するには、計算リソースが十分にあります。 | N | N | N 個のポッドが正常に終了するまで、N 個のポッドを並行して実行します。 |
このトピックで使用されているサンプルイメージはパブリックイメージです。クラスターまたはノードは、それらをプルするためにパブリックネットワークアクセスが必要です。
既存の ACK クラスタがインターネットにアクセスできるようにする (推奨): クラスターをホストしている Virtual Private Cloud (VPC) のパブリック NAT ゲートウェイを作成します。すべてのクラスターリソースがパブリックアクセスできるようになります。
静的パブリック IP アドレス をノードに割り当てる: パブリック 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 を構成する] パラメーターのデフォルト値を保持すると、クラスターはインターネットにアクセスできます。既存のクラスターのインターネットアクセスを有効にする方法の詳細については、「既存の ACK クラスタがインターネットにアクセスできるようにする」をご参照ください。
[詳細設定] ステップでは、
CompletionsパラメーターとParallelismパラメーターを構成できます。この例では、[完了数] は 2 に設定されています。上記のパラメーターの詳細については、「ジョブの概要」をご参照ください。次に、ページの下部にある [作成] をクリックします。
セクション
パラメーター
説明
[ジョブ設定]
[完了数]
正常に終了する必要があるポッドの数。このパラメーターは、ジョブ構成の
spec.completionsパラメーターに対応します。[並列処理]
並行して実行できるポッドの数。このパラメーターは、ジョブ構成の
spec.parallelismパラメーターに対応します。[タイムアウト]
ジョブ実行のタイムアウト期間。このパラメーターは、ジョブ構成の
spec.activeDeadlineSecondsパラメーターに対応します。ジョブの実行がタイムアウトした場合、正常に終了したポッドの数が指定された値に達したかどうかに関係なく、ジョブは終了します。このパラメーターは、時間に厳密なタスク、または無限ループ実行が発生する可能性のあるタスクに適しています。デフォルト値:600。単位: 秒。[バックオフ制限]
ポッドの障害時にジョブによって実行される最大再試行回数。このパラメーターは、ジョブ構成の
spec.backoffLimitパラメーターに対応します。デフォルト値:6。[再起動]
ポッドの再起動ポリシー。このパラメーターは、ジョブ構成の
template.spec.restartPolicyパラメーターに対応します。有効な値:[なし]: ポッド内のコンテナーが異常終了した場合、システムはポッドの再起動を試みます。この場合、システムは新しいポッドを作成しません。再起動は、
spec.backoffLimitパラメーターで指定された再試行制限にはカウントされません。[失敗時]: ポッドに障害が発生した場合、システムは障害が発生したポッドを置き換えるために新しいポッドを作成します。
[ラベル、アノテーション]
Pod ラベル
ワークロードが属する各ポッドにラベルを追加します。ワークロードやサービスを含むクラスター内のすべてのリソースは、ラベルを使用してポッドと照合されます。デフォルトでは、ACK は
app:(アプリケーション名)の形式のラベルをポッドに追加します。[ポッドアノテーション]
ワークロードが属する各ポッドにアノテーションを追加します。ACK の一部の機能はアノテーションを使用します。これらの機能を使用するときに、アノテーションを構成できます。
ジョブを作成した後、ACK コンソールでジョブのログを表示できます。ログは、ジョブによって作成された 2 つのポッドが同じ出力を返すことを示しています。

kubectl
ワークロードを作成する前に、kubectl を使用してクラスターに接続していることを確認してください。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
job.yaml という名前のファイルを作成し、次の YAML テンプレートをファイルにコピーします。
apiVersion: batch/v1 kind: Job metadata: name: example-job spec: completions: 2 # 2 つのポッドが正常に終了した後、ジョブを停止します。 parallelism: 1 # 一度に 1 つのポッドのみを実行します。 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 // $COUNTER が 5 未満の間 sleep 2; COUNTER=$((COUNTER+1)); echo "${COUNTER}"; done; echo "finished"; // 終了 exit 0 restartPolicy: Never # ポッドの再起動ポリシーに Never を使用します。次のコマンドを実行して、ジョブを作成します。
kubectl apply -f job.yaml予想される出力:
job.batch/example-job createdジョブの作成後、15 秒待ってから次のコマンドを実行して、ジョブのステータスをクエリします。
kubectl get job example-job次の出力は、1 つのポッドが正常に終了し、ジョブが
Running状態であることを示しています。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次のコマンドを実行して、ジョブのログをクエリします。
kubectl logs -l job-name=example-job予想される出力:
starting... 1 2 3 4 5 finished starting... 1 2 3 4 5 finished
関連情報
CronJob は、指定されたスケジュールに基づいてジョブを作成します。CronJob は、スケジュールされたタスクを実行するのに適しています。詳細については、「CronJob の作成」をご参照ください。
ワークロードの作成時に発生する問題の解決方法の詳細については、「ワークロードに関するよくある質問」をご参照ください。
ポッドの例外のトラブルシューティング方法の詳細については、「ポッドのトラブルシューティング」をご参照ください。