[Kubernetes] 12. 워크로드 (5편) - DaemonSet

JIWON·2025년 7월 3일

Kubernetes

목록 보기
12/32
post-thumbnail

1. DaemonSet 개요

  • DaemonSet(데몬셋)은 클러스터의 모든 노드(또는 지정된 일부 노드)가 특정 파드의 복사본을 하나씩 실행하도록 보장하는 리소스이다.

  • ReplicaSet처럼 복제본의 수를 지정하는 replicas 필드가 없으며, 하나의 노드에 두 개 이상의 파드를 배치할 수도 없다.

  • 클러스터에 새로운 노드가 추가되면, 해당 노드에도 데몬셋의 파드가 자동으로 생성된다. 반대로 노드가 제거되면 파드도 함께 정리된다.

  • 특정 노드에 파드를 배치하고 싶지 않은 경우에는 nodeSelector 나 노드 어피니티(Node Affinity) 설정을 통해 예외 처리할 수 있다.

1) 주요 사용 사례

DaemonSet은 다음과 같이 모든 노드에서 항상 동작해야 하는 시스템 데몬이나 에이전트를 배포하는 데 매우 유용하다.

  • 로그 수집기: 각 노드의 컨테이너 로그를 수집하여 중앙 로그 시스템으로 보내는 Fluentd , Logstash.

  • 노드 모니터링 에이전트: 각 노드의 리소스 사용량 및 상태를 수집하는 Prometheus Node Exporter , Datadog 에이전트.

  • 클러스터 스토리지 데몬: GlusterFS, Ceph 와 같은 분산 스토리지 시스템의 데몬.


2. DaemonSet 생성

DaemonSet 역시 YAML 매니페스트 파일을 통해 생성한다. 다음은 프로메테우스의 노드 모니터링 에이전트인 node-exporter 를 배포하는 예시이다.

daemonsets.yaml 파일 작성:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: prometheus-daemonset
spec:
  selector:
    matchLabels:
      name: prometheus-exporter
  template:
    metadata:
      labels:
        name: prometheus-exporter
    spec:
      containers:
      - name: prometheus
        image: prom/node-exporter
        ports:
        - containerPort: 9104 # node-exporter 기본 포트
  • 참고: node-exporter의 기본 포트는 9104 이다.

리소스 생성 및 확인

# DaemonSet 생성
kubectl apply -f daemonsets.yaml

# DaemonSet 상세 정보 확인 (각 노드에 스케줄링된 상태를 볼 수 있음)
kubectl describe daemonset prometheus-daemonset

# 생성된 파드 확인 (각 노드에 하나씩 배포된 것을 확인)
kubectl get pods -o wide


3. DaemonSet 업데이트 전략

DaemonSet의 파드를 업데이트하는 방식은 spec.updateStrategy.type 필드를 통해 두 가지로 지정할 수 있다.

1) OnDelete 전략

  • OnDelete 전략에서는 데몬셋의 매니페스트 파일(예: 컨테이너 이미지 버전)을 변경하여 적용해도, 실행 중인 기존 파드들은 자동으로 업데이트되지 않는다.

  • 업데이트는 사용자가 직접 파드를 삭제 (kubectl delete pod ...)했을 때만 이루어진다. 파드가 삭제되면 데몬셋 컨트롤러가 새로운 버전의 파드를 해당 노드에 다시 생성한다.

  • 모니터링 에이전트처럼 업데이트로 인한 서비스 중단을 최소화하고 싶거나, 급하게 업데이트할 필요가 없는 경우에 사용된다.

YAML 설정:

spec:
  updateStrategy:
    type: OnDelete

2) RollingUpdate 전략 (기본값)

  • RollingUpdate 전략은 Deployment와 유사하게, 노드별로 파드를 순차적으로 업데이트하는 방식이다.

  • Deployment와 달리, 노드당 파드가 하나뿐이므로 maxSurge(추가로 생성할 파드 수) 옵션은 없다.

  • 오직 maxUnavailable 옵션만 사용하여 동시에 업데이트를 진행할 파드의 최대 개수를 지정할 수 있다 (기본값: 1).

    • 예를 들어 maxUnavailable: 2로 설정하면, 2개의 노드에서 동시에 파드를 정지하고 업데이트를 진행한다.

YAML 설정:

spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2 # 동시에 최대 2개의 파드를 업데이트

0개의 댓글