KubernetesオブジェクトのJob

5481 ワード

本節の内容を学ぶ前に、PodとReplicaSetについて基本的な理解を持ってほしい.具体的には、この2つの記事を参照してください.
  • KubernetesオブジェクトのPod
  • KubernetesオブジェクトのReplicaSet
  • Jobオブジェクトは、通常、データベースの移行、バッチ・スクリプトなど、一度だけ実行するタスクを実行するために使用されます.ジョブ・オブジェクトを使用して実行中のPodを作成すると、ジョブ・コントローラは、実行に失敗したPod(例えば、Podが存在するノードの再起動やダウンタイム)を自動的に再起動するため、信頼性が高くなります.
    Jobの本質は、1つまたは複数のPodが動作が完了するまで健全に動作することを確保することである.
    1.ジョブオブジェクトを作成する
    次に、πを小数点以下2000ビットまで計算するためのPodを開始するJobオブジェクトを作成する例を示します.
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        spec:
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
      backoffLimit: 4
    
    $ kubectl create -f ./job.yaml
    job "pi" created
    

    Describeコマンドを実行し、このジョブの詳細を表示します.
    [node1 ~]$ kubectl describe jobs/pi
    Name:           pi
    Namespace:      default
    Selector:       controller-uid=b207edb4-5a54-11e8-8da4-0242788d5821
    Labels:         controller-uid=b207edb4-5a54-11e8-8da4-0242788d5821
                    job-name=pi
    Annotations:    kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"pi","namespace":"default"},"spec":{"backoffLimit":4,"template":{"spec":{"con...
    Parallelism:    1
    Completions:    1
    Start Time:     Fri, 18 May 2018 04:34:04 +0000
    Pods Statuses:  0 Running / 1 Succeeded / 0 Failed
    Pod Template:
      Labels:  controller-uid=b207edb4-5a54-11e8-8da4-0242788d5821
               job-name=pi
      Containers:
       pi:
        Image:  perl
        Port:   
        Command:
          perl
          -Mbignum=bpi
          -wle
          print bpi(2)
        Environment:  
        Mounts:       
      Volumes:        
    Events:
      Type    Reason            Age   From            Message
      ----    ------            ----  ----            -------
      Normal  SuccessfulCreate  6s    job-controller  Created pod: pi-57qpr
    

    現在実行中のPodを表示するには、次の手順に従います.
    [node1 ~]$ kubectl get pods
    NAME       READY     STATUS    RESTARTS   AGE
    pi-sgklk   1/1       Running   0          6s
    

    No resources foundを返すと、このπを計算するPodが実行済みであることを示し、get podsコマンドは現在実行中のPodのみを返すことができ、-aパラメータを加えると、すべてのPodと対応するstatusを返すことができる.
    2.Jobオブジェクトパラメータの詳細
    2.1 .spec.completionsと.spec.parallelism
    指定したらspec.parallelismパラメータは、このジョブが指定を同時に実行できることを示す.spec.parallelism数のPod.通常、メッセージキューからデータを読み出すためのworkerプログラムが指定する.spec.parallelism後、メッセージキューから複数のworkerが同時にデータを読み出す.
    具体例は以下を参照してください.https://kubernetes.io/docs/tasks/job/fine-parallel-processing-work-queue/
    指定したらspec.completionsパラメータは、このJobが成功する必要があることを意味する.spec.completions個のPodが終わる.このため、ジョブコントローラは順次作成する.spec.completions数のPodは、これらのPodが正常に動作するまで実行されます.
    以下に具体的な例を示します.
  • 上のpi Jobは設定.spec.parallelismと.spec.completionsでは、describeコマンドでparallelism=1、completions=1のデフォルト値が見つかりました.
  • pi Job .spec.completions = 3のみが設定場合、このとき.spec.parallelismパラメータはデフォルト値1を採用しているため、Job Controllerはまず最初のPodを作成し、実行に成功した後、2番目のPodを作成し、2番目のPodが成功した後、3番目のPodを作成します.
  • pi Job .spec.parallelism = 3のみが設定されている場合、このJobは3つのPodを同時に実行できることを意味する.したがって、ジョブコントローラは同時に3つのPodを作成し、3つのPodの実行が終了すると、ジョブも終了状態に設定されます.
  • .spec.parallelism=3.spec.completions = 9が同時に設定されている場合、Job Controllerは3つのPodを作成し、ループ3の後、9つの正常に実行されたPodが存在すると、Jobは正常に実行されて終了する.

  • もし.spec.parallelismの値はより大きい.spec.completionsは、同時に作成されません.spec.parallelism個のPodではなく、作成する.spec.completions個Pod.
    2.2 .spec.template.spec.restartPolicy .spec.template.spec.restartPolicyプロパティには、OnFailure、Never、Alwaysの3つの候補値があります.既定値はAlwaysです.主にPodコンテンツの再起動ポリシーを記述するために使用されます.Jobでは、この属性をOnFailureまたはNeverに設定するしかありません..spec.template.spec.restartPolicy = OnFailureの場合、Pod内のコンテナのexit codeが0でない場合、Podはその内部でこのコンテナを再起動します..spec.template.spec.restartPolicy = Neverの場合、Pod内のあるコンテナexit codeが0でない場合、コンテナの再起動はトリガーされません.
    Pod Controllerの.spec.template.spec.restartPolicy(この属性はPodの属性に属し、本質的にはJob Controllerとは無関係)に加えて、Job ControllerはPodが.spec.completions回正常に動作することを保証します.Podの実行に失敗した場合(Podが存在し、そのダウンタイム、Pod内のコンテナの実行に失敗した場合、Podの実行が終了した状態も失敗します)、ジョブコントローラは、実行に成功したPodの数が.spec.completionsになるまで、新しいPodを作成して実行します.
    したがって、.spec.template.spec.restartPolicyをNeverに設定し、コンテナexit codeが0でない場合、ReplicaSetのようにPodの高可用性を提供する新しいPodを作成します.
    2.3 .spec.backoffLimit .spec.backoffLimitは、Jobのフォールトトレランス数を設定するために使用され、デフォルト値は6です.ジョブ実行のPod失敗回数が.spec.backoffLimit回に達すると、ジョブコントローラは新しいPodを作成せず、このジョブの実行を直接停止し、その実行結果をFailureとマークします.また、Podの実行に失敗した後に再度実行する時間間隔は、例えば10 s,20 s,40 sのようにインクリメントされる.
    2.4 .spec.activeDeadlineSeconds .spec.activeDeadlineSeconds属性は、ジョブ実行のタイムアウト時間を設定するために使用される.ジョブの実行時間が設定された秒数を超えた場合、ジョブはすべてのPodの実行を自動的に停止し、ジョブの終了状態をreason: DeadlineExceededとマークする.
    まとめ
  • は、実行中のPodを記述ファイルによって直接定義したBare Podで自己治癒性がなく、ダウンタイムまたは再起動した場合、その上で実行中のPodは再起動されません.したがって、Podを単独で実行する場合は、Bare PodではなくJobを使用して実行することをお勧めします.
  • Jobの高可用性はReplication Controlと少し似ています.しかし、Replication Controllerは、通常、常に実行中のPod(ウェブサーバなど)を管理するために使用されます.ジョブは、必ず実行が終了するPodを管理するために使用されます.

  • 参考記事
  • https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/