- 특정 작업을 간단하게 자동화하고 관리를 위해 사용되는 기능들이다.
DaemonSet
- 클러스터의 각 노드에 하나의 파드를 배포하여, 모든 노드에서 특정 작업을 수행하도록 보장하는 쿠버네티스 리소스.
- ReplicaSet은 자원이 없다면 Pod을 생성할 수 없지만 DaemonSet은 노드마다 Pod를 무조건 하나씩 배포한다.
- 로그 수집기, 모니터링, 네트워크 플러그인 등 모든 노드에서 동일한 작업을 수행해야 할 때 유용
- Selector와 Label을 이용해서 노드마다 Pod 생성
- 만약 특정 Node만 Pod을 생성하고싶다면, nodeSelector를 지정하면 해당 node만 Pod생성
JOB
- Pod 생성 방법으로 3가지가 있다. 직접 생성, 레플리카셋으로 생성, Job으로 생성
- 모두 같은 Pod이지만 어디서 만들어졌냐에 따라 달라진다.
- 직접 생성한 Pod은 동작 중지 시 바로 죽어버린다.
- 레플리카셋으로 생성한 Pod은 다른 노드에서 재시작. 새로 생성이 아닌 restart(원래 쓰던 정보)로 시작
- job으로 만든 Pod은 프로세서가 일하지 않으면 종료. 삭제는 아니고 stop 이다.
- Job은 특정 작업을 한번만 실행하고 삭제되어야할 때 주로 사용된다. (ex. DB백업, 데이터처리 작업 등..)
- Job도 레플리카셋과 마찬가지로 셀렉터와 템플릿이 있다.
- 템플릿은 특정 작업을 하고 삭제되는 템플릿
- 셀렉터는 따로 만들지않아도 Job이 알아서 생성.
- complitions : 작업이 완료되기위해 실행되어야하는 pod을 지정한다.
- parallelism : 병렬처리로 2를 주면 2개씩 파드가 생성되고, 일을 수행
- activeDeadlineSecond : 30을 주면 해당 Pod이 30초 후에 기능을 정지한다.
CronJob
- 크론잡은 Job들을 주기적인 시간에 따라서 생성하는 목적을 가진 역할.
- 정기적으로 반복 실행되어야하는 작업을 수행 -> 주기적인 DB백업, 예약메일, 주기적인 메일발송등이 그 예시이다.
- 크론 잡은 JobTemplate가 있다. -> JobTemplate으로 job을 생성
- Schedule : 스케줄의 시간을 주기로 잡을 생성하고 동작. 크론 포멧으로 사용.
- concurencyPolicy
- Allow : 일반적인 디폴트 값이다. 지정된 시간마다 새로운 job과 pod을 무조건 만든다.
- Forbid : 지정된 시간에 job을 생성하고 그다음 생성시간때 pod이 동작을 멈추거나 삭제된게 아니라면 skip한다. 그리고 해당 pod이 종료되는 즉시 다음 job을 실행.
- Replace : 지정된 시간에 job과 pod을 만들고, 다음 시간에 job은 놔두고 pod만 새로 생성한다. 그리고 또 다음 소요시간엔 새로운 job과 pod을 생성한다.



