Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.26] 🚀 DaemonSet 편 #1 | 모든 노드에서 실행되는 Pod 배포

ygtoken 2025. 3. 16. 17:41
728x90

 

쿠버네티스에서 DaemonSet은 클러스터의 모든 노드에서 동일한 Pod을 실행하는 데 사용됩니다.

이번 글에서는 DaemonSet을 활용하여 모든 노드에서 로그 수집, 모니터링, 시스템 에이전트 등을 배포하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 모든 노드에서 실행되는 DaemonSet Pod 배포

2️⃣ 특정 노드에서만 실행되도록 DaemonSet을 제한

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ 모든 노드에서 실행되는 DaemonSet Pod 배포

 

❓ 문제 상황

 

운영팀에서 클러스터 내 모든 노드에서 로그 수집 및 모니터링 에이전트를 실행해야 하는 요구사항이 생겼습니다.

각 노드마다 하나의 Pod이 실행되어야 하며, 새로운 노드가 추가되면 자동으로 DaemonSet이 배포되어야 합니다.

DaemonSet의 이름은 log-agent이어야 합니다.

fluentd 이미지를 사용하여 모든 노드에서 로그를 수집해야 합니다.

새로운 노드가 추가되면 자동으로 Pod이 생성되어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. DaemonSet을 생성하여 모든 노드에서 하나의 Pod이 실행되도록 설정해야 합니다.

nodeSelector를 사용하지 않으면 기본적으로 모든 노드에 Pod이 배포됨

 

2. 새로운 노드가 추가될 때 자동으로 Pod이 생성되는지 확인해야 합니다.

 


✅ 정답 Manifest (모든 노드에서 실행되는 DaemonSet 설정)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent  # DaemonSet 이름
spec:
  selector:
    matchLabels:
      name: log-agent  # Pod 선택을 위한 레이블
  template:
    metadata:
      labels:
        name: log-agent  # Pod 레이블
    spec:
      containers:
      - name: fluentd
        image: fluentd:latest  # 로그 수집 에이전트 컨테이너
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log  # 노드의 /var/log 디렉터리를 마운트

 

 


📌 적용 후 예상 결과 값

 

1. DaemonSet 생성 확인

kubectl get daemonset

 

💡 예상 출력 값

NAME         DESIRED   CURRENT   READY   AGE
log-agent    3         3         3       5s

 

2. 각 노드에서 실행 중인 Pod 확인

kubectl get pods -o wide

 

💡 예상 출력 값

NAME             READY   STATUS    NODE         AGE
log-agent-xyz1   1/1     Running   worker-node1  5s
log-agent-abc2   1/1     Running   worker-node2  5s
log-agent-def3   1/1     Running   worker-node3  5s

 

 


2️⃣ 특정 노드에서만 실행되도록 DaemonSet을 제한

 

❓ 문제 상황

 

운영팀에서 로그 수집 에이전트를 실행해야 하지만, 특정 노드에서만 실행되도록 제한해야 하는 요구사항이 생겼습니다.

일부 노드는 로그 수집 대상에서 제외해야 하며, 특정 레이블이 있는 노드에서만 DaemonSet이 실행되도록 설정해야 합니다.

DaemonSet의 이름은 filtered-log-agent이어야 합니다.

nodeSelector를 사용하여 logging=true 레이블이 있는 노드에서만 실행되도록 설정해야 합니다.

레이블이 없는 노드에서는 실행되지 않아야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. DaemonSet에 nodeSelector를 설정하여 특정 조건을 만족하는 노드에서만 실행되도록 제한해야 합니다.

nodeSelectorlogging=true로 설정하여 해당 레이블이 있는 노드에서만 실행

 

2. 노드에 logging=true 레이블이 적용되었는지 확인해야 합니다.

 


✅ 정답 Manifest (특정 노드에서만 실행되는 DaemonSet 설정)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filtered-log-agent  # DaemonSet 이름
spec:
  selector:
    matchLabels:
      name: filtered-log-agent  # Pod 선택을 위한 레이블
  template:
    metadata:
      labels:
        name: filtered-log-agent  # Pod 레이블
    spec:
      nodeSelector:
        logging: "true"  # logging=true 레이블이 있는 노드에서만 실행
      containers:
      - name: fluentd
        image: fluentd:latest  # 로그 수집 에이전트 컨테이너

 

 


📌 적용 후 예상 결과 값

 

1. 노드에 레이블 추가

kubectl label nodes worker-node1 logging=true

 

💡 예상 출력 값

node/worker-node1 labeled

 

2. DaemonSet 생성 확인

kubectl get daemonset

 

💡 예상 출력 값

NAME                 DESIRED   CURRENT   READY   AGE
filtered-log-agent   1         1         1       5s

 

3. Pod이 특정 노드에서만 실행되는지 확인

kubectl get pods -o wide

 

💡 예상 출력 값

NAME                      READY   STATUS    NODE         AGE
filtered-log-agent-xyz1   1/1     Running   worker-node1  5s

 

4. 레이블이 없는 노드에서는 Pod이 실행되지 않는지 확인

kubectl get pods --all-namespaces -o wide | grep filtered-log-agent

 

💡 예상 출력 값

filtered-log-agent-xyz1   1/1     Running   worker-node1  5s  # 다른 노드에서는 실행되지 않음
728x90