レガシージョブスケジューラをKubernetesジョブに置き換えようとしていて、シーケンシャルジョブをKubernetesジョブとして書き込む方法を考えています。
最初に、job1
とjob2
をこの順序で実行する次のスクリプトを作成しましたが、期待どおりに機能しませんでした。
apiVersion: batch/v1
kind: Job
metadata:
name: sequential
spec:
activeDeadlineSeconds: 100
template:
metadata:
name: sequential_jobs
spec:
containers:
- name: job1
image: image1
- name: job2
image: image2
restartPolicy: Never
上記のジョブは、job1
とjob2
を並行して実行しているようです。 job1
とjob2
を書かれた順序で実行する良い方法はありますか?
添付。
私は最近 https://github.com/argoproj/argo を見つけて、ユースケースに非常に適しています。
数回の試行の後、私はこれを行い、それで基本的な問題を解決しました(OPが投稿したものと同様です)。この構成により、job-1
が始まる前にjob-2
が完了することが保証されます。 job-1
が失敗した場合、job-2
コンテナーは開始されません。私はまだ再試行と障害処理に取り組む必要がありますが、基本は動作します。うまくいけば、これは他の人を助けるでしょう:
apiVersion: v1
kind: Pod
metadata:
name: sequential-job
spec:
initContainers:
- name: job-1
image: busybox
# runs for 15 seconds; echoes job name and timestamp
command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;']
- name: job-2
image: busybox
# runs for 15 seconds; echoes job name and timestamp
command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;']
# I don't really need the 'containers', but syntax requires
# it so, I'm using it as a place where I can report the
# completion status
containers:
- name: job-done
image: busybox
command: ['sh', '-c', 'echo "job-1 and job-2 completed"']
restartPolicy: Never
更新
上記と同じ構成は、ジョブ仕様内でも機能します。
apiVersion: batch/v1
kind: Job
metadata:
name: sequential-jobs
spec:
template:
metadata:
name: sequential-job
spec:
initContainers:
- name: job-1
image: busybox
command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;']
- name: job-2
image: busybox
command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;']
containers:
- name: job-done
image: busybox
command: ['sh', '-c', 'echo "job-1 and job-2 completed"']
restartPolicy: Never
おおまかに言って、Kubernetesセットアップでは、コンテナーやポッド全体でシーケンスやキャプチャの依存関係の概念はありません。
あなたのケースでは、ジョブ仕様(またはポッド仕様さえ)に2つのコンテナーがある場合、それらの2つのコンテナーの順序付けはありません。同様に、2つのジョブを次々に実行する場合、それらのジョブの順序付けの概念もありません。
理想的には、シーケンス処理が必要な場合はそれをキャプチャする必要がありますwithin単一ユニット(コンテナー)。
あなたの質問にやや接線、ジョブが既存の別のサービスに依存しているときに私が見た別の一般的なパターン(k8sサービスが前面にあるデプロイメントなど):
ジョブ内のコンテナーはk8sサービスに要求を出し、サービスが期待どおりに応答しない場合は失敗します。これにより、ジョブが再起動し続け、最終的にサービスが起動すると、ジョブが実行され、正常に完了します。
Argoワークフローは、ユースケースに適合します。 Argo は、順次、並列、DAGジョブ処理をサポートします。
# This template demonstrates a steps template and how to control sequential vs. parallel steps.
# In this example, the hello1 completes before the hello2a, and hello2b steps, which run in parallel.
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: steps-
spec:
entrypoint: hello-hello-hello
templates:
- name: hello-hello-hello
steps:
- - name: hello1
template: whalesay
arguments:
parameters: [{name: message, value: "hello1"}]
- - name: hello2a
template: whalesay
arguments:
parameters: [{name: message, value: "hello2a"}]
- name: hello2b
template: whalesay
arguments:
parameters: [{name: message, value: "hello2b"}]
- name: whalesay
inputs:
parameters:
- name: message
container:
image: docker/whalesay
command: [cowsay]
args: ["{{inputs.parameters.message}}"]
旅団- https://brigade.sh を見たことがありますか。 JavaScriptを使用して、単純で複雑なワークフローをスクリプト化します。コンテナーをチェーン化し、それらを並列または順次に実行します。時間、GitHubイベント、Dockerプッシュ、またはその他のトリガーに基づいてスクリプトを起動します。旅団は、Kubernetesのパイプラインを作成するためのツールです。
ちょうどこれに遭遇しました。上記のように、私が知る限り、Kubernetesにはジョブの依存関係の概念はありませんが、私はこの(およびその他の)機能を提供するアドオンを持つ商用エンティティ(Univa)で作業しています。
オファリングはNavopsコマンドと呼ばれ、簡単な依存関係表記でKubernetesジョブに注釈を付けることができます。簡単な説明と例があるブログがあります here 。基本的に、Navopsは一連のコンテナーとしてKubernetesにインストールされ、独自のUIとCLIを公開し、Kubernetesスケジューラーに追加機能を補足します。 http://navops.io からダウンロードできます。
このテクノロジーは、複雑なワークフローや配列ジョブなどが一般的であるHPCで使用されるGrid Engineスケジューラーから生まれました。