패스트캠퍼스 캐시백 챌린지 66일차
Job과 CronJob API Resource와 관련된 내용의 클립을 수강하는식으로 챌린지를 진행하였다. k8s에서 사용하는 크론잡이 리눅스의 내용과 많이 겹친다고 한다. 4월부터 시작된 기나긴 챌린지가 드디어 막을 내리게 되었다. 다음주안으로 최종미션 포스팅을 올리고 종결짓게 될 것 같다..!!
잡(Job)
- 특정 동작을 수행하고 종료하는 작업을 정의하기 위한 리소스
- 내부적으로 파드를 생성하여 작업 수행
- Pod의 상태가 Running이 아닌 Completed가 되는 것이 최종 상태
- 실패시 재시작 옵션, 작업 수행 회수, 동시 실행 수 등 세부 옵션 제공
⇒ 지속적으로 실행되는 서비스가 아니라 특정 작업을 수행하고 종료해야 하는 경우에 사용
크론잡
- 주기적으로 특정 동작을 수행하고 종료하는 작업을 정의하기 위한 리소스
- 리눅스의 크론(Cron) 스케줄링 방법을 그대로 사용
- 내부적으로 잡을 생성하여 작업 수행
- 주기적으로 데이터를 백업하거나 데이터 점검 및 알림 전송 등의 목적으로 사용
⇒ 주기적으로 특정 작업을 수행하고 종료해야 하는 경우에 사용
실습 링크는 아래의 링크에 해당한다.
https://github.com/tedilabs/fastcampus-devops/tree/main/3-docker-kubernetes/13-k8s-job
$ cat job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
spec:
restartPolicy: Never
containers:
- name: hello
image: ubuntu:focal
command: ["sh", "-c", "echo Hello World!"]
job은 k8s의 batch API 그룹에 속하기에 batch/v1으로 명시해준다.
Job은 completed가 되면 종료되어야하기에 restartPolicy의 옵션중에서 always는 부적절하다. 따라서 restartPolicy 옵션으로는 Never과 OnFailure를 쓰는 것이 좋다.
job이 수행되고나면 Status가 Completed로 변경되고, describe를 통해서도 succeeded로 된 것을 확인할 수 있다.
$ cat job-parallelusm.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
completions: 10
parallelism: 2
template:
spec:
restartPolicy: Never
containers:
- name: hello
image: ubuntu:focal
command: ["sh", "-c", "sleep 2; echo Hello World!"]
comletions: Job을 몇번을 성공시킬지(실행시킬지)
parallelism: 최대 동시 실행횟수
최대 동시에 실행되는 Pod가 2개이기에 Completed Pod가 아닌 pod가 2개씩 존재해가며 작업이 진행된다.
$ cat job-deadline.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
activeDeadlineSeconds: 3
template:
spec:
restartPolicy: Never
containers:
- name: hello
image: ubuntu:focal
command: ["sh", "-c", "sleep 5; echo Hello World!"]
activeDeadlineSeconds 속성은 job이 최대 실행될 수 있는 최대의 timeout 시간을 설정한다.
시간이 초과되는 경우 실패라고 간주한다. 실패 결과를 보기 위해 5초간 sleep으로 해둔 모습이다.
job이 최대 1번의 Completions 중 0번 성공하였음을 알 수 있다.
events를 보면 pod가 만들어졌다가 지워져 DeadlineExceeded 되었음을 확인할 수 있다.
$ cat cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-every-minute
spec:
schedule: "*/1 * * * *"
successfulJobsHistoryLimit: 5
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: hello
image: ubuntu:focal
command: ["sh", "-c", "echo Hello $(date)!"]
이번에는 kind가 Cronjob이고
jobTemplate: podTemplate이 아닌 jobTemplate임을 의미한다. job.yaml의 job object spec이 그대로 온 것이라 간주하면 된다.
schedule: cron expression이 들어가 이 경우에는 매 1분마다 cron job을 실행시키라는 의미이다.
successfulJobsHistoryLimit : 성공한 job 기록을 최대 몇개 남길지에 대한 속성
1분마다 job의 내역이 쌓여가는 것을 확인할 수 있다.
Deployment가 ReplicaSet을 감싸고, ReplicaSet이 Pod를 감싸던 것 처럼,
CronJob이 Job을 감싸고, Job이 Pod를 감싸는 것으로 이해하면 된다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
* 본 포스팅은 패스트캠퍼스 환급 챌린지를 위해 작성되었습니다.