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을 무중단으로 업데이트 가능
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [DaemonSet 심화편 #3] 특정 노드에서만 DaemonSet 실행하는 방법 (0) | 2025.03.21 |
---|---|
📌 [DaemonSet 심화편 #2] DaemonSet 업데이트 전략과 무중단 롤링 배포 적용 (0) | 2025.03.21 |
📌 [StatefulSet 심화편 #21] StatefulSet과 Horizontal Pod Autoscaler(HPA) 적용 방법 (0) | 2025.03.15 |
📌 [StatefulSet 심화편 #30] StatefulSet을 활용한 고성능 데이터 저장소 운영 전략 (0) | 2025.03.15 |
📌 [StatefulSet 심화편 #29] StatefulSet에서 Persistent Volume Reclaim 정책 이해 및 활용 (0) | 2025.03.15 |