DaemonSet, Job, CronJob 실습
DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-1
spec:
selector:
matchLabels:
type: app
template:
metadata:
labels:
type: app
spec:
containers:
- name: container
image: kubetm/app
ports:
- containerPort: 8080
hostPort: 18080
- hostPort: 노드에서 사용되는 포트로 외부에서 접근할떄 사용.
- containerPort : Pod 내부에서 서비스가 수신하는 포트
- 데몬셋을 생성할 때 노드가 2개가 잇다면, 해당 노드에 Pod이 만들어지고 18080으로 접근하면 각 노드의 IP에 맞는 해당 Pod으로 연결.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-2
spec:
selector:
matchLabels:
type: app
template:
metadata:
labels:
type: app
spec:
nodeSelector:
os: centos
containers:
- name: container
image: kubetm/app:v1
ports:
- containerPort: 8080
- nodeSelector를 사용하여 os: centos 라벨을 가진 노드들만 pod 생성.
- 데몬셋의 디폴트 배포 방식은 롤링 업데이트. -> v1을 v2로 바꾸면 하나씩 차례대로 변경.
- 데몬셋 삭제시 해당 데몬셋이 만든 Pod은 모두 같이 삭제.
Job
apiVersion: batch/v1
kind: Job
metadata:
name: job-1
spec:
template:
spec:
restartPolicy: Never
containers:
- name: container
image: kubetm/init
command: ["sh", "-c", "echo 'job start';sleep 20; echo 'job end'"]
terminationGracePeriodSeconds: 0
- Job를 생성하고 20초뒤에 "job end" 로그 출력하는 Pod생성.
- 20초 뒤에 Pod이 종료되고 로그 확인 가능.
- job을 삭제하면 Pod도 같이 삭제.
apiVersion: batch/v1
kind: Job
metadata:
name: job-2
spec:
completions: 6
parallelism: 2
activeDeadlineSeconds: 30
template:
spec:
restartPolicy: Never
containers:
- name: container
image: kubetm/init
command: ["sh", "-c", "echo 'job start';sleep 20; echo 'job end'"]
terminationGracePeriodSeconds: 0
- 6개의 pod이 차례대로 실행되고, 2개씩 병렬처리 진행.
- 하지만. 코드를 보면 알수있듯이 30초 뒤에 job이 죽음.
- pod은 20초를 살아잇다가 죽는데. 다른 completions 때문에 차례대로 실행되는데 1,2 Pod은 20초 유지후 죽고 그 뒤에 Pod들은 Job이 30초 뒤에 죽어버려서 아무것도 못하고 삭제.
CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: cron-job
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: container
image: kubetm/init
command: ["sh", "-c", "echo 'job start';sleep 20; echo 'job end'"]
terminationGracePeriodSeconds: 0
- 1분마다 job을 생성하도록 설정
- CronJob을 생성하고, 뒤이어 Job생성, job을 pod이 생성된다.
- 1분마다 생성되는데, 트리거를 통해 바로 job도 생성 가능하다.
- kubectl create job --from=cronjob/cron-job cron-job-manual-001
- 해당 명령어를 통해 위에 작성한 cronjob으로 job 생성
- 만들어진 job 이름은
cron-job-manual-001으로 생성
- suspend 라는 항목을 'true'로 수정 시 크론잡 일시중지.
kubectl delete -n default cronjob cron-job
- 위 명령어를 통해 크론잡 삭제가 가능.
- 크론잡으로 만들었던 job, pod 모두 같이 삭제.
CronJob Forbid 실습
apiVersion: batch/v1
kind: CronJob
metadata:
name: cron-job-2
spec:
schedule: "20,21,22 * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: container
image: kubetm/init
command: ["sh", "-c", "echo 'job start';sleep 140; echo 'job end'"]
terminationGracePeriodSeconds: 0
- 20분에 job과 pod이 생성
- 21분엔 20분에 생성된 pod이 유지되고 있음으로 skip
- 22분에 새로운 job과 pod 생성
CronJob Replace 실습
apiVersion: batch/v1
kind: CronJob
metadata:
name: cron-job-2
spec:
schedule: "20,21,22 * * * *"
concurrencyPolicy: Replace
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: container
image: kubetm/init
command: ["sh", "-c", "echo 'job start';sleep 140; echo 'job end'"]
terminationGracePeriodSeconds: 0
- 1분마다 job, pod 생성되도록 설정, job은 140초 유지
- 21분에 새로운 pod이 생성, job은 아직 유지되고있음으로 전에 쓰던걸 지속 -> 기존 Pod은 삭제
- 22분에 새로운 job과 pod 생성