Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #1] DaemonSet의 개념과 일반적인 활용 사례

ygtoken 2025. 3. 21. 17:29
728x90

 

1️⃣ 개요

 

Kubernetes에서 DaemonSet은 클러스터의 모든 노드에서 특정 Pod를 실행하는 데 사용되는 컨트롤러입니다.

일반적으로 모니터링, 로그 수집, 네트워크 관리와 같은 노드 기반 서비스를 배포할 때 활용됩니다.

 

이번 글에서는 DaemonSet의 기본 개념과 일반적인 활용 사례를 정리하겠습니다. 🚀

 


2️⃣ DaemonSet이란?

 

📌 DaemonSet의 주요 특징

특징 설명
모든 노드에서 실행 클러스터 내 모든 노드에서 동일한 Pod가 실행됨
노드 추가 시 자동 배포 새로운 노드가 추가되면 자동으로 해당 Pod가 실행됨
노드별 단일 Pod 유지 각 노드에서 하나의 DaemonSet Pod만 실행됨
수동 삭제 없이 유지 DaemonSet을 삭제할 때까지 Pod가 유지됨

DaemonSet을 활용하면 노드별 에이전트(예: 로그 수집기, 모니터링 에이전트)를 효과적으로 운영할 수 있습니다.

 


3️⃣ DaemonSet의 일반적인 활용 사례

 

📌 DaemonSet은 주로 노드 레벨에서 동작하는 서비스 배포에 사용됩니다.

활용 사례 설명 대표적인 도구
로그 수집 각 노드에서 로그를 수집하여 중앙 저장소로 전송 Fluentd, Promtail
모니터링 에이전트 노드 리소스를 모니터링하고 메트릭을 수집 Prometheus Node Exporter
네트워크 플러그인 Kubernetes CNI(Container Network Interface) 플러그인 운영 Calico, Cilium
보안 및 정책 관리 노드 보안 및 정책 엔진 실행 Falco, AppArmor

노드에서 지속적으로 실행되어야 하는 서비스는 DaemonSet을 활용하여 배포하면 효과적입니다.

 


4️⃣ DaemonSet 기본 생성 방법

 

📌 DaemonSet을 정의하는 기본 YAML 예제

apiVersion: apps/v1        # 사용할 API 버전
kind: DaemonSet            # 리소스의 종류 (DaemonSet)
metadata:
  name: node-exporter      # DaemonSet 이름
  labels:
    app: node-exporter     # 라벨 지정 (Pod Selector와 매칭됨)
spec:
  selector:                # 어떤 Pod들을 관리할 것인지 정의
    matchLabels:
      app: node-exporter
  template:                # Pod 템플릿 (Pod의 정의)
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
        - name: node-exporter
          image: prom/node-exporter:latest  # Node Exporter 이미지
          ports:
            - containerPort: 9100           # Node Exporter가 노출하는 포트

 

📌 DaemonSet 배포 명령어

kubectl apply -f daemonset.yaml

 

📌 DaemonSet이 모든 노드에서 실행되는지 확인

kubectl get pods -o wide

 

출력 예시:

NAME                  READY   STATUS    NODE
node-exporter-xyz1   1/1     Running   node-1
node-exporter-abc2   1/1     Running   node-2
node-exporter-mno3   1/1     Running   node-3

모든 노드에서 DaemonSet Pod가 정상적으로 실행됩니다.

 


5️⃣ 특정 노드에서만 DaemonSet 실행하기

 

📌 (1) Node Selector를 활용한 특정 노드 실행

spec:
  template:
    spec:
      nodeSelector:
        dedicated: monitoring  # 노드에 'dedicated=monitoring' 라벨이 있을 경우에만 배포

라벨이 dedicated=monitoring인 노드에서만 실행됩니다.

 

📌 (2) Node Affinity를 활용한 배포 제어

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node-1
                - node-2

node-1, node-2에서만 실행되도록 설정할 수 있습니다.

 


6️⃣ DaemonSet 운영 시 고려해야 할 사항

 

✅ 1. 특정 노드에서 DaemonSet을 실행하지 않도록 설정 (Taints & Tolerations 활용)

 

📌 특정 노드에서 DaemonSet 실행을 방지하는 Taint 추가

kubectl taint nodes node-3 dedicated=NoSchedule

 

📌 DaemonSet Pod가 해당 Taint를 허용하도록 설정

tolerations:
  - key: "dedicated"
    operator: "Exists"
    effect: "NoSchedule"

이제 특정 노드에서만 DaemonSet이 실행되도록 제어할 수 있습니다.

 


✅ 2. DaemonSet 업데이트 전략 (Rolling Update 적용)

 

DaemonSet은 기본적으로 새로운 이미지로 업데이트되지 않으므로, RollingUpdate 전략을 사용해야 합니다.

 

📌 RollingUpdate 전략이 적용된 DaemonSet 예제

updateStrategy:
  type: RollingUpdate          # 순차 업데이트 방식
  rollingUpdate:
    maxUnavailable: 1          # 최대 1개의 노드에서 동시에 업데이트 진행

 

📌 DaemonSet 업데이트 적용

kubectl rollout restart daemonset node-exporter

이제 DaemonSet이 노드별로 순차적으로 업데이트됩니다.

 


🔥 7️⃣ 결론

 

DaemonSet은 모든 노드에서 실행되는 Pod를 관리하는 데 최적화된 리소스

로그 수집, 모니터링, 네트워크 플러그인, 보안 정책 관리 등에 활용 가능

Node Selector, Node Affinity를 활용하여 특정 노드에서만 실행 가능

Taints & Tolerations를 활용하여 특정 노드에서 실행을 제한 가능

RollingUpdate 전략을 적용하면 DaemonSet을 무중단으로 업데이트 가능

 

 

728x90