[Retry, k8s] 08. 워크로드 API - 잡

Date:     Updated:

카테고리:

태그:

[Retry, k8s] 08. 워크로드 API - 잡



🔔 잡

잡은 컨테이너를 사용하여 한 번만 실행되는 리소스, 더 정확히 말하면 N개의 병렬로 실행하면서 지정한 횟수의 컨테이너 실행(정상 종료)를 보장하는 리소스이다.

  • 잡과 레프리카셋 간의 차이점은 “기동 중인 파드가 정지되는 것을 전제로 만들어 졌는지”에 있다.

  • 레플리카셋 등에서는 정상 종료 횟수 등을 셀 수 없기 때문에 배치 처리인 경우에는 잡을 적극적으로 사용하자.


📜 잡 생성

레플리카셋과 마찬가지로 레이블과 섹렉터는 명식적으로 지정할 수 있지만, 쿠버네티스는 유니크한 uuid를 자동으로 생성하기 때문에 잡에서는 명시적으로 지정하는 것을 추천하지 않는다.

cat <<EOF > sample-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 10
  template: 
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["slepp"]
        args: ["60"]
      restartPolicy: Never
EOF
$ kubectl apply -f sample-job.yaml
job.batch/sample-job created


# 잡 목록 표시
$ kubectl get jobs
NAME         COMPLETIONS   DURATION   AGE
sample-job   0/1           48s        48s


# 잡이 생성한 파드 확인
$ kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
pod/sample-job-8wwpf   1/1     Running   0          37s


# 잡 목록 표시(파드 실행 완료 후)
$ kubectl get pod
NAME                   READY   STATUS      RESTARTS   AGE
pod/sample-job-8wwpf   0/1     Completed   0          101s


📜 restartPolicy에 따른 동작 차이

  • 【restartPolicy: Never의 경우】

    • 파드에 장애가 발생하면 신규 파드가 생성
apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job-never-restart
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 10
  template:
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["sh", "-c"]
        args: ["$(sleep 3600)"]
      restartPolicy: Never
$ kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
sample-job-never-restart-42fsr   1/1     Running   0          11s


# 컨테이너상의 sleep 프로세스 정지
$ kubectl exec -it sample-job-never-restart-42fsr -- sh -c 'kill -9 `pgrep sleep`'


# 생성된 파드가 기동됨
$ kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
sample-job-never-restart-42fsr   0/1     Error     0          45s
sample-job-never-restart-p8cbz   1/1     Running   0          3s
  • 【restartPolicy: OnFailure의 경우】

    • 동일한 파드를 사용하여 잡을 다시 시작
apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job-onfailure-restart
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 10
  template:
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["sh", "-c"]
        args: ["$(sleep 3600)"]
      restartPolicy: OnFailure
$ kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
sample-job-onfailure-restart-lgtjw   1/1     Running   0          8s


# 컨테이너상의 sleep 프로세스 정지
$ kubectl exec -it sample-job-onfailure-restart-lgtjw -- sh -c 'kill -9 `pgrep sleep`'


# 같은 파드 재시작
$ kubectl get pods
NAME                                 READY   STATUS    RESTARTS     AGE
sample-job-onfailure-restart-lgtjw   1/1     Running   1 (6s ago)   38s


📜 태스크와 작업 큐 병렬 실행

completions(성공 횟수를 지정), parallelism(병렬성을 지정), backoffLimit(실패를 허용하는 횟수를 지정)

(a) 1회만 실행하는 태스크 - completions=1/parallelism=1/backoffLimit=0

apiVersion: batch/v1
kind: Job
metadata:
  name: sample-oneshot-task-job
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 0
  template:
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["sleep"]
        args: ["30"]
      restartPolicy: Never

(b) N개 병렬로 실행시키는 태스크 - completions=N/parallelism=M/backoffLimit=P

# 파드가 5회 정상 종료할 때까지 세 개 병렬로 실행한다.

apiVersion: batch/v1
kind: Job
metadata:
  name: sample-multi-task-job
spec:
  completions: 5
  parallelism: 3
  backoffLimit: 5
  template:
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["sleep"]
        args: ["30"]
      restartPolicy: Never

(c) N개 병렬로 실행하는 작업 큐 - completions=미지정/parallelism=M/backoffLimit=P

# 파드가 5회 정상 종료할 때까지 세 개 병렬로 실행한다.

apiVersion: batch/v1
kind: Job
metadata:
  name: sample-multi-workqueue-job
spec:
  # completions: 1
  parallelism: 3
  backoffLimit: 1
  template:
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["sleep"]
        args: ["30"]
      restartPolicy: Never
  • 태스크와 작업 큐는 잡을 표시할 때 COMPLETIONS의 출력 형식이 다르다. (태스크: 0/5, 작업 큐: 0/1 of 3)

  • 이는 세 개 병렬로 실행 중 하나가 정상 종료하면 되지만 아직 하나도 정상 종료되지 않은 것을 나타낸다.

kubectl get job
NAME                         COMPLETIONS   DURATION   AGE
sample-multi-task-job        0/5           12s        12s
sample-multi-workqueue-job   0/1 of 3      6s         6s

(d) 한 개씩 실행하는 작업 큐 - completions=미지정/parallelism=1/backoffLimit=P

apiVersion: batch/v1
kind: Job
metadata:
  name: sample-single-workqueue-job
spec:
  # completions: 1
  parallelism: 1
  backoffLimit: 1
  template:
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["sleep"]
        args: ["30"]
      restartPolicy: Never
  • 성공 횟수(completions)는 나중에 변경할 수 없는 파라미터이지만, 병렬 수(parallelism)는 변경이 가능하다.
$  kubectl get job
NAME                          COMPLETIONS   DURATION   AGE
sample-single-workqueue-job   0/1           11s        11s


$ kubectl patch job sample-single-workqueue-job -p '{"spec": {"parallelism": 2}}'
job.batch/sample-single-workqueue-job patched


$ kubectl get job
NAME                          COMPLETIONS   DURATION   AGE
sample-single-workqueue-job   1/1 of 2      34s        55s


📜 일정 기간 경과 후 잡 삭제

잡은 종료 후에 삭제되지 않고 남느데, spec.ttlSecondsAfterFinished 통해 잡이 종료한 후에 일정 기간(초) 경과 후 삭제하도록 설정할 수 있다.

apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job-ttl
spec:
  ttlSecondsAfterFinished: 30
  completions: 1
  parallelism: 1
  backoffLimit: 10
  template:
    spec:
      containers:
      - name: tools-container
        image: amsy810/tools:v2.0
        command: ["sleep"]
        args: ["60"]
      restartPolicy: Never
# job 상태 모니터링
$ kubectl get job sample-job-ttl --watch --output-watch-events
EVENT      NAME             COMPLETIONS   DURATION   AGE
ADDED      sample-job-ttl   0/1           52s        52s
MODIFIED   sample-job-ttl   1/1           64s        94s
DELETED    sample-job-ttl   1/1           64s        94s


KUBERNETES 카테고리 내 다른 글 보러가기

댓글 남기기