• 이전 디플로이, 데몬셋은 실시간 반응형
  • job/cronjob은 단일 실행 완료형
  • 완료 가능한 단일 실행 Job 을 관리하는 Contoller
  • 한번 완료되기 전 장애 발생시 다시 시작 되며 성공적인 종료를 보장
  • 포드는 restartPolicy OnFailure 를 가지고 동작

시나리오

 

1. job-1.yaml 명세서 작성

apiVersion: batch/v1
kind: Job
metadata:
  name: test-job-1
spec:
  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - name: job-container
        image: busybox
        command: ["/bin/sleep", "15"] # 15초짜리 job
      terminationGracePeriodSeconds: 0

 

2. 생성 및 확인

root@ip-172-31-4-27:~# kubectl create -f job-1.yaml 
job.batch/test-job-1 created
root@ip-172-31-4-27:~# kubectl get jobs.batch 
NAME         COMPLETIONS   DURATION   AGE
test-job-1   0/1           13s        13s # 1회 성공했는지 확인

root@ip-172-31-4-27:~# kubectl get jobs.batch 
NAME         COMPLETIONS   DURATION   AGE
test-job-1   0/1           16s        16s

root@ip-172-31-4-27:~# kubectl get jobs.batch 
NAME         COMPLETIONS   DURATION   AGE
test-job-1   1/1           19s        21s

root@ip-172-31-4-27:~# kubectl get jobs.batch,po 
NAME                   COMPLETIONS   DURATION   AGE
job.batch/test-job-1   1/1           19s        94s #@ 컨트롤러
NAME                   READY   STATUS      RESTARTS   AGE
pod/test-job-1-xmcs2   0/1     Completed   0          94s #@ 컨트롤러 기반의 pod 상태 확인

	#@ 15초 뒤에 pod의 상태가 0이 되고 job은 완료 했으므로 1로 변경된것을 확인한다.
	root@ip-172-31-4-27:~/job_cron# kubectl get jobs.batch,po
	NAME                   COMPLETIONS   DURATION   AGE
	job.batch/test-job-1   1/1           20s        72s

	NAME                   READY   STATUS      RESTARTS   AGE
	pod/test-job-1-t56tg   0/1     Completed   0          72s

3. job-2.yaml 명세서 작성

apiVersion: batch/v1
kind: Job
metadata:
  name: test-job-2
spec: # 3가지 param의 특징을 이해한다
  completions: 3 # 반복해서 횟수를 지정할 수 있다
#  parallelism: 2
#  activeDeadlineSeconds: 30
  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - name: job-container
        image: busybox
        command: ["/bin/sleep", "15"]
      terminationGracePeriodSeconds: 0

 

4. 생성 및 확인

root@ip-172-31-4-27:~# kubectl create -f job-2.yaml (completions test)
root@ip-172-31-4-27:~# kubectl get jobs.batch,po 
NAME                   COMPLETIONS   DURATION   AGE
job.batch/test-job-1   1/1           19s        5m13s
job.batch/test-job-2   1/3           26s        26s # 3회 완성이 되어야 한다.

NAME                   READY   STATUS      RESTARTS   AGE
pod/test-job-1-xmcs2   0/1     Completed   0          5m13s
pod/test-job-2-jc6rm   1/1     Running     0          7s
pod/test-job-2-jgfs9   0/1     Completed   0          26s

	#@ pod가 complete 될때 마다 job이 1씩 증가됨을 확인
	root@ip-172-31-4-27:~/job_cron# kubectl get jobs.batch,po 
	NAME                   COMPLETIONS   DURATION   AGE
	job.batch/test-job-2   3/3           60s        114s

	NAME                   READY   STATUS      RESTARTS   AGE
	pod/test-job-2-gq9f5   0/1     Completed   0          114s
	pod/test-job-2-rsq65   0/1     Completed   0          74s
	pod/test-job-2-xqlhj   0/1     Completed   0          94s

 

병렬 처리 시나리오

spec:
  completions: 5 <----수정
  parallelism: 2  <----수정 # 병렬처리 테스트 : 2개의 pod 중에 Total 5번을 completions 하면 된다.
#  activeDeadlineSeconds: 30
  template:
    spec:
      restartPolicy: OnFailure
root@ip-172-31-4-27:~# kubectl create -f job-2.yaml (parallelism test)

1. job-2.yaml 명세서 수정

spec:
  completions: 5 
  parallelism: 2 
  activeDeadlineSeconds: 30   <----수정
  template:
    spec:
      restartPolicy: OnFailure

2. 수행 및 확인

