🤔 DaemonSet이란?
DaemonSet은 클러스터의 모든 (또는 일부 지정된) 노드마다 Pod가 1개씩 실행되도록 보장하는 컨트롤러입니다. 마치 리눅스 시스템의 ‘데몬(daemon)’ 프로세스처럼, 각 노드에 백그라운드로 항상 떠 있어야 하는 Pod를 관리하는 데 특화되어 있습니다.
✅ 핵심 개념: “모든 노드에 하나씩, 빠짐없이”
DaemonSet은 노드 수에 맞춰 자동으로 Pod를 생성하거나 삭제합니다. 클러스터에 새로운 노드가 추가되면 그 노드에도 즉시 Pod를 배포하고, 노드가 제거되면 해당 Pod도 함께 정리합니다.
🧠 대표적인 사용 사례
DaemonSet은 주로 클러스터 인프라를 지원하는 보조적인 역할을 수행하는 Pod를 배포하는 데 사용됩니다. 개발자가 직접 DaemonSet을 만들기보다, 클러스터 관리 도구나 플러그인을 설치할 때 자주 접하게 됩니다.
- 로그 수집기: 각 노드에서 발생하는 로그를 수집하여 중앙 서버로 보내는 Fluentd, Filebeat, Logstash
- 모니터링 에이전트: 각 노드의 CPU, 메모리, 디스크 등 시스템 메트릭을 수집하는 Prometheus Node Exporter, Datadog Agent
- 네트워크 플러그인 (CNI): Calico, Flannel 등 쿠버네티스 네트워킹을 담당하는 컴포넌트
- 스토리지 플러그인 (CSI): 각 노드에 스토리지 볼륨을 연결해주는 드라이버
이들은 모두 애플리케이션이 아닌, 노드 자체에서 실행되어야 하는 공통 기능들입니다.
🧪 DaemonSet YAML 예시
클러스터의 모든 노드에 Prometheus Node Exporter를 배포하는 DaemonSet YAML을 살펴봅시다. 구조는 매우 단순합니다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: exporter
image: prom/node-exporter
📌 위 YAML 스펙의 의미:
replicas
필드가 없는 것을 주목하세요. 복제본의 수는 우리가 정하는 것이 아니라 노드의 수에 의해 결정되기 때문입니다.- 위 YAML을 클러스터에 적용하면, 쿠버네티스는 현재 존재하는 모든 워커 노드를 파악하고 각 노드에
prom/node-exporter
이미지를 사용하는 Pod를 1개씩 생성합니다.
🔄 작동 방식 요약
- DaemonSet이 생성되면, 쿠버네티스 스케줄러는 클러스터 내 모든 노드를 대상으로 Pod를 하나씩 배치합니다.
- 클러스터에 새로운 노드가 추가되면 → DaemonSet 컨트롤러가 이를 감지하고 해당 노드에 자동으로 Pod를 생성합니다.
- 클러스터에서 노드가 제거되면 → 해당 노드 위에서 실행되던 Pod도 자동으로 함께 제거됩니다.
- 만약 특정 노드 그룹에만 Pod를 배포하고 싶다면, YAML에
nodeSelector
,tolerations
,affinity
같은 옵션을 사용하여 조건을 지정할 수 있습니다. (예:disktype: ssd
레이블이 있는 노드에만 배포)
✅ 개발자 관점 요약
• DaemonSet은 노드 단위로 반드시 필요한 Pod를 배포하는 데 특화된 컨트롤러입니다.
• 클러스터 운영에 필요한 Agent, Exporter, 드라이버 등을 배포할 때 필수적으로 사용됩니다.
• 목적에 따라 컨트롤러를 명확히 구분해야 합니다. 일반적인 애플리케이션 배포는 Deployment, 노드 전역에 공통 Pod를 배포할 때는 DaemonSet을 사용하세요.
수십, 수백 개의 노드를 운영하는 환경을 상상해 보세요. 새로운 노드가 추가될 때마다 일일이 접속해서 에이전트를 설치하는 것은 끔찍한 일입니다. DaemonSet의 자동 관리 능력은 클러스터가 커질수록 운영 효율성과 일관성을 극적으로 향상시켜줍니다.