web-dev-qa-db-ja.com

コンテナーをKubernetesジョブとして順次実行するにはどうすればよいですか?

レガシージョブスケジューラをKubernetesジョブに置き換えようとしていて、シーケンシャルジョブをKubernetesジョブとして書き込む方法を考えています。

最初に、job1job2をこの順序で実行する次のスクリプトを作成しましたが、期待どおりに機能しませんでした。

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

上記のジョブは、job1job2を並行して実行しているようです。 job1job2を書かれた順序で実行する良い方法はありますか?

添付。

私は最近 https://github.com/argoproj/argo を見つけて、ユースケースに非常に適しています。

28
k-kawa

数回の試行の後、私はこれを行い、それで基本的な問題を解決しました(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
37
Bloodysock

おおまかに言って、Kubernetesセットアップでは、コンテナーやポッド全体でシーケンスやキャプチャの依存関係の概念はありません。

あなたのケースでは、ジョブ仕様(またはポッド仕様さえ)に2つのコンテナーがある場合、それらの2つのコンテナーの順序付けはありません。同様に、2つのジョブを次々に実行する場合、それらのジョブの順序付けの概念もありません。

理想的には、シーケンス処理が必要な場合はそれをキャプチャする必要がありますwithin単一ユニット(コンテナー)。


あなたの質問にやや接線、ジョブが既存の別のサービスに依存しているときに私が見た別の一般的なパターン(k8sサービスが前面にあるデプロイメントなど):

ジョブ内のコンテナーはk8sサービスに要求を出し、サービスが期待どおりに応答しない場合は失敗します。これにより、ジョブが再起動し続け、最終的にサービスが起動すると、ジョブが実行され、正常に完了します。

3
iamnat

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}}"]

2
Sarabala

旅団- https://brigade.sh を見たことがありますか。 JavaScriptを使用して、単純で複雑なワークフローをスクリプト化します。コンテナーをチェーン化し、それらを並列または順次に実行します。時間、GitHubイベント、Dockerプッシュ、またはその他のトリガーに基づいてスクリプトを起動します。旅団は、Kubernetesのパイプラインを作成するためのツールです。

1
Jay Paddy

ちょうどこれに遭遇しました。上記のように、私が知る限り、Kubernetesにはジョブの依存関係の概念はありませんが、私はこの(およびその他の)機能を提供するアドオンを持つ商用エンティティ(Univa)で作業しています。

オファリングはNavopsコマンドと呼ばれ、簡単な依存関係表記でKubernetesジョブに注釈を付けることができます。簡単な説明と例があるブログがあります here 。基本的に、Navopsは一連のコンテナーとしてKubernetesにインストールされ、独自のUIとCLIを公開し、Kubernetesスケジューラーに追加機能を補足します。 http://navops.io からダウンロードできます。

このテクノロジーは、複雑なワークフローや配列ジョブなどが一般的であるHPCで使用されるGrid Engineスケジューラーから生まれました。

0
GJSissons