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

오정재·2021년 4월 29일
5

쿠버네티스 패턴

목록 보기
8/12
post-thumbnail

👉 배치 잡

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

🍏 문제점

쿠버네티스에서 컨테이너를 관리하는 기본적인 단위는 파드입니다.
여기서 파드는 여러 종류가 있으며 각각의 특성에 따라 사용되고 관리됩니다.

다음은 여러 종류의 파드에 대한 설명입니다.

1) Bare Pod

  • YAML에 kind: Pod 로 정의된 파드 같이 컨테이너를 실행시키기 위해 수동으로 생성된 파드
  • 파드가 실행 중인 노드가 재부팅되거나 실패하면 파드가 종료되고 다시 시작되지 않음

2) 레플리카세트

  • 지속적으로 실행되는 파드의 수명주기를 생성하고 관리
  • 지정된 수(replicas)동일한 파드의 수가 실행되도록 보장

3) 데몬세트

  • 모든 노드에 하나의 파드를 실행할 때 사용
  • 모니터링, 로그 수집, 스토리지 컨테이너 등의 플랫폼 기능을 관리하는데 사용

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

🍏 해결책

쿠버네티스는 이를 해결하기 위해 Job 을 지원합니다.

Job 은 하나 이상의 파드를 생성하고 지정된 수의 파드성공적으로 완료될 때까지
계속해서 파드의 실행을 재시도하며 지정된 수의 파드가 성공적으로 완료된다면
더 이상 추가로 파드를 시작하지 않습니다.

Job의 사용

Job 을 사용하는 법에 대해서 파악하기 위해
파이의 2000 자리까지 계산해서 출력하는 Job 을 작성해보고 사용해보도록 하겠습니다.

다음은 yaml 예시입니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 5
  parallelism: 2
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

해당 Jobkubectl apply -f job.yaml 명령어로 실행 할 수 있습니다.
또한 kubectl logs $pods 명령어로 로그를 확인하면 다음과 같습니다.

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901

Job의 사양 작성

1) restartPolicy

  • 파드가 실패하였을 때 재시작을 위한 정책을 결정
  • Always 값이 허용되지 않으며 OnFailureNever 값 중에 하나만 사용 가능
    • OnFailure 은 컨테이너가 종료 될 때 0이 아닌 종료 코드인 경우에만 다시 시작함을 의미
    • Never 은 컨테이너가 종료된 이유에 관계없이 다시 시작되지 않음을 의미

2) completions

  • Job 이 성공적으로 완료되기 위한 파드의 완료 개수를 결정
  • .spec.completions 에 값을 명시하며 기본 값은 .spec.parallelism 과 동일하게 설정

3) parallelism

  • 몇 개의 파드를 동시에 실행할지를 결정
  • .spec.parallelism 에 값을 명시하며 기본 값은 1

4) backoffLimit

  • 파드가 실패할 때 재시도하는 횟수를 결정
  • backoff 방식 (10s, 20s, 40s ...) 으로 재시도
  • .spec.backoffLimit 에 값을 명시하며 기본 값은 6

5) activeDeadlineSeconds

  • 파드의 유효 데드라인을 결정하며, 지정된 시간 제한에 도달하면 추가 파드를 실행하지 않음
  • .spec.activeDeadlineSeconds초 단위 값을 명시

Job의 종류

Job.spec.completions.spec.parallelism 에 따라서 세 가지 종류로 나눌 수 있습니다.

1) Single Pod Job

  • 하나의 파드만 시작하고 하나의 파드가 성공적으로 종료되면 완료 되는 Job
  • .spec.completions 값과 .spec.parallelism 값이 1 로 세팅될 때와 같음

2) Fixed completion count Job

  • 완료 횟수가 고정되어있는 Job
  • 작업 항목 수를 알고 있을 때 유용함
  • .spec.completions 에 1보다 큰 수를 지정하며, .spec.parallelism 은 선택적으로 설정

3) Work queue Job

  • Work Queue 가 있어 Queue 로부터 작업을 받아와 병렬적으로 Job 을 실행할 때 사용
  • Job 이 실행되면 Queue 에 작업을 가져와 파드를 실행
  • .spec.parallelism 에 1보다 큰 수를 지정하며 .spec.completions 를 생략해야 함

Job의 특징 및 장점

  • 일시적인 in-memory 작업이 아니기 때문에 클러스터가 재시작해도 살아남아 지속됨
  • 완료되면 삭제되지 않고 추적 목적으로 유지 됨
  • .spec.completions 를 통해서 성공적으로 끝나야 하는 횟수를 지정 가능
  • .spec.parallelism 을 통해서 병렬적으로 실행할 수 있음
  • 파드가 실행 중인 동안 노드에 장애가 생기면 스케줄러가 정상상태의 노드로 파드를 재배치하고 실행함

🍏 정리

이번 글에서는 Job 에 대해서 알아보았습니다.
Job 은 다른 파드와는 다르게 완료를 목표로하는 파드입니다.

따라서 장기적으로 실행되어야 하는 프로스세가 아니라면
Job 을 통해서 필요할 때만 짧게 실행되야 하는 프로세스에 효과적으로 사용할 수 있을 것 입니다.

또한 Job 은 독립된 작업단위를 믿을 만하고 스케일 가능한 실행 단위로 전환할 수 있도록 합니다.
그러나 개별적으로 처리 가능한 작업 항목을 Job 을 통해서 처리하지는 않습니다.

따라서 두 가지 정도를 고려해 볼 수 있습니다.

1) 작업 항목당 하나의 잡 (One Job per work item)

  • 작업 마다 하나의 Job 으로 처리하는 것
  • 작업이 독립적으로 기록, 추적, 확장 되어야하는 경우에 유용
  • 쿠버네티스에서 잡을 생성하는 오버헤드가 있음

2) 모든 작업 항목에 대해 하나의 잡 (One Job for all work items)

  • 여러 작업을 하나의 Job 으로 처리하는 것
  • 작업이 독립적으로 관리될 필요가 없는 경우에 유용
  • 많은 작업이 있는 경우 복잡하여 관리하기 어려운 경우가 있음

위의 두 가지 패턴의 트레이드 오프를 잘 파악하여 적절한 작업을 Job 에 할당한다면
Job 이외의 파드에서 할 수 없는 것들을 많이 해결 할 수 있을 것입니다.

👉 Reference

profile
ohhong

0개의 댓글