Container/Kubernetes

[Kubernetes] 쿠버네티스 잡(job) 개념

Nirsa 2020. 2. 21. 14:14
반응형

 

  • 쿠버네티스 잡(job) 이란?

잡은 하나 이상의 파드를 지정하고 지정된 수의 파드를 성공적으로 실행하도록 하는 설정 입니다. 노드의 H/W 장애나 재부팅 등으로 인해 파드가 정상 실행이 되지 않았을 경우 job은 새로운 파드를 시작하도록 할 수 있습니다.

즉, 백업이나 특정 배치 파일들처럼 한번 실행하고 종료되는 성격의 작업에 사용될 수 있습니다.

 

  • 잡 생성 및 확인

아래 코드는 원주율은 2000 자리까지 계산 후 출력해주는 코드 입니다.

저는 경로를 "/root/kubespray/inventory/test/job/"에 test-job.yaml 로 저장 하였습니다.

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
  • apiVersion batch/v1 → 쿠버네티스의 batch/v1 API를 사용 합니다.
  • kind: Job → Job의 작업으로 명시 합니다.
  • metadata.name → Job 이름을 설정 합니다.
  • spec.template.spec.containers → 실행할 컨테이너의 t설정을 저장 합니다.
  • spec.template.spec.containers.restartPolicy → 파드의 재시작 정책을 설정 합니다. Never는 재시작을 하지 않는 설정 입니다.

 

kubectl apply -f test-job.yaml 을 실행 후 kubectl get job 으로 잡 이름을 확인 후 kubectl describe job [잡 이름] 을 입력하면 아래와 같이 성공적으로 실행 했으며 약 11초가 걸렸다는 내용을 확인할 수 있습니다.

 

추가적으로 해당 실행 값을 확인할 땐 kubectl get pods 로 파드의 이름을 확인한 뒤 kubectl logs [파드 이름] 을 입력하면 아래와 같이 실행 값을 확인할 수 있습니다.

 

  • restartPolicy, backoffLimit 필드 옵션

 restartPolicy 필드 옵션에는 아래와 같이 3가지가 있으며 상황에 따른 재시작 유무는 쿠버네티스 docs 문서에서 확인할 수 있습니다. 아래 docs 문서 링크에서 Ctrl+F로 Example states 를 검색하면 확인 가능 합니다.

  • Always → 항상 재시작 합니다.
  • OnFailure → 비정상 종료 발생 시 컨테이너를 재시작 합니다.
  • Never → 재시작을 하지 않습니다.

restartPolicy 필드 상황별 재시작 유무 : https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

 

backoffLimit 은 백오프 정책이라고 하며 잡에 실패할 경우 다시 실행시킬 재시도 횟수를 지정 합니다. 기본적으로 6이 설정 되어 있으며 재시작 실패 후 10초, 20초, 40초와 같이 실행을 재시도 합니다. 

 

  • 여러개의 컨테이너 처리

아래 코드와 같이 하나의 파드에 여러개의 컨테이너를 처리할수도 있습니다. pi 라는 파드 이름을 가진 작업에 pi1, pi2 컨테이너를 생성하고 pi1은 원주율의 100자리 계산 후 출력, pi2는 원주율의 200자리 계산 후 출력 입니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi1
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(100)"]
      - name: pi2
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(200)"]
      restartPolicy: Never
  backoffLimit: 4

 

kubectl apply -f [yaml파일명] 이후 파드 이름으로 logs를 출력하려고 하면 입력했던 2개의 컨테이름(pi1, pi2)이 출력되면서 하나를 선택하라고 합니다.

kubectl logs [파드명] pi1 과 같이 입력하면 각각의 컨테이너 출력값을 확인할 수 있습니다.

 

  • 병렬 잡 (Parallel Jobs)

바로 위에서는 하나의 잡과 하나의 파드에 컨테이너를 여러개 실행 시켰다면, 병렬 잡은 하나의 잡에 여러개의 파드를 실행시켜 작업하는것을 말합니다. 이 작업을 할땐 비정렬 작업, 완료 횟수가 고정되어있는 병렬 작업, 작업간 대기열이 존재하는 병렬 작업이 대표적인 예 입니다.

위의 3가지 상황에 따른 옵션 선택은 아래 링크에서 Ctrl + F로 Parallel Jobs 를 검색하면 찾을 수 있습니다.

3가지 상황에 따른 옵션 선택 : https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

 

아래 코드는 3개의 파드를 실행 시키며 파드가 3개 이상 정상 종료 될 경우 잡을 성공 처리 하는 코드 입니다. completions과 parallelism은 둘 다 기본값은 1 입니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 3
  parallelism: 3
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(100)"]
      restartPolicy: Never
  backoffLimit: 4
  • spec.completions: 3 → 파드가 3개 이상 정상 종료 될 경우 잡을 성공 처리 합니다.
  • spec.parallelism: 3 → 한번에 3개의 파드를 실행 합니다.

 

위의 코드를 실행하면 아래와 같이 3개의 파드가 실행 된것을 확인할 수 있습니다.

 

반응형