쿠버네티스 기초 - DaemonSet, Job, CronJob

마자나다·2025년 2월 17일

k8s

목록 보기
3/5
  • 특정 작업을 간단하게 자동화하고 관리를 위해 사용되는 기능들이다.

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 생성
profile
우왕좌왕 개발

0개의 댓글