본문 바로가기
네트워크/k8s

[k8s] 17. DaemonSet, Job, CronJob - 실습

by Lauren X Ming 2021. 2. 14.

DaemonSet, Job, CronJob 실습

image

1. DaemonSet

image

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

실습 과정

  1. DaemonSet - HostPort 생성 --> 각 노드마다 파드가 생성됨
  2. 각 파드가 생성된 노드 아이피에 포트번호 18080을 붙여 마스터 노드에서 접속
    curl 192.168.35.31:18080/hostname
    curl 192.168.35.32:18080/hostname
    image
    데몬셋의 HostPort로 외부에서 노드 아이피와 그 포트로 접속 시, 해당 파드로 연결되는구나!
  3. 마스터 노드에서 다음 명령어를 통해 각 노드에 라벨달기
    kubectl label nodes k8s-node1 os=centos
    kubectl label nodes k8s-node2 os=ubuntu
  4. DaemonSet - NodeSelector 생성 --> nodeSelector가 os:cenots니까 node1에만 파드가 만들어짐
  5. 다음 명령어로 node2에도 os:centos 명령어 달기
    kubectl label nodes k8s-node2 os-
    kubectl label nodes k8s-node2 os=centos
    os-를 해서 이미 생성된 os=ubuntu 라벨을 없앰
  6. 파드 확인해보면 node2에 자동으로 파드가 생성되는 걸 확인
    image
  7. daemonset-2의 yaml 편집에서 v2로 변경
    기본 업데이트 설정은 rollingupdate고, image를 v2로 변경 시 각 파드들이 자동으로 v2로 변경됨
  8. 데몬셋 삭제 --> 파드들이 모두 삭제됨

2. Job

image

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

실습 과정

  1. Job1 생성, 20초 뒤엔 Job이 종료되며 로그에서 이를 확인할 수 있음
    image
  2. Job1 삭제 --> 파드도 삭제됨
  3. Job2 생성
    image
    총 6개의 파드를 준비했지만 처음 2개만 생성하고 정상종료 됐고, 2개는 실행 중 종료, 2개는 아예 생성도 못함
    30초의 시간이 지나 job이 종로됐기 때문

3. CronJob

image

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
    image
  • 파드는 140초동안 동작됨

실습 과정

  1. CronJob 생성 --> 1분마다 Job 생성, 파드 생성
  2. cron-job에서 manual로 job 생성
    1. 대시보드 사용
      image
    2. 명령어로 생성
      kubectl create job --from=cronjob/cron-job cron-job-manual-001
      image
      cron-job-manual-001이 만들 job의 이름
    1.19버전부터 CronJob 삭제 시 manual로 만든 job도 같이 삭제됨
  3. CronJob의 suspend를 true로 변경하고(대시보드) 다시 false로 변경(명령어)
    suspend가 true로 되면 CronJob은 job을 생성하지 않음
    1. 대시보드 사용
      image
    2. 명령어 사용
      kubectl patch cronjobs cron-job -p '{"spec" : {"suspend" : false }}'
      image
  4. CronJob 삭제 --> CronJob으로 생성된 job들이 삭제됨
    1.19버전부터 CronJob 삭제 시 manual로 만든 job도 같이 삭제됨
  5. CronJob - ConcurrencyPolicy 생성
    1. concurrencyPolicy: Forbid
      50분 job 생성, 51분 skip, 52분 때 생성
      image
    2. concurrencyPolicy: Replace
    3. 19 버전 이전에서는 파드를 새로 생성하고 이전 Job과 연결
    4. 19 버전 이후에서는 이전 파드와 job 삭제 후 새로 job과 파드 생성

출처

인프런 - 대세는 쿠버네티스

'네트워크 > 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