Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #4: DaemonSet (워크로드 리소스)

ygtoken 2025. 3. 5. 00:11
728x90

Kubernetes에서 대부분의 워크로드는 DeploymentStatefulSet을 통해 관리됩니다.
하지만 클러스터의 모든 노드에서 반드시 실행되어야 하는 애플리케이션이라면 DaemonSet을 사용해야 합니다.

이번 글에서는 DaemonSet의 개념, 사용 목적, Deployment와의 차이점, 그리고 실전 활용법을 정리해 보겠습니다.


🔹 DaemonSet이란?

DaemonSet은 Kubernetes의 특정한 컨트롤러 리소스로, 클러스터의 모든 노드에서 Pod를 실행하는 역할을 합니다.

✔️ 클러스터의 모든 노드에서 실행됨
✔️ 새로운 노드가 추가되면 자동으로 Pod 생성
✔️ 불필요한 노드가 제거되면 해당 Pod도 삭제됨


📌 DaemonSet이 필요한 경우

DaemonSet은 특정 Pod가 클러스터 전체에서 항상 실행되어야 하는 경우에 사용됩니다.
대표적인 예시는 다음과 같습니다.

사용 사례 설명

로그 수집 모든 노드에서 로그를 수집하는 Fluentd, Filebeat 등의 에이전트 배포
모니터링 노드의 리소스를 수집하는 Prometheus Node Exporter, Datadog Agent 배포
네트워크 관리 네트워크 정책을 적용하는 Calico, Cilium, Kube-proxy 배포
스토리지 관리 노드에 스토리지 관련 에이전트를 배포하는 Ceph, GlusterFS 사용

💡 Deployment는 일부 노드에서만 Pod를 실행할 수 있지만, DaemonSet은 클러스터 전체에서 실행됨이 보장됩니다.


🔹 DaemonSet과 Deployment의 차이점

기능 DaemonSet Deployment

특정 노드에서만 실행 ❌ (모든 노드에서 실행) ✅ 가능
스케일링 방식 ❌ (모든 노드에 1개씩 실행) ✅ 원하는 개수로 조절 가능
새 노드 추가 시 동작 ✅ 자동으로 Pod 배포 ❌ 수동으로 조정해야 함
상태 유지 (Stateful) ❌ 기본적으로 상태 없음 ❌ (StatefulSet 사용 시 가능)

💡 특정 노드에서만 실행하려면 Deployment + nodeSelector 또는 affinity를 설정해야 하지만, DaemonSet은 기본적으로 모든 노드에서 실행됩니다.


🔹 DaemonSet YAML 예제

아래 예제는 Fluentd 로그 수집기를 DaemonSet으로 배포하는 예제입니다.

apiVersion: apps/v1  # DaemonSet을 정의하는 API 버전
kind: DaemonSet  # DaemonSet 리소스 선언
metadata:
  name: fluentd  # DaemonSet의 이름
spec:
  selector:  # DaemonSet이 관리할 Pod 선택 기준
    matchLabels:
      name: fluentd  # 'name=fluentd' 레이블이 붙은 Pod를 관리
  template:  # DaemonSet이 생성할 Pod 템플릿
    metadata:
      labels:
        name: fluentd  # Pod에 부여할 레이블
    spec:
      containers:
        - name: fluentd  # 컨테이너 이름
          image: fluent/fluentd  # 사용할 Fluentd 컨테이너 이미지
          volumeMounts:
            - name: varlog  # 호스트의 로그 파일을 컨테이너에서 사용
              mountPath: /var/log
      volumes:
        - name: varlog
          hostPath:
            path: /var/log  # 호스트의 /var/log 디렉터리를 Pod에서 사용

💡 Fluentd가 모든 노드에서 실행되면서 로그를 수집할 수 있도록 설정되었습니다.


🔹 DaemonSet 배포 및 확인

kubectl apply -f daemonset.yaml
kubectl get pods -o wide

출력 예시:

NAME          READY   STATUS    NODE
fluentd-abc   1/1     Running   node-1
fluentd-def   1/1     Running   node-2
fluentd-ghi   1/1     Running   node-3

💡 모든 노드에 각각 하나씩 Pod가 실행된 것을 확인할 수 있습니다.


🔹 특정 노드에서만 실행하기 (nodeSelector 활용)

DaemonSet을 모든 노드가 아닌 특정 노드에서만 실행하려면 nodeSelector를 사용할 수 있습니다.

spec:
  template:
    spec:
      nodeSelector:
        kubernetes.io/os: linux  # 리눅스 노드에서만 실행되도록 설정

💡 위 설정을 추가하면 리눅스 노드에서만 실행됩니다.


🔹 새로운 노드 추가 시 DaemonSet 동작 확인

1️⃣ 새로운 노드 추가

kubectl get nodes

2️⃣ 새로운 노드에서 자동으로 Pod가 실행되는지 확인

kubectl get pods -o wide

💡 새로운 노드가 추가되면 자동으로 Pod가 생성됩니다!


🔹 DaemonSet 삭제 및 재배포

DaemonSet을 삭제하면 관련된 모든 Pod도 함께 삭제됩니다.

kubectl delete daemonset fluentd
kubectl get pods  # Pod가 모두 삭제됨

💡 Deployment와 달리 DaemonSet은 삭제되면 Pod도 함께 삭제됩니다.


🚀 마무리

DaemonSet은 클러스터의 모든 노드에서 실행되어야 하는 애플리케이션을 관리하는 데 필수적인 리소스입니다.


✔️ 로그 수집, 모니터링, 네트워크 관리 등에 필수적
✔️ 모든 노드에서 실행되며, 새 노드 추가 시 자동 배포
✔️ nodeSelector를 활용하면 특정 노드에서만 실행 가능

 

728x90