[kubernetes] 쿠버네티스 패턴 - 배치 잡

박원균·2021년 11월 21일
0

Kubernetes

목록 보기
20/24
post-thumbnail

배치 잡 패턴?

독립된 원자 작업단위를 관리하는데 적합 합니다. 배치 잡은 잡 추상화를 기초로 하며, 짧은 수명 파드를 분산 환경에서 완료될 때 까지 안정적으로 실행합니다.

문제

파드 생성 방법

  • 순수 파드
    컨테이너를 실행시키기 위해 파드를 수동으로 생헝할 수 있습니다. 하지만 파드가 실행 중인 노드에 장애가 발생하면 파드는 복구되지 않습니다.

    개발이나 테스트 목적을 제외하고는 이런 방식의 파드 실행은 권장되지 않습니다.
    순수 파드 방식
    • 비관리 파드(bare Pod)
    • 꾸밈없는 파드(naked Pod)
  • 레플리카 세트
    레플리카세트 컨트롤러는 지속적으로 실행되는 파드의 수명주기를 생성하고 관리하는 데 사용됩니다. 언제라도 실행 중인 파드의 레플리카 세트를 지속적으로 유지하고, 지정된 수와 동일한 파드의 수가 가용함을 보장합니다.
  • 데몬 세트
    데몬세트 컨트롤러는 모든 노드에 하나의 파드를 실행하는 컨트롤러입니다. 일반적으로 모니터링, 로그 수집, 스토리지 컨테이너 등의 플랫폼 기능을 관리하는데 사용됩니다.

이런 파드들의 공통적인 측면은 시간이 지나도 멈추지 않는 장기 실행 프로세스라는 것입니다. 그러나 경우에 따라서는 미리 정의된 일정 시간의 작업단위를 안정적으로 실행한 후 컨테이너를 종료하는 것이 필요합니다. 이런 작업을 위해 잡이라는 자원을 제공합니다.

해결책

예측된 파드 수까지 성공적으로 도달하면 잡은 완료된 것으로 간주되고 더 이상 추가로 파드가 시작되지 않습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: random-generator
spec:
  completions: 5	# 잡이 완료되기 위해서는 5개의 파드가 실행되어야 하고 모두 성공해야합니다.
  parallelism: 2	# 2개의 파드가 병렬로 실행될 수 있습니다.
  template:
    metadata:
      name: random-generator
    spec:
      restartPolicy: OnFailure # 잡에는 restartPolicy가 필수적으로 지정되어야 합니다.
      containers:
      - image: k8spatterns/random-generator:1.0
        name: random-generator
        command: ["java","-cp","/","RandomRunner","/number.txt","10000"]

잡과 레플리카세트 정의 사이에서 중요한 차이점 중 하나는 .spec.template.spec.restartPolicy입니다.

레플리카세트의 기본 값은 Always이지만 이는 항상 지속적으로 실행되어야 하는 장기 실행 프로세스에 적합합니다. 잡에는 Always 값이 허용되지 않으며 OnFailureNever 값 중 하나만 사용 가능합니다.

잡을 사용하면서 얻는 안정성과 확장성

  • 잡은 일시적인 인메모리 작업이 아니라 클러스터 재시작에도 살아남는 지속된 작업입니다.
  • 잡은 완료되고 나면, 삭제되지 않고 추적 목적으로 유지됩니다. 잡의 일부분으로 생성된 파드도 삭제되지 않으며 검사가 가능합니다.(오직 restartPolicy: OnFailure일 때만 동일합니다.)
  • 잡은 여러 번 실행되어야 할 수도 있습니다. .spec.completions 항목을 사용하면 잡이 완료되기 전에 파드가 성공적으로 끝나야 하는 횟수를 지정할 수 있습니다.
  • 잡이 여러 번 완료되어야 하는 경우 여러 개의 파드를 동시에 실행해서 잡을 확장할 수도 있습니다 .spec.parallelism 필드를 이용합니다
  • 파드가 실행 중인 동안 노드에 장애가 생기거나 파드가 어떤이유로 축출되었을 때 스케줄러는 새로운 정상상태 노드에 파드를 배치하고 재실행합니다. 기존의 순수 파드는 또 다른 노드로 결코 옮겨지지 않기 때문에 순수 파드는 실패 상태로 남습니다.

잡 동작에서 중요한 역할인 필드

  • .spec.compltetions
    잡을 완료하기 위해 실행되어야 하는 파드의 수를 지정한다.
  • .spec.parallelism
    몇 개의 파드를 동시에 실행하지를 지정합니다. 큰 수를 지정한다고 해서 높은 수준의 병렬 처리를 보장하는 것은 아니며 실제 파드 개수는 요청된 파드 개수보다 작을 수 있습니다. 이 필드를 0으로 설정하면 잡은 효과적으로 일시 중지됩니다.

위 두개를 기반으로 잡의 종류가 있을 수 있습니다.

  • 단일 파드 잡 (Single Pod Job)
    이 유형은 .spec.completions 값과 .spec.parallelism 값을 생략하거나 기본 값이 1로 세팅하면 됩니다.
    하나의 파드만 시작하고 파드가 성공적으로 종료되자마자 완료됩니다.
  • 고정 완료 횟수 잡 (Fixed completion count Job)
    1보다 큰 수를 .spec.completions에 지정하면 많은 파드가 성공해야 합니다. 선택적으로 .spec.parallelism 값을 설정하거나 값을 생략하여 기본 값인 1로 세팅할 수 있습니다 .spec.completions 설정 값과 같은 수의 파드가 성공적으로 완료되어야 합니다.
  • 작업 큐 잡 (Work queeu Job)
    .spec.completions 값을 생략하고 .spec.parallelism를 1보다 큰 정수로 세팅하면 병렬 잡에 대한 작업 큐를 가집니다.
    작업 큐 잡은 최소한 하나의 파드가 성공적으로 종료되고 또 다른 모든 파드가 종료될 때 완료된 것으로 간주됩니다. 이 설정은 파드 서로간의 협력이 필요하고 조화롭게 끝내기 위해서 각 파드가 무엇을 작업할지를 결정해야 합니다.

    예를 들어서 고정된 그러나 그 수는 알 수 없는 작업 항목이 큐에 저장된 경우, 병렬 파드가 이들을 하나씩 꺼내어 작업할 수 있습니다. 큐가 빈 것을 감지한 그리고 성공적으로 종료된 첫 번째 파드는 잡의 완료를 표시합니다.

    잡 컨트롤러 또한 또 다른 모든 파드가 종료될 때까지 기다린다. 하나의 파드가 여러 작업 항목을 처리하므로 이런 잡 유형은 세분화된 작업 항목에 매우 적절합니다. 작업 항목당 하나의 파드에 대한 오버헤드가 타당하지 않을 때 입니다.
profile
함바라기

0개의 댓글