DaemonSet, Job, CronJob 실습
1. DaemonSet
DaemonSet - HostPort
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
DaemonSet - NodeSelector
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
실습 과정
- DaemonSet - HostPort 생성 --> 각 노드마다 파드가 생성됨
- 각 파드가 생성된 노드 아이피에 포트번호 18080을 붙여 마스터 노드에서 접속
curl 192.168.35.31:18080/hostname curl 192.168.35.32:18080/hostname
데몬셋의 HostPort로 외부에서 노드 아이피와 그 포트로 접속 시, 해당 파드로 연결되는구나! - 마스터 노드에서 다음 명령어를 통해 각 노드에 라벨달기
kubectl label nodes k8s-node1 os=centos kubectl label nodes k8s-node2 os=ubuntu
- DaemonSet - NodeSelector 생성 --> nodeSelector가 os:cenots니까 node1에만 파드가 만들어짐
- 다음 명령어로 node2에도 os:centos 명령어 달기
kubectl label nodes k8s-node2 os- kubectl label nodes k8s-node2 os=centos
os-
를 해서 이미 생성된os=ubuntu
라벨을 없앰 - 파드 확인해보면 node2에 자동으로 파드가 생성되는 걸 확인
- daemonset-2의 yaml 편집에서 v2로 변경
기본 업데이트 설정은 rollingupdate고, image를 v2로 변경 시 각 파드들이 자동으로 v2로 변경됨 - 데몬셋 삭제 --> 파드들이 모두 삭제됨
2. Job
Job1
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
- command: job start라는 메시지를 찍고 20초동안 쉬게 하는 커맨드, 20초가 끝나면 job end를 찍고 종료 후 job 종료
Job2
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
- completions: 6으로 job에 6개의 파드 준비
- 2개의 parallel으로 생성하며 30초가 지나면 job 정지, 현재 동작 중인 파드는 삭제
- 한 파드는 20초동안 동작하다 종료 --> activeDeadlineSeconds: 30
실습 과정
- Job1 생성, 20초 뒤엔 Job이 종료되며 로그에서 이를 확인할 수 있음
- Job1 삭제 --> 파드도 삭제됨
- Job2 생성
총 6개의 파드를 준비했지만 처음 2개만 생성하고 정상종료 됐고, 2개는 실행 중 종료, 2개는 아예 생성도 못함
30초의 시간이 지나 job이 종로됐기 때문
3. CronJob
CronJob
apiVersion: batch/v1beta1
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
CronJob - ConcurrencyPolicy
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cron-job-2
spec:
schedule: "50,51,52 * * * *"
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
- 50분, 51분, 52분에 job이 생성되도록 설정 --> 생성하는 시점의 시간에 맞춰서 설정하면 됨
while true; do date; sleep 1; done
- 파드는 140초동안 동작됨
실습 과정
- CronJob 생성 --> 1분마다 Job 생성, 파드 생성
- cron-job에서 manual로 job 생성
- 대시보드 사용
- 명령어로 생성
kubectl create job --from=cronjob/cron-job cron-job-manual-001
cron-job-manual-001이 만들 job의 이름
- 대시보드 사용
- CronJob의 suspend를 true로 변경하고(대시보드) 다시 false로 변경(명령어)
suspend가 true로 되면 CronJob은 job을 생성하지 않음- 대시보드 사용
- 명령어 사용
kubectl patch cronjobs cron-job -p '{"spec" : {"suspend" : false }}'
- 대시보드 사용
- CronJob 삭제 --> CronJob으로 생성된 job들이 삭제됨
1.19버전부터 CronJob 삭제 시 manual로 만든 job도 같이 삭제됨 - CronJob - ConcurrencyPolicy 생성
- concurrencyPolicy: Forbid
50분 job 생성, 51분 skip, 52분 때 생성 - concurrencyPolicy: Replace
- 19 버전 이전에서는 파드를 새로 생성하고 이전 Job과 연결
- 19 버전 이후에서는 이전 파드와 job 삭제 후 새로 job과 파드 생성
- concurrencyPolicy: Forbid
출처
인프런 - 대세는 쿠버네티스
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 19. Pod - ReadinessProbe, LivenessProbe (0) | 2021.02.17 |
---|---|
[k8s] 18. Pod - Lifecycle (0) | 2021.02.16 |
[k8s] 16. DaemonSet, Job, CronJob (0) | 2021.02.14 |
[k8s] 15. Deployment - 실습 (0) | 2021.02.14 |
[k8s] 14. Deployment - Recreate, RollingUpdate (0) | 2021.02.13 |