DevOps/Kubernetes

쿠버네티스 - Controller(DaemonSet, Job, CronJob)

재성스 2024. 10. 29. 16:47
반응형

1. DaemonSet : 각 노드에 특정 작업을 유지

DaemonSet은 모든 노드에 파드를 배포하고, 항상 해당 파드가 유지되도록 관리하는 역할을 한다. 노드 수준에서 작동하는 애플리케이션(예: 로그 수집기, 모니터링 에이전트 등)을 배포할 때 유용하다. 

모든 노드에서 동일한 파드를 하나씩 유지하므로, 클러스터에 새로운 노드가 추가되면 DaemonSet이 자동으로 새 노드에도 파드를 생성한다. 

주요 특징 

  • 노드마다 하나씩 파드 배포: 클러스터 내 모든 노드에 파드가 하나씩 배포되며, 새로운 노드가 추가되면 자동으로 해당 노드에 파드가 생성된다.
  • HostPort와 NodeSelector 활용 가능: 특정 포트나 노드의 OS 족건을 설정하여 특정 조건을 가진 노드에만 파드를 배치할 수 있다.

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

- 위 설정은 클러스터의 각 노드에 kubetm.app 이미지를 실행하는 파드를 배포하며, 노드의 HostPort 18080에서 통신한다.

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

위 설정은 os=centos 레이블을 가진 노드에만 파드를 배치하도록 설정한다.

 

2. Job : 한번만 실행되는 일회성 작업의 스케줄러

Job은 특정 작업을 일회성으로 실행되도록 설정한다. 실행이 완료되면 파드는 자동으로 종료되며, 로그나 데이터 처리를 위한 단일 작업에 유용하다. 

주요 특징

  • 한 번만 실행 후 종료: Job은 파드가 한번 실행되고 종료된다.
  • Parallelism과 Completions 설정 가능: 여러 인스턴스를 동시에 실행하거나, 지정된 횟수만큼 완료되도록 설정할 수 있다. 

단일 작업 실행 예시

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'"]

- 이 Job은 kubetm/init 이미지를 실행하는 컨테이너를 배포하고, 20초 동안 대기한 후 종료된다.

병렬 작업 예시

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'"]

- 이 설정은 한 번에 2개의 파드를 동시에 실행하며, 총 6번 완료될 때까지 반복한다. activeDeadlineSeconds로 Job 실행의 제한 시간을 설정할 수 있다.

 

3. CronJob : 주기적으로 실행되는 작업

CronJob은 주기적으로 실행되어야 하는 작업을 예약하는 데 사용된다. 예를 들어 매일 백업을 실행하거나 일정에 따라 데이터를 정리하는 작업을 설정할 때 유용하다.

주요 특징 

  • 일정에 따른 작업 실행 : CronJob은 지정된 Cron 형식 스케줄을 따르며, 정해진 주기에 따라 작업을 실행한다. 
  • ConcurrencyPolicy 지원 : Allow, Forbid, Replace 등의 정책을 설정하여 중복 실행을 제어할 수 있다.

 

매 1분마다 실행되는 CronJob 예시 

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cron-job
spec:
  schedule: "*/1 * * * *"  # 매 1분마다 실행
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: container
            image: kubetm/init
            command: ["sh", "-c", "echo 'job start'; sleep 20; echo 'job end'"]

- 위 예시에서는 매 1분마다 Job을 실행하도록 설정한다. 작업이 완료되면 대기하다가 1분이 되면 다시 실행된다.

ConcurrencyPolicy 예시 (중복 실행 방지)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cron-job-2
spec:
  schedule: "20,21,22 * * * *"  # 매 시각 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'"]

여기서는 Replace 정책을 사용하여 ,새로운 작업이 시작될 때 이전 작업이 중복 실행되지 않고 대체되도록 설정한다. 

정리

리소스 설명 주요 특징
DaemonSet 모든 노드에 파드를 배치 모든 노드에 하나씩 파드 유지, 조건에 맞는 노드 선택
Job 한 번만 실행되는 작업 일회성 작업, 병렬 실행 및 완수 횟수 설정 가능
CronJob 주기적으로 실행되는 작업 일정에 따른 자동 실행 ConcurrencyPolicy로 중복 제어 
반응형