root@ip-172-31-4-27:~# kubectl create -f job-2.yaml (activeDeadlineSeconds test)

	#@ 30초 마다 pod 두개가 생성 -> 삭제 되면서 job의 complete가 늘어남을 확인한다.
	root@ip-172-31-4-27:~/job_cron# kubectl get jobs.batch,po
	NAME                   COMPLETIONS   DURATION   AGE
	job.batch/test-job-2   2/5           3m32s      3m32s

	NAME                   READY   STATUS      RESTARTS   AGE
	pod/test-job-2-6tt5t   0/1     Completed   0          3m32s
	pod/test-job-2-bghnw   0/1     Completed   0          3m32s

 

CronJob 시나리오

  • 리눅스의 crontab과 비슷한 기능이다.
  • /1 : 1분 간격 -> 1분마다 job을 생성해서 pod를 생성한다.
  • /15 : 15분 가격 (1시간에 4번)
  • /20 : 20분 간격 (1시간에 3번)

1.CronJob.yaml 명세서 작성

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cron-job
spec:
  schedule: "*/1 * * * *" # 1분 마다 반복 수행
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: job-container
            image: busybox
            command: ["/bin/sleep", "15"] # 수명이 15초인 pod 생성
          terminationGracePeriodSeconds: 0

2. 생성 및 확인

root@ip-172-31-4-27:~# kubectl get -f CronJob.yaml 
NAME       SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cron-job   */1 * * * *   False     0        <none>          34s

root@ip-172-31-4-27:~# kubectl get cronjobs
NAME       SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cron-job   */1 * * * *   False     0        <none>          49s

root@ip-172-31-4-27:~# kubectl get cronjobs,jobs,po
NAME                     SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/cron-job   */1 * * * *   False     0        24s             81s

NAME                            COMPLETIONS   DURATION   AGE
job.batch/cron-job-1600314240   1/1           20s        24s
job.batch/test-job-1            1/1           19s        12m
job.batch/test-job-2            3/3           59s        7m41s

NAME                            READY   STATUS      RESTARTS   AGE
pod/cron-job-1600314240-vsznn   0/1     Completed   0          24s

	#@ cron-job에 의해서 job 생성 pod 생성됨을 확인한다.
	#@ 1분마다 job이 생성되고 pod가 15초 후 종료 될때 마다 job은 complete 된다.
	root@ip-172-31-4-27:~/job_cron# kubectl get cronjobs,jobs,po
	NAME                     SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
	cronjob.batch/cron-job   */1 * * * *   False     1        10s             5m

	NAME                            COMPLETIONS   DURATION   AGE
	job.batch/cron-job-1606974420   1/1           20s        3m8s
	job.batch/cron-job-1606974480   1/1           20s        2m8s
	job.batch/cron-job-1606974540   1/1           21s        68s
	job.batch/cron-job-1606974600   0/1           8s         8s

	NAME                            READY   STATUS      RESTARTS   AGE
	pod/cron-job-1606974420-9fdg8   0/1     Completed   0          3m8s
	pod/cron-job-1606974480-mzr6x   0/1     Completed   0          2m8s
	pod/cron-job-1606974540-hbfgc   0/1     Completed   0          68s
	pod/cron-job-1606974600-p98tl   1/1     Running     0          8s

 

Suspend 시나리오

  • create : 이미 있으면 에러
  • apply : create + update
  • patch : edit와 달리 특정 속성만 수정할때 사용한다.
  • edit : 전체 속성을 수정할때 사용
  • set : 이미지 업그레이드 할때 set을 사용한다.

1. 수정 및 확인

#kubectl patch cronjobs cron-job -p '{"spec" : {"suspend" : true }}' #일시 중지 옵션 true
# kubectl get cronjobs,jobs,po
	root@ip-172-31-4-27:~/job_cron# kubectl get cronjobs,jobs,po
	NAME                     SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
	cronjob.batch/cron-job   */1 * * * *   True      1        37s             6m27s #@ SUSPEND가 true로 변경되었다.


#kubectl patch cronjobs cron-job -p '{"spec" : {"suspend" : false }}' <-- 재시작
# kubectl get cronjobs,jobs,po
	root@ip-172-31-4-27:~/job_cron# kubectl get cronjobs,jobs,po
	NAME                     SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
	cronjob.batch/cron-job   */1 * * * *   False     1        5s              6m55s
	#@ SUSPEND가 false로 변경되었고 다시 cron-job이 재실행되는것을 확인한다.

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Ingress Controller  (0) 2020.12.03
Service Controller  (0) 2020.12.03
DaemonSetController  (0) 2020.12.03
Scheduler  (0) 2020.12.02
Configmaps  (0) 2020.12.02

+ Recent posts