쿠버네티스에서 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를 설정하여 특정 조건을 만족하는 노드에서만 실행되도록 제한해야 합니다.
• nodeSelector를 logging=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 # 다른 노드에서는 실행되지 않음