← 아티클 목록

쿠버네티스 DaemonSet — 노드마다 파드 1개씩 띄우기

2027-08-16#kubernetes#daemonset#운영

로그 수집기나 모니터링 에이전트는 "노드마다 정확히 한 개"가 떠야 합니다. Deployment로 replicas: 5를 잡으면 한 노드에 두 개가 몰리거나 어떤 노드엔 아예 안 뜰 수 있죠. 노드 수가 늘거나 줄어도 자동으로 따라가야 하고요. 이걸 위한 워크로드가 DaemonSet입니다. DaemonSet은 클러스터의 각 노드에 파드를 정확히 하나씩 보장합니다.

Deployment와 무엇이 다른가

구분DeploymentDaemonSet
파드 개수replicas로 지정노드 수에 따라 자동
배치 기준스케줄러가 자유 배치노드당 1개 보장
새 노드 추가 시변화 없음자동으로 파드 추가
대표 용도웹/API 등 앱로그·모니터링·네트워크 에이전트

핵심은 "노드가 기준이냐, 개수가 기준이냐"입니다. 노드 1개가 늘면 DaemonSet 파드도 1개 자동으로 늘어납니다.

기본 DaemonSet 만들기

YAML
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent
spec:
  selector:
    matchLabels:
      app: log-agent
  template:
    metadata:
      labels:
        app: log-agent
    spec:
      containers:
        - name: agent
          image: fluent/fluent-bit:2.2
          resources:
            limits:
              memory: "200Mi"
Kubernetes
kubectl apply -f daemonset.yaml
kubectl get daemonset
kubectl get pods -o wide   # 노드별로 1개씩 떠 있는지 확인

DESIREDREADY 숫자가 노드 수와 같으면 정상입니다.

특정 노드에만 띄우기

전체가 아니라 일부 노드에만 두고 싶을 때는 nodeSelector를 씁니다. 예를 들어 GPU 노드에만 에이전트를 두려면 노드에 라벨을 붙이고 그 라벨을 고릅니다.

YAML
    spec:
      nodeSelector:
        hardware: gpu

컨트롤 플레인 노드에까지 띄우려면 그 노드의 taint를 견디도록 tolerations를 추가해야 합니다. taint를 견디지 못하면 마스터 노드에는 파드가 스케줄되지 않습니다.

롤링 업데이트

DaemonSet도 이미지 버전을 바꾸면 노드별로 순차 교체됩니다. 동시에 몇 개까지 내릴지는 maxUnavailable로 조절합니다.

YAML
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1

체크리스트

Kubernetes
kubectl get daemonset -A              # DESIRED와 READY 일치 확인
kubectl describe daemonset log-agent  # 이벤트·toleration 확인
kubectl get pods -o wide              # 노드별 1개씩인지
kubectl get nodes --show-labels       # nodeSelector 라벨 매칭 확인

READYDESIRED보다 작다면 보통 taint/toleration 불일치이거나 리소스 부족으로 일부 노드에서 파드가 Pending 상태일 때입니다. describe의 이벤트가 그 이유를 알려줍니다.


DaemonSet을 직접 배포하고 노드를 늘렸다 줄이며 파드가 따라오는 걸 확인하는 실습은 쿠버네티스 트랙에서 해볼 수 있습니다 — 회원가입 없이 무료로.