배치 잡 패턴은 독립된 원자 작업단위를 관리하는데 적합합니다.
짧은 수명 파드를 분산 환경에서 완료될 때까지 안정적으로 실행합니다.
쿠버네티스에서 컨테이너를 관리하는 기본적인 단위는 파드입니다.
여기서 파드는 여러 종류가 있으며 각각의 특성에 따라 사용되고 관리됩니다.
다음은 여러 종류의 파드에 대한 설명입니다.
kind: Pod
로 정의된 파드 같이 컨테이너를 실행시키기 위해 수동으로 생성된 파드이 파드들의 공통점은 시간이 지나도 멈추지 않는 장기 실행 프로세스 라는 것 입니다.
하지만 경우에 따라서는 미리 정의된 일정 시간의 작업단위를 안정적으로 실행한 후 종료하는 컨테이너가 필요합니다.
쿠버네티스는 이를 해결하기 위해 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
해당 Job 은 kubectl apply -f job.yaml
명령어로 실행 할 수 있습니다.
또한 kubectl logs $pods
명령어로 로그를 확인하면 다음과 같습니다.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
Always
값이 허용되지 않으며 OnFailure
과 Never
값 중에 하나만 사용 가능OnFailure
은 컨테이너가 종료 될 때 0이 아닌 종료 코드인 경우에만 다시 시작함을 의미Never
은 컨테이너가 종료된 이유에 관계없이 다시 시작되지 않음을 의미.spec.completions
에 값을 명시하며 기본 값은 .spec.parallelism
과 동일하게 설정.spec.parallelism
에 값을 명시하며 기본 값은 1
.spec.backoffLimit
에 값을 명시하며 기본 값은 6
.spec.activeDeadlineSeconds
에 초 단위 값을 명시Job 은.spec.completions
와 .spec.parallelism
에 따라서 세 가지 종류로 나눌 수 있습니다.
.spec.completions
값과 .spec.parallelism
값이 1
로 세팅될 때와 같음.spec.completions
에 1보다 큰 수를 지정하며, .spec.parallelism
은 선택적으로 설정.spec.parallelism
에 1보다 큰 수를 지정하며 .spec.completions
를 생략해야 함.spec.completions
를 통해서 성공적으로 끝나야 하는 횟수를 지정 가능.spec.parallelism
을 통해서 병렬적으로 실행할 수 있음이번 글에서는 Job 에 대해서 알아보았습니다.
Job 은 다른 파드와는 다르게 완료를 목표로하는 파드입니다.
따라서 장기적으로 실행되어야 하는 프로스세가 아니라면
Job 을 통해서 필요할 때만 짧게 실행되야 하는 프로세스에 효과적으로 사용할 수 있을 것 입니다.
또한 Job 은 독립된 작업단위를 믿을 만하고 스케일 가능한 실행 단위로 전환할 수 있도록 합니다.
그러나 개별적으로 처리 가능한 작업 항목을 Job 을 통해서 처리하지는 않습니다.
따라서 두 가지 정도를 고려해 볼 수 있습니다.
위의 두 가지 패턴의 트레이드 오프를 잘 파악하여 적절한 작업을 Job 에 할당한다면
Job 이외의 파드에서 할 수 없는 것들을 많이 해결 할 수 있을 것입니다.