ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Controller - Job
    kubernetes 2024. 12. 6. 10:00

    Job

    • 지정된 수의 파드가 성공적으로 종료될 때까지 계속해서 파드의 실행을 재시도하는 Job
    • Kubernetes는 Pod를 running 중인 상태로 유지
    • Batch 처리하는 Pod는 작업이 완료되면 종료
    • Batch 처리에 적합한 컨트롤러로 Pod의 성공적인 완료를 보장
      • 비정상 종료 시 다시 실행
      • 정상 종료시 완료
    • 즉, Job 컨트롤러는 Batch 작업 시 유용하다!

    작동 방식

    • 파드 생성: Job Controller는 지정된 작업을 수행하기 위해 필요한 수의 파드를 생성합니다. 이 파드는 작업이 완료될 때까지 실행됩니다.
    • 완료 상태 확인: 작업이 성공적으로 완료되면 Job Controller는 해당 파드를 종료하고, 작업의 결과를 기록합니다
    • 재시도 메커니즘: 작업이 실패할 경우, Job Controller는 설정된 재시도 정책에 따라 파드를 재생성하여 작업을 다시 시도할 수 있습니다 

     

    Job Definition

    • restartPolicy?
      • Kubernetes에서 restartPolicy는 포드의 모든 컨테이너에 적용되며, 다음과 같은 세 가지 옵션이 있습니다.
        • Always: 컨테이너가 종료되더라도 항상 재시작합니다. 주로 지속적인 서비스가 필요한 경우에 사용됩니다.
        • OnFailure: 컨테이너가 비정상적으로 종료된 경우에만 재시작합니다. 정상적으로 종료된 경우에는 재시작하지 않습니다.
        • Never: 컨테이너가 종료되더라도 절대 재시작하지 않습니다. 주로 일회성 작업이나 테스트에 사용됩니다.
    • backoffLimit?
      • job이 실패하면, Pod를 몇 번 재실행 할 것 인지 결정 ex) backofflimit : 3
      • 별도 미설정 시, 기본 backoffLimit 횟수는 6회 

     

    예시

     

    # job-exam.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/6# vi job-exam.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: centos-job
    spec:
    #  completions: 5
    #  parallelism: 2
    #  activeDeadlineSeconds: 5
      template:
        spec:
          containers:
          - name: centos-container
            image: centos:7
            command: ["bash"]
            args:
            - "-c"
            - "echo 'Hello World'; sleep 50; echo 'Bye'"
          restartPolicy: Never
    #      restartPolicy: OnFailure
    #  backoffLimit: 3

     

    이 Job은 CentOS 7 이미지를 사용하여 "Hello World"를 출력하고 50초 동안 대기한 후 "Bye"를 출력하는 작업을 수행한다. restartPolicy : Never 필드에 의해서, 컨테이너가 종료되더라도 재시작하지 않는다.

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml
    job.batch/centos-job created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
    NAME               READY   STATUS    RESTARTS   AGE
    centos-job-rbstx   1/1     Running   0          3s
    root@master:~# kubectl get jobs
    NAME         STATUS     COMPLETIONS   DURATION   AGE
    centos-job   Complete   1/1           82s        3h43m

     

    # 삭제

    root@master:~# kubectl delete jobs.batch centos-job
    job.batch "centos-job" deleted

     

    예시2

     

    # job-exam.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/6# cat job-exam.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: centos-job
    spec:
    #  completions: 5
    #  parallelism: 2
    #  activeDeadlineSeconds: 5
      template:
        spec:
          containers:
          - name: centos-container
            image: centos:7
            command: ["bashrc"]
            args:
            - "-c"
            - "echo 'Hello World'; sleep 50; echo 'Bye'"
              #      restartPolicy: Never
          restartPolicy: OnFailure
      backoffLimit: 3

     

     

    command에 Error가 발생하게 끔 bashrc로 수정해주고

    restartPolicy : OnFailure 활성화

    backoffLimit : 3 활성화 후, 생성해보자

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml
    job.batch/centos-job created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS             RESTARTS      AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-4qrhs   0/1     CrashLoopBackOff   2 (28s ago)   46s   192.168.104.24   node2   <none>           <none>
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS        RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-4qrhs   0/1     Terminating   3          47s   192.168.104.24   node2   <none>           <none>
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    No resources found in default namespace.

     

    Pod가 정상적으로 완료되지 않으면 Job Controller에 의해 다시 restart되는데

    backoffLimit = 3에 따라, Pod Restart를 3번 시도하게 되는데, 3번 다 실패하면 더 이상 실행하지 않는다.

     

    예시3 (completion)

     

    # job-exam.yaml 파일 작성

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: centos-job
    spec:
      completions: 3
    #  parallelism: 2
    #  activeDeadlineSeconds: 5
      template:
        spec:
          containers:
          - name: centos-container
            image: centos:7
            command: ["bash"]
            args:
            - "-c"
            - "echo 'Hello World'; sleep 5; echo 'Bye'"
          restartPolicy: Never
            #      restartPolicy: OnFailure
            #  backoffLimit: 3

     

    completion을 3으로 지정 후, 배포해보자

     

    # 생성 및 확인

    
    root@master:~/Getting-Start-Kubernetes/6# kubectl get jobs
    NAME         STATUS    COMPLETIONS   DURATION   AGE
    centos-job   Running   1/3           13s        13s
    root@master:~/Getting-Start-Kubernetes/6# kubectl get jobs
    NAME         STATUS     COMPLETIONS   DURATION   AGE
    centos-job   Complete   3/3           27s        31s
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
    NAME               READY   STATUS      RESTARTS   AGE
    centos-job-2wksx   0/1     Completed   0          30s
    centos-job-dhk2z   0/1     Completed   0          21s
    centos-job-n6pxw   0/1     Completed   0          39s

     

    Pod 3개가 정상적으로 완료되었다.

     

    예시4 (parallelism)

     

    # job-exam.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/6# cat job-exam.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: centos-job
    spec:
      completions: 5
      parallelism: 2
    #  activeDeadlineSeconds: 5
      template:
        spec:
          containers:
          - name: centos-container
            image: centos:7
            command: ["bash"]
            args:
            - "-c"
            - "echo 'Hello World'; sleep 5; echo 'Bye'"
          restartPolicy: Never
            #      restartPolicy: OnFailure
            #  backoffLimit: 3

     

    • completions: 5
      이 Job이 성공적으로 완료되어야 하는 파드의 수입니다. 즉, 총 5개의 성공적인 파드가 필요합니다.
    • parallelism: 2
      동시에 실행할 수 있는 파드의 최대 수입니다. 이 경우 최대 2개의 파드가 동시에 실행됩니다.

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml
    job.batch/centos-job created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS      RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-cmjkt   0/1     Completed   0          8s    192.168.104.34   node2   <none>           <none>
    centos-job-vh7r8   0/1     Completed   0          8s    192.168.104.35   node2   <none>           <none>
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS      RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-cmjkt   0/1     Completed   0          13s   192.168.104.34   node2   <none>           <none>
    centos-job-tnr9j   1/1     Running     0          4s    192.168.104.37   node2   <none>           <none>
    centos-job-vh7r8   0/1     Completed   0          13s   192.168.104.35   node2   <none>           <none>
    centos-job-xv7xz   1/1     Running     0          4s    192.168.104.36   node2   <none>           <none>

     

     

    pod 2개가 Completed 되자마자, 또 다른 2개가 Running 되는 것을 확인 가능하다.

     

    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS              RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-cmjkt   0/1     Completed           0          20s   192.168.104.34   node2   <none>           <none>
    centos-job-tnr9j   0/1     Completed           0          11s   192.168.104.37   node2   <none>           <none>
    centos-job-vh7r8   0/1     Completed           0          20s   192.168.104.35   node2   <none>           <none>
    centos-job-xv7xz   0/1     Completed           0          11s   192.168.104.36   node2   <none>           <none>
    centos-job-zfbrj   0/1     ContainerCreating   0          2s    <none>           node2   <none>           <none>       <none>
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS      RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-cmjkt   0/1     Completed   0          25s   192.168.104.34   node2   <none>           <none>
    centos-job-tnr9j   0/1     Completed   0          16s   192.168.104.37   node2   <none>           <none>
    centos-job-vh7r8   0/1     Completed   0          25s   192.168.104.35   node2   <none>           <none>
    centos-job-xv7xz   0/1     Completed   0          16s   192.168.104.36   node2   <none>           <none>
    centos-job-zfbrj   1/1     Running     0          7s    192.168.104.38   node2   <none>           <none>

     

    또 2개가 Completed되자 마자, 1개가 Running 되는 것을 확인 가능하다.

     

    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS      RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-cmjkt   0/1     Completed   0          27s   192.168.104.34   node2   <none>           <none>
    centos-job-tnr9j   0/1     Completed   0          18s   192.168.104.37   node2   <none>           <none>
    centos-job-vh7r8   0/1     Completed   0          27s   192.168.104.35   node2   <none>           <none>
    centos-job-xv7xz   0/1     Completed   0          18s   192.168.104.36   node2   <none>           <none>
    centos-job-zfbrj   0/1     Completed   0          9s    192.168.104.38   node2   <none>           <none>

     

    총 5개 Pod가 성공적으로 Completed 되었다.

     

    예시5 (activeDeadlineSeconds)

     

    # job-exam.yaml 파일 생성

    root@master:~/Getting-Start-Kubernetes/6# vi job-exam.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: centos-job
    spec:
      #  completions: 5
      #parallelism: 2
      activeDeadlineSeconds: 5
      template:
        spec:
          containers:
          - name: centos-container
            image: centos:7
            command: ["bash"]
            args:
            - "-c"
            - "echo 'Hello World'; sleep 25; echo 'Bye'"
          restartPolicy: Never
            #      restartPolicy: OnFailure
            #  backoffLimit: 3

     

    activeDeadlineSeconds란, Job이 활성 상태로 유지될 수 있는 최대 시간을 초 단위로 설정한 것이다.

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml
    job.batch/centos-job created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME               READY   STATUS        RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
    centos-job-47sl5   1/1     Terminating   0          7s    192.168.104.39   node2   <none>           <none>
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    No resources found in default namespace.

     

    이 Job은 CentOS 7 이미지를 사용하여 "Hello World"를 출력한 후 25초 동안 대기하고 "Bye"를 출력하는 작업을 수행합니다. 그러나 activeDeadlineSeconds가 5초로 설정되어 있어, Job이 시작된 후 5초가 지나면 Kubernetes가 Job을 종료하게 됩니다.

     

    activeDeadlineSeconds 필드는 Job이 시작된 후 최대 실행 시간을 설정합니다.

    이 경우 5초로 설정되어 있으므로, Job이 5초 이내에 완료되지 않으면 강제로 종료됩니다.

    따라서, Job의 명령어는 25초 동안 실행되므로, Job은 5초 후에 종료됩니다.

     

     

     

    'kubernetes' 카테고리의 다른 글

    [따배쿠] Service - 개요  (1) 2024.12.07
    [따배쿠] Controller - Cronjob  (0) 2024.12.07
    [따배쿠] Controller - StatefulSet  (0) 2024.12.05
    [따배쿠] Controller - DaemonSet  (0) 2024.12.05
    [따배쿠] Controller - Deployment  (0) 2024.12.05
Designed by Tistory.