모험가

DaemonSet, Job, CronJob (기초) 본문

쿠버네티스/기초

DaemonSet, Job, CronJob (기초)

라리음 2022. 8. 8. 09:52

이 글은 인프런의 대세는 쿠버네티스 강의를 보며 정리한 글입니다.

 

 

 

 

DaemonSet

 

* 용량과 상관없이 각 노드에 pod를 한개씩 만든다.

* 꼭 써야하는 것들 ex) Prometheus, flentd, GlusterFS

* 즉 노드의 성능 확인, 로깅, 노드들을 스토리지에 활용할 때 필요한 것 (조금 필수?적인것들)

 

- selector과 template가 있음 (NodeSelector을 통해 원치 않는 노드에 Pod를 생성하지 않을 수 있음.)

 

 

 

Job

 

1. ReplicaSet으로 만들어진 Pod가 죽으면 다른 Node에 Pod가 생성되며 Pod가 일을 하지 않으면

    Restart를 통해 새로운 Pod를 생성

 

2. Job으로 만들어진 Pod가 죽으면 똑같이 다른 Node에 Pod가 생성되지만 Pod가 일을 하지 않으면

    Finish로 Pod가 종료됨 (삭제는 아닌 종료)

 

- selector과 template이 있음 (completions로 파드의 수를 조절할 수 있음.)

- restartPolicy는 필수값임. (중급편에서 설명함.)

 

 

Cronjob

 

- job을 보통 하나하나 만들지 않고 Cronjob을 통해 여러 job들을 만들거나 예약을 해서 만듬.

- concurencyPolicy가 있음 (Allow, Forbid, Replace)

 

ex) */1 * * * * 가 schedule일때

Allow : 1분마다 Job을 통해 Pod를 생성

Forbid : 1분에 만들어진 Pod가 running이면 계속 skip이 됨 (pod가 종료되면 다음 schedule에 있는 Job으로 Pod가 생성)

Replace : 1분에 실행중인 Job이 완료되지 않은 경우 2분에 기존 Job은 삭제되고 새 Job이 새 Pod를 생성

 

쿠버네티스 공식 문서

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

실습

 

 

 

 

 

 

 

1. DaemonSet


1-1) 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

Command

curl 192.168.56.31:18080/hostname

 

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

Label Add

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

Label Remove

kubectl label nodes k8s-node2 os-



2. Job


2-1) 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



2-2) 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



3. CronJob


3-1) 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

Manual

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

Suspend

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

 

1.19버전 이후 변경사항

Cronjob 삭제시 Manual로 만든 Job도 같이 삭제됨



3-2) CronJob - ConcurrencyPolicy

CronJob

apiVersion: batch/v1beta1
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.19버전 이후 변경사항

Replace 모드 : 2min이 되었을 시 기존 Job은 삭제되고 (기존 Pod도 같이 삭제됨), 새 Job이(새 pod 생성) 만들어집니다.

 

 

 

 

 

 

 

실습해보기.