본문 바로가기
CICD

[Kubernetes] DeamonSet, Job, CronJob (Controller)

by 장중앙 2022. 1. 11.

DaemonSet이란

Deployment와 유사하게 Pod를 생성하고 관리하는 컨트롤러

Deployment는 배포 작업을 좀 더 세분화하여 조작하는 반면, DaemonSet은 특정 노드 또는 모든 노드에 항상 실행되어야 할 특정 Pod를 관리

 

Node의 자원상태와 상관없이 모든 Node 또는 특정 Node에 Pod를 생성

DaemonSet의 구성

Template를 이용해 동일한 Pod를 생성

HostPort를 이용하여 Service의 NodePort와 비슷하게 외부에서의 접근가능

* Nodeport와 다르게 Node의 IP로 접근

DaemonSet yaml 작성 예시

 

 

Job이란

하나 이상의 Pod를 지정하고 지정한 수의 Pod를 성공적으로 실행하도록 하는 컨트롤러

백업이나 특정 배치 파일들처럼 한번 실행하고 종료되는 성격의 작업에 사용

 

프로세스를 사용하지 않으면 Pod를 중료(삭제X, 자원을 사용하지 않는 상태)

 

Job의 구성

Selector를 작성하지 않아도 Job에서 알아서 구성

Completions : 파드가 지정한 개수 이상 정상 종료될 경우 성공처리

Parallelism : 한번에 지정한 개수의 Pod를 실행

ActiveDeadkineSeconds : 지정된 시간이 되면 Job이 종료되고 실행중이던 모든 포드를 종료

 

Job yaml 작성예시

 

CronJob이란

Job들을 주기적인 시간에 따라 생성하는 컨트롤러

Job하나 단위로 사용하는 경우는 드뭄, CronJob을 이용하여 특정 시간에 Job을 생성하는 식으로 사용

 

CronJob 구성

schedule로 주기를 구성 할 수 있음 

또한, concurrencyPolicy 필드를 이용하여 CronJob에 의해 생긴 Job의 동시 실행처리를 정의 가능

Allow(기본값) CronJob은 동시에 실행되는 Job을 허용
Forbid 동시 실행을 허용하지 않음
기존 작업이 진행중이라면 새로운 Job을 건너뜀
Replace 기존의 작업을 새로운 작업으로 교체

 

CronJob yaml 작성예시

 


실습

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과 Pod

존재하고 있는 총 2개의 Node에 Pod가 생성된

Node 1,2에 접근하여 hostname을 출력하도록 명령

 

 

1-1. DaemonSet의 NodeSelector기능 확인

특정 Node에만 DaemonSet에 의한 Pod가 생성되도록

 

Node 1, 2에 명령어를 통해 label 삽입

kubectl label nodes k8s-node1 os=centos
kubectl label nodes k8s-node2 os=ubuntu

생성된 label 확인

 

DaemonSet 생성

NodeSelect를 이용하여 os=centos인 Node에 생성

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
        ports:
        - containerPort: 8080

 

생성된 DaemonSet과 Pod 확인

os=centos label을 삽입한 node1에만 Pod가 생성됨

 

Node 2에 os label을 삭제하고, os = centos label을 삽입

kubectl label nodes k8s-node2 os-
kubectl label nodes k8s-node2 os=centos

DaemonSet은 label을 감지하고 os=centos를 가진 node2에도 Pod를 생성함

 

* DaemonSet을 삭제하면 DaemonSet으로 부터 만들어진 Pod도 같이 삭제됨


2. Job 실습

Job 생성

Job start라는 메시지를 찍고 20초뒤에 job end라는 메시지를 찍고 종료하게끔 함

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, Pod 확인

Pod의 Log내역확인

Job이 성공적으로 완료되면 Pod는 Completed 상태로 남게됨 (아무런 자원도 사용하지 않는 상태)

* Job을 삭제하면 Pod도 같이 삭제

 

2-1. Job의 옵션을 이용한 생성

Job 생성

생성 갯수 6, 동시 생성 갯수 2, 데드라인 30초로 Job 생성

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

생성된 Job과 Pod 확인

Job 생성과 동시에 2개의 Pod가 생성

단, Job의 작업시간이 20초 정도이고 Deadline이 30초이므로 나머지 4개의 Pod는 생성되지 못하거나 작업중에 fail로 종료된다.


3. CronJob 실습

CronJob 생성

schedule을 이용해 1분에 하나씩 생성

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

생성된 CronJob 확인

 

CronJob의 Schedule에 따라 1분에 하나씩 Job이 생성됨

명령 실행으로도 CronJob 하위의 Job을 메뉴얼로 실시간 생성도 가능

kubectl create job --from=cronjob/cron-job cron-job-manual-001

 

CronJob의 suspend를 true로 업데이트하거나 명령 실행으로 일시중지 가능

또는

kubectl patch cronjobs cron-job -p '{"spec" : {"suspend" : "true/false" }}'

중지된 CronJob 확인

 

* CronJob을 삭제하면 내부 Job은 삭제되지만 트리거로 만든 Job은 삭제되지 않음

 

 

댓글