개발 창고/Server

Kubernetes DaemonSet 완전 정복: 모든 노드에 Pod를 자동 배포하는 방법

Royzero 2025. 8. 4. 22:00
반응형

목차

  1. DaemonSet이란 무엇인가?
  2. 왜 DaemonSet이 필요한가?
  3. DaemonSet의 주요 특징
  4. 기본 YAML 구성 예제
  5. 실제 사용 시나리오 예시
  6. DaemonSet vs Deployment vs StatefulSet
  7. DaemonSet 수정 및 삭제 방법
  8. 자주 발생하는 오류와 해결 방법
  9. 자주 묻는 질문 (FAQ)
  10. 요약 정리

1. DaemonSet이란 무엇인가?

DaemonSet은 Kubernetes에서 제공하는 워크로드 리소스 중 하나로, 클러스터의 모든 노드에 동일한 Pod를 하나씩 배포하는 역할을 합니다.

예를 들어, 클러스터의 모든 노드에 로그 수집 에이전트(fluentd), 모니터링 에이전트(prometheus node exporter) 등을 배포해야 할 때 유용합니다.

특징 요약

항목 설명
배포 대상 모든 노드(또는 조건에 맞는 노드)
주요 용도 모니터링, 로깅, 시스템 레벨 데몬 배포
대표 예시 node-exporter, fluent-bit, logstash 등
Pod 수 노드 수와 동일 (기본 설정 기준)

2. 왜 DaemonSet이 필요한가?

일반적인 Deployment는 스케일링된 Pod를 아무 노드에나 배포합니다. 하지만 다음과 같은 경우에는 모든 노드에 반드시 하나의 Pod가 필요합니다.

사용 예시

  • 각 노드의 CPU/메모리/디스크 상태 수집 에이전트
  • 노드 로컬 디스크 백업 도구
  • 네트워크 트래픽 모니터링 Daemon
  • GPU 드라이버 관리 에이전트

단 하나라도 노드에서 해당 Pod가 빠지면 모니터링이나 수집이 누락됩니다. 이럴 때 DaemonSet이 필수입니다.


3. DaemonSet의 주요 특징

특징 설명
자동 배포 노드 추가 시 자동으로 Pod 생성
자동 삭제 노드 삭제 시 해당 Pod 자동 제거
노드 셀렉터 지원 특정 레이블의 노드에만 배포 가능
Tolerations 지원 taint된 노드에도 배포 가능 (예: 마스터 노드 포함)
클러스터 상태 감시 필수 노드 수에 따라 리소스가 동적으로 늘어남

4. DaemonSet 기본 YAML 예제

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: log-agent
  template:
    metadata:
      labels:
        app: log-agent
    spec:
      containers:
      - name: log-agent
        image: fluent/fluentd:latest
        resources:
          limits:
            memory: "200Mi"
            cpu: "200m"

위 YAML은 모든 노드에 fluentd 기반 로그 수집기를 배포합니다. namespace: kube-system을 사용하여 시스템 영역에서 관리되도록 지정했습니다.


5. 실제 사용 시나리오 예시

1) Prometheus Node Exporter 설치

  • 모든 노드의 메트릭 수집
  • DaemonSet으로 각 노드에 배포
  • Prometheus 서버는 클러스터 외부에서 scrape

2) GPU 드라이버 Daemon 배포

  • GPU 노드에서만 작동 (nodeSelector 사용)
  • CUDA 환경 초기화 Pod로 구성
spec:
  nodeSelector:
    hardware: nvidia

6. DaemonSet vs Deployment vs StatefulSet

항목 DaemonSet Deployment StatefulSet
Pod 개수 노드 수만큼 1:1 수동 설정 (replica) 순차적으로 증가
고유성 노드별 하나 랜덤 이름, 스토리지 고정
사용 목적 데몬, 에이전트 웹앱, API 서버 DB, Kafka 등 상태ful 앱

Deployment와 혼용하면 리소스 충돌 가능성이 있으므로 주의가 필요합니다.


7. DaemonSet 수정 및 삭제

# 수정
kubectl edit daemonset log-agent -n kube-system

# 삭제
kubectl delete daemonset log-agent -n kube-system

8. 자주 발생하는 오류와 해결 방법

오류 메시지 원인 해결 방법
insufficient memory 노드 리소스 부족 리소스 요청 줄이기
matchLabels mismatch selector 오류 selector, template.label 일치 확인
PodUnschedulable taint된 노드 미허용 tolerations 추가 필요

9. 자주 묻는 질문 (FAQ)

Q1. DaemonSet은 모든 노드에 무조건 Pod를 생성하나요?

아니요. nodeSelector, affinity, tolerations 조건에 따라 선택적으로 배포할 수 있습니다.

Q2. DaemonSet은 수평 확장이 가능한가요?

기본적으로 Pod 수는 노드 수로 제한되므로 replica 개념은 없습니다.

Q3. DaemonSet은 HPA(수평 오토스케일링)가 가능한가요?

불가능합니다. 대신, 클러스터의 노드 수를 조절함으로써 간접적인 스케일링은 가능합니다.


10. 요약 정리

  • DaemonSet은 모든 노드에 Pod를 배포하는 특수 리소스
  • 로그 수집, 모니터링, 시스템 에이전트에 필수
  • nodeSelector, tolerations 등과 함께 사용 가능
  • 수정 시 label-selector 주의 필요
  • Deployment, StatefulSet과의 차이 이해 필요
반응형