로그 수집기나 모니터링 에이전트는 "노드마다 정확히 한 개"가 떠야 합니다. Deployment로 replicas: 5를 잡으면 한 노드에 두 개가 몰리거나 어떤 노드엔 아예 안 뜰 수 있죠. 노드 수가 늘거나 줄어도 자동으로 따라가야 하고요. 이걸 위한 워크로드가 DaemonSet입니다. DaemonSet은 클러스터의 각 노드에 파드를 정확히 하나씩 보장합니다.
Deployment와 무엇이 다른가
| 구분 | Deployment | DaemonSet |
|---|---|---|
| 파드 개수 | replicas로 지정 | 노드 수에 따라 자동 |
| 배치 기준 | 스케줄러가 자유 배치 | 노드당 1개 보장 |
| 새 노드 추가 시 | 변화 없음 | 자동으로 파드 추가 |
| 대표 용도 | 웹/API 등 앱 | 로그·모니터링·네트워크 에이전트 |
핵심은 "노드가 기준이냐, 개수가 기준이냐"입니다. 노드 1개가 늘면 DaemonSet 파드도 1개 자동으로 늘어납니다.
기본 DaemonSet 만들기
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"
kubectl apply -f daemonset.yaml
kubectl get daemonset
kubectl get pods -o wide # 노드별로 1개씩 떠 있는지 확인
DESIRED와 READY 숫자가 노드 수와 같으면 정상입니다.
특정 노드에만 띄우기
전체가 아니라 일부 노드에만 두고 싶을 때는 nodeSelector를 씁니다. 예를 들어 GPU 노드에만 에이전트를 두려면 노드에 라벨을 붙이고 그 라벨을 고릅니다.
spec:
nodeSelector:
hardware: gpu
컨트롤 플레인 노드에까지 띄우려면 그 노드의 taint를 견디도록 tolerations를 추가해야 합니다. taint를 견디지 못하면 마스터 노드에는 파드가 스케줄되지 않습니다.
롤링 업데이트
DaemonSet도 이미지 버전을 바꾸면 노드별로 순차 교체됩니다. 동시에 몇 개까지 내릴지는 maxUnavailable로 조절합니다.
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
체크리스트
kubectl get daemonset -A # DESIRED와 READY 일치 확인
kubectl describe daemonset log-agent # 이벤트·toleration 확인
kubectl get pods -o wide # 노드별 1개씩인지
kubectl get nodes --show-labels # nodeSelector 라벨 매칭 확인
READY가 DESIRED보다 작다면 보통 taint/toleration 불일치이거나 리소스 부족으로 일부 노드에서 파드가 Pending 상태일 때입니다. describe의 이벤트가 그 이유를 알려줍니다.
DaemonSet을 직접 배포하고 노드를 늘렸다 줄이며 파드가 따라오는 걸 확인하는 실습은 쿠버네티스 트랙에서 해볼 수 있습니다 — 회원가입 없이 무료로.