본문 바로가기
Work/책 정리

[쿠버네티스패턴] 7장 배치 잡

by ★용호★ 2020. 9. 27.
배치 잡이란?
  • 짧은 수명을 가진 파드를 분산 환경에서 완료될 때까지 안정적으로 실행하는 기능이다.
  • 독립된 원자 작업단위, 즉 더 이상 쪼갤 수 없을 정도의 작은 작업 단위를 관리하는데 적합하다.

 

문제

미리 정의된 일정 시간의 작업단위를 안정적으로 실행한 후 컨테이너를 종료하는 것이 필요한 경우가 있다.

쿠버네티스에서는 아래와 같이 파드를 생성하는 방법이 다양하다.

  • 순수 파드
    • Kind: Pod의 형태로 선언한 파드이다.
    • 파드를 수동으로 실행한다.
    • 장애 발생 시 파드는 다시 실행되지 않는다.
    • 개발이나 테스트 목적을 제외하고는 이런 방식의 파드 실행은 권장하지 않는다.
  • 레플리카세트
    • 레플리카세트로 파드를 생성하면 레플리카세트 컨트롤러에 의해 관리된다.
    • 레플리카세트 컨트롤러는 지속적으로 실행되는 파드의 수명주기를 생성하고 관리한다.
    • 실행 중인 파드의 레플리카세트를 지속적으로 유지하고 지정된 수와 동일한 파드의 수가 가용함을 보장한다.
  • 데몬세트
    • 모든 노드에 하나의 파드를 실행한다.
    • 일반적으로 모니터링, 로그 수집, 스토리지 컨테이너 등에 사용된다.

위와 같은 방법들로 생성된 파드의 공통점은 시간이 지나도 멈추지 않는 장기 실행 프로세스라는 것이다. 경우에 따라서 명령 실행 후 컨테이너를 종료하는 것이 필요한데 쿠버네티스에서는 잡(Job)이라는 자원을 제공한다.

해결책

쿠버네티스 잡은 하나 이상의 파드를 생성하고 성공적으로 실행되는 것을 보장한다.

레플리카세트와 비슷해보이지만 일단 예측된 파드 수까지 성공적으로 도달하면 잡은 완료된 것으로 간주하고 더 이상 추가로 파드가 시작되지 않는다는 점이 다르다.

 

apiVersion: batch/v1
kind: Job
metadata:
  name: random-generator
spec:
  completions: 5
  parallelism: 2
  template:
    metadata:
      name: random-generator
    spec:
      restartPolicy: OnFailure
      containers:
      - image: k8spatterns/random-generator:1.0
			  name: random-generator
        command: ["java", "-cp", "/", "RandomRunner", "/numbers.txt", "10000"]
  • Job이 완료되기 위해 5개의 파드가 실행되어야 하고 모두 성공해야한다.
  • 2개의 파드가 병렬로 실행 될 수 있다.
  • restartPolicy가 필수적으로 지정되어야 한다.
    • 레플리카세트와의 중요한 차이점 중 하나인데 레플리카세트에서는 기본 값이 Always인 반면, 잡은 Always가 허용되지 않고, OnFailure나 Never 둘 중에 하나만 사용 가능하다.
    • 즉 레플리카세트는 장기적으로 실행되어야 하는 프로세스에 적합하고 Job은 실패시 재시도를 하거나 실패되더라도 실패된 채로 종료되는 단발성 명령 실행에 적합하다.

 

Job을 사용했을 때의 이점
  • 일시적인 인메모리 작업이 아니라 클러스터 재시작에도 살아남는 지속된 작업이다.
    • 클러스터가 재시작 되더라도 완료되지 않은 Job은 다시 실행된다.
  • 완료되고 나면 삭제되지 않고 추적 목적으로 유지된다.
    • Job 실행이 끝나면 Complete 상태로 남아 직접 Pod로 접속해보거나 log를 확인해볼 수 있다.
    • 순수 파드인 경우에도 확인이 가능하지만 restartPolicy가 OnFailure로 설정되어야 한다.
  • 여러번 실행이 필요한 잡도 수용한다.
    • .spec.completions 값을 지정하여 원하는 횟수를 지정할 수 있다.
  • 노드에 장애가 발생하여 파드가 어떤 이유로 축출되었을 때 스케줄러는 새로운 정상상태 노드에 파드를 배치하고 재실행한다.
    • 순수 파드의 경우에는 다른 노드로 옮겨지지 않고 실패 상태로 남는다.

     

Job의 중요 필드
  • .spec.completions
    • 잡을 완료하기 위해 실행되어야 하는 파드 수 지정
  • .spec.parallelism
    • 몇 개의 파드를 동시에 실행할지 지정
    • 지정한 수를 반드시 지켜서 실행되지는 않을 수 있다. 노드의 리소스 상태나 리소스쿼터, 남은 완료 횟수 부족의 이유로 지정한 수보다 적은 수로 Pod가 유지될 수도 있다.
    • 0으로 지정할 경우 실행을 잠시 보류하는 일시 중지 상태가 된다.

 

Job의 종류
  • 단일 파드 잡(Single Pod Job)
    • .spec.completions 값과 .spec.parallelism 값을 생략하거나 기본 값인 1로 설정한 경우
    • 하나의 파드만 시작하고 파드가 성공적으로 종료되자마자 완료된다.
      • 실패를 감지하는 것은 exit 코드가 0이 아닌 값이 반환되었을 경우이다.
  • 고정 완료 횟수 잡(Fixed completion count Job)
    • .spec.completions에 1보다 큰 수를 지정하면 지정한 수만큼 파드가 성공해야 완료된다.
    • 선택적으로 .spec.parallelism 값을 설정하거나 값을 생략하여 기본 값인 1로 설정할 수 있다.
    • 미리 작업 항목 수를 알고 있을 때 최선의 선택이며, 실행 되는 명령마다 전용 파드를 사용한다고 볼 수 있다.
  • 작업 큐 잡(work queue Job)
    • .spec.completions 값을 생략하고 .spec.parallelism을 1보다 큰 정수로 설정하면 병렬잡에 대한 작업 큐를 가지게된다.
    • 최소한 하나의 파드가 성공적으로 종료되고 또 다른 모든 파드가 종료될 때 완료된 것으로 간주한다.
    • 파드 서로간의 협력이 필요하고 조화롭게 끝내기 위해 각 파드가 무엇을 작업할지를 결정해야한다.
      • ex) 작업 대기열을 보관하기 위한 스토리지 서비스를 대상으로 병렬 파드가 이 대기열로부터 작업을 하나씩 꺼내어 작업을 수행한다. 큐가 빈것을 감지한 파드는 종료된다. 이런 잡 유형은 세분화된 작업 항목에 매우 적절하다.
      • 참고 : https://kubernetes.io/ko/docs/tasks/job/fine-parallel-processing-work-queue/

 

댓글