
클러스터 확장 시 발생하는 모니터링 공백, 어떻게 해결할까요?
대규모 트래픽을 처리하기 위해 쿠버네티스 클러스터의 노드를 급격히 늘려야 하는 상황을 상상해 보세요. 평소처럼 디플로이먼트(Deployment)를 사용해 서비스를 배포하는 것은 어렵지 않아요. 하지만 문제는 서비스가 아니라, 각 노드의 상태를 감시해야 하는 모니터링 에이전트나 로그 수집기에서 발생합니다.
새로운 노드가 클러스터에 추가될 때마다 운영자가 일일이 접속해서 수집기를 설치하고 있다면 어떨까요? 실수로 한두 개의 노드를 놓치게 되면, 그 노드에서 발생하는 장애는 시스템 전체에 치명적인 영향을 미칠 수 있어요. 모니터링 사각지대가 생기는 순간, SRE(Site Reliability Engineer)의 밤은 길어질 수밖에 없어요.
이런 문제를 근본적으로 해결해 주는 도구가 바로 데몬셋(DaemonSet)이에요. 데몬셋은 클러스터의 모든 노드, 혹은 특정 조건에 맞는 노드에 반드시 하나씩의 파드를 실행하도록 보장하는 아주 강력한 컨트롤러예요. 노드가 추가되면 데몬셋은 이를 즉시 감지하고 새로운 노드에 필요한 파드를 자동으로 배치해요.
이 글을 통해 여러분은 다음과 같은 핵심 내용을 완벽하게 마스터할 수 있어요.
- 데몬셋이 왜 일반적인 디플로이먼트와 다른지 그 근본적인 이유를 이해해요.
- 데몬셋의 내부 동작 원리와 YAML 설정 구조를 꼼꼼하게 분석해요.
- 실무에서 바로 사용할 수 있는 최소 설정 예제와 고급 활용법을 익혀요.
- 운영 중 마주칠 수 있는 흔한 실수와 이를 해결하는 노하우를 배웁니다.
데몬셋 도입 전 반드시 체크해야 할 기본 지식
데몬셋을 성공적으로 운영하기 위해서는 단순히 명령어를 입력하는 수준을 넘어, 쿠버네티스의 스케줄링 메커니즘을 먼저 이해해야 해요. 데몬셋은 시스템 수준의 에이전트를 다루는 경우가 많아서, 일반적인 애플리케이션 배포와는 접근 방식이 완전히 달라야 하기 때문이에요.
실행 전 필수 준비 사항
먼저, 현재 운영 중인 클러스터의 환경을 점검해 보세요. 데몬셋은 노드 단위로 동작하므로, 각 노드의 레이블(Label) 관리 체계가 잘 잡혀 있어야 해요. 특정 노드에만 에이전트를 띄우고 싶다면 노드 레이블을 활용해야 하니까요. 또한, 에이전트가 노드의 자원을 과도하게 점유하지 않도록 리소스 제한(Resource Limits)을 설정하는 연습도 미리 되어 있어야 합니다.
데몬셋으로 배포하는 파드는 보통 로그 수집기(Fluentd), 모니터링 에이전트(Prometheus Node Exporter), 혹은 네트워크 플러그인(CNI)과 같은 인프라성 구성 요소가 주를 이룹니다.
컨트롤러별 특징 비교
데몬셋을 언제 써야 할지 헷갈린다면 아래 비교 표를 참고해 보세요. 목적에 맞는 컨트롤러를 선택하는 것이 운영 안정성의 첫걸음이에요.
| 비교 항목 | 디플로이먼트(Deployment) | 스테이트풀셋(StatefulSet) | 데몬셋(DaemonSet) |
|---|---|---|---|
| 주요 목적 | 무상태 서비스 배포 | 상태 유지 데이터베이스 | 노드별 인프라 에이전트 |
| 파드 배치 기준 | 스케줄러가 빈 노드에 배치 | 순차적 생성 및 고유 ID 부여 | 모든(혹은 특정) 노드에 1개씩 |
| 스케일링 방식 | 복제본(Replica) 수 조절 | 순차적 확장/축소 | 노드 수에 따라 자동 결정 |
결론적으로, 서비스의 개수가 아니라 노드의 개수에 맞춰 파드 수를 유지해야 한다면 고민 없이 데몬셋을 선택해야 해요. 이것이 데몬셋의 핵심적인 존재 이유입니다.
데몬셋의 동작 원리와 실무 적용 단계
이제 데몬셋이 실제로 어떻게 움직이는지, 그리고 실무에서는 어떤 절차로 구성하는지 깊이 있게 파헤쳐 볼게요. 단순히 설정 파일을 복사해서 붙여넣는 것이 아니라, 각 설정이 클러스터에 어떤 영향을 미치는지 아는 것이 중요해요.
STEP 1. 데몬셋의 내부 동작 메커니즘 이해하기
데몬셋 컨트롤러는 클러스터의 상태를 지속적으로 감시하는 컨트롤 루프(Control Loop)를 가지고 있어요. 이 루프는 다음의 과정을 반복하며 클러스터의 일관성을 유지해요.
첫째, 컨트롤러는 현재 클러스터에 존재하는 모든 노드 목록을 가져와요. 둘째, 데몬셋 설정에 명시된 선택기(Selector)나 조건(Taints/Tolerations)을 바탕으로 파드가 실행되어야 할 대상 노드를 필터링해요. 셋째, 필터링된 노드들 중에서 아직 해당 데몬셋의 파드가 실행되지 않은 노드를 찾아내요. 마지막으로, 해당 노드에 새로운 파드를 생성하도록 명령을 내립니다.
이 과정 덕분에 관리자가 개입하지 않아도 노드가 늘어나면 파드가 생기고, 노드가 삭제되면 파드가 사라지는 자동화된 환경이 구축되는 거예요. 노드 생명주기와 동기화되는 특성이야말로 데몬셋의 가장 큰 매력이라고 할 수 있어요.
STEP 2. YAML 스키마의 정밀 분석
데몬셋을 정의할 때 사용하는 YAML 파일은 일반적인 파드 설정과 비슷해 보이지만, 결정적인 차이점이 있어요. 핵심적인 구조를 하나씩 뜯어볼게요.
- apiVersion & kind: 반드시
apiVersion: apps/v1과kind: DaemonSet을 명시해야 해요. - spec.selector: 어떤 파드들을 이 데몬셋이 관리할지 결정하는 라벨 선택기예요. 이 설정이 틀리면 컨트롤러가 파드를 찾지 못해 무한 루프에 빠질 수 있어요.
- spec.template: 실제로 노드에서 실행될 파드의 명세서예요. 컨테이너 이미지, 리소스 제한, 환경 변수 등이 여기에 포함돼요.
데몬셋 설정 시
updateStrategy를 설정할 수 있어요. RollingUpdate를 사용하면 노드들을 하나씩 순차적으로 업데이트하여 서비스 중단을 최소화할 수 있습니다.STEP 3. 최소 설정 예제로 실습하기
가장 흔한 사례인 로그 수집 에이전트 배포를 가정하여 실무형 예제를 만들어 볼게요. 이 예제는 모든 노드에 로그를 수집하는 컨테이너를 띄우는 구조예요.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-collector
namespace: kube-system
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluentd:latest
resources:
limits:
memory: 200Mi
cpu: 100m
requests:
memory: 100Mi
cpu: 50m
위 예제에서 주의 깊게 볼 점은 resources 설정이에요. 데몬셋으로 배포되는 파드는 클러스터의 모든 노드에서 실행되므로, 만약 리소스 제한을 설정하지 않으면 모든 노드에 예기치 못한 부하를 줄 수 있어요. 특히 메모리 누수가 발생하는 에이전트라면 클러스터 전체가 다운되는 재앙을 맞이할 수도 있습니다.
STEP 4. 특정 노드 배포를 위한 고급 전략 (Taints & Tolerations)
쿠버네티스의 마스터 노드(Control Plane)는 보통 Taint(테인트)가 걸려 있어서 일반적인 파드는 배포되지 않아요. 하지만 보안 모니터링 에이전트라면 마스터 노드에서도 돌아가야 할 때가 있죠? 이때 사용하는 것이 바로 Toleration(톨러레이션)이에요.
노드에 “이 노드는 특별하니까 아무나 오지 마”라고 표시하는 것이 Taint라면, 파드에게 “나는 그 특별함을 견딜 수 있어”라고 허락을 구하는 것이 Toleration이에요. YAML의 spec.template.spec.tolerations 항목에 해당 테인트를 명시하면, 데몬셋 파드가 마스터 노드까지 침투하여 실행될 수 있어요.
STEP 5. 노드 레이블을 활용한 선택적 배포
모든 노드가 아니라 GPU가 있는 노드에만 특정 가속기 관리 에이전트를 띄우고 싶다면 어떻게 해야 할까요? 이때는 nodeSelector를 사용해요. 먼저 노드에 hardware=gpu라는 레이블을 붙인 뒤, 데몬셋 설정에 이를 명시하면 돼요. 이 방식은 클러스터의 자원 효율성을 극대화하는 데 매우 효과적입니다.
nodeSelector를 잘못 설정하면, 조건에 맞는 노드가 없을 경우 데몬셋의 파드가 하나도 실행되지 않는 상태가 됩니다. 이럴 때는
kubectl get daemonset 명령어로 파드 개수를 반드시 확인하세요.자주 하는 실수와 해결법 및 FAQ
데몬셋을 운영하다 보면 예상치 못한 상황이 자주 발생해요. 실무에서 가장 흔히 겪는 문제들을 정리했으니, 문제가 생기면 당황하지 말고 체크해 보세요.
자주 하는 실수와 해결법
❌ 실수: 마스터 노드에 에이전트가 뜨지 않아요.
왜 발생하는가: 마스터 노드에 설정된 Taint를 파드가 견디지(Tolerate) 못하기 때문이에요.
✅ 해결법: 데몬셋의 YAML 설정에 마스터 노드의 Taint 값을 포함한 tolerations 항목을 추가하세요.
❌ 실수: 노드가 추가되었는데 파드가 배포되지 않아요.
왜 발생하는가: 노드의 레이블이 설정한 nodeSelector와 일치하지 않거나, Taint 설정이 잘못되었을 가능성이 커요.
✅ 해결법: kubectl get nodes --show-labels 명령어로 노드 레이블을 확인하고, 설정 파일과 대조해 보세요.
❌ 실수: 특정 노드에서만 파드가 계속 재시작(CrashLoopBackOff)돼요.
왜 발생하는가: 해당 노드에만 특수한 환경(예: 디스크 용량 부족, 특정 커널 버전 이슈)이 있을 수 있어요.
✅ 해결법: kubectl logs로 로그를 확인하고, 해당 노드의 시스템 로그(dmesg)를 살펴봐 에이전트가 왜 죽는지 원인을 찾아야 해요.
❌ 실수: 데몬셋 업데이트 중에 클러스터가 느려져요.
왜 발생하는가: 업데이트 전략이 너무 공격적이어서 너무 많은 노드의 에이전트가 동시에 재시작되고 있기 때문이에요.
✅ 해결법: updateStrategy의 maxUnavailable 값을 조절하여 한 번에 업데이트할 노드 수를 제한하세요.
❌ 실수: 리소스 부족으로 노드 전체가 멈춰요.
왜 발생하는가: 데몬셋 파드의 리소스 제한(Limits)을 설정하지 않아 에이전트가 노드의 자원을 모두 끌어다 쓰고 있어요.
✅ 해결법: 반드시 resources.limits를 설정하여 에이전트가 사용할 수 있는 최대치를 엄격하게 제한하세요.
자주 묻는 질문
Q. 데몬셋과 디플로이먼트의 가장 큰 차이는 무엇인가요?
디플로이먼트는 전체 복제본(Replica) 개수를 유지하는 데 집중하지만, 데몬셋은 각 노드에 파드가 하나씩 존재하는 상태를 유지하는 데 집중해요. 즉, 스케일링의 기준이 ‘전체 개수’냐 ‘노드 개수’냐의 차이예요.
Q. 노드가 추가되면 데몬셋 파드는 자동으로 생성되나요?
네, 맞아요. 데몬셋 컨트롤러가 새로운 노드의 등장을 감지하고 즉시 파드를 배포하므로 별도의 작업이 필요 없어요.
Q. 특정 노드에서만 데몬셋을 빼고 싶을 때는 어떻게 하나요?
노드에 특정 레이블을 붙인 뒤, 데몬셋의 nodeSelector를 활용하거나, 노드에 Taint를 걸고 데몬셋에는 해당 Taint에 대한 Toleration을 넣지 않으면 됩니다.
Q. 데몬셋 파드가 죽으면 어떻게 되나요?
쿠버네티스의 일반적인 파드와 마찬가지로, 데몬셋 컨트롤러가 파드의 상태를 감지하고 다시 실행하려고 시도합니다. 하지만 환경 문제라면 무한 재시작에 빠질 수 있으니 주의가 필요해요.
Q. 데몬셋으로 관리되는 파드는 리소스를 많이 먹나요?
그건 에이전트의 설계에 따라 달라요. 하지만 모든 노드에서 돌아간다는 점을 잊지 마세요. 하나의 파드가 100MB만 먹어도 노드가 100개라면 클러스터 전체적으로는 10GB의 자원을 점유하게 됩니다.
데몬셋 마스터하기: 안정적인 인프라 운영을 위한 요약
데몬셋은 대규모 쿠버네티스 클러스터를 운영하는 SRE에게 없어서는 안 될 핵심 도구예요. 노드 단위의 관리를 자동화함으로써 운영의 복잡도를 획기적으로 낮춰주지만, 잘못 설정했을 경우 클러스터 전체의 안정성을 해칠 수도 있는 양날의 검과 같습니다.
- 데몬셋은 모든(혹은 특정) 노드에 파드를 하나씩 배치하는 컨트롤러예요.
- 로그 수집기, 모니터링 에이전트 등 인프라성 구성 요소에 최적화되어 있어요.
- 노드 추가/삭제 시 파드 생명주기가 자동으로 동기화돼요.
- 마스터 노드 배포를 위해서는
tolerations설정이 필수예요. - 리소스 과점 방지를 위해
resources.limits를 반드시 설정하세요. - 노드 선택이 필요할 땐
nodeSelector를 활용하세요.
실행을 위한 로드맵
데몬셋 개념을 익혔다면 이제 다음 단계로 나아가 보세요.
- 오늘 할 일: 현재 클러스터에서 실행 중인 데몬셋 목록을
kubectl get ds -A명령어로 확인해 보세요. - 이번 주 할 일: 테스트 환경에서 간단한 Nginx 데몬셋을 만들어 모든 노드에 배포되는지 직접 검증해 보세요.
- 실행 직전 할 일: 실제 운영 환경에 적용하기 전,
updateStrategy를 사용하여 롤링 업데이트 시뮬레이션을 진행해 보세요.
실습 과정에서 예상치 못한 에러가 발생하거나 설정이 막힌다면, 주저하지 말고 댓글로 질문을 남겨 주세요. 함께 고민하며 해결해 나가는 과정이 가장 빠른 학습법이니까요! 클러스터 운영의 자동화, 데몬셋과 함께라면 더 이상 두렵지 않아요.
관련하여 더 깊이 있는 학습을 원하신다면 쿠버네티스 데몬셋 기본 개념 글이나 클러스터 구축 입문 글을 함께 읽어보시는 것을 추천드려요.