쿠버네티스에서는 Taint & Toleration을 활용하여 특정 노드에서만 DaemonSet을 실행할 수 있습니다.
이번 글에서는 Taint를 적용하여 특정 노드에서만 DaemonSet이 배포되도록 설정하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ 특정 노드에서만 실행되도록 Taint & Toleration 설정
2️⃣ 특정 노드에서만 실행되는 DaemonSet 배포 검증
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ 특정 노드에서만 실행되도록 Taint & Toleration 설정
❓ 문제 상황
운영팀에서 모니터링 에이전트를 특정 노드에서만 실행해야 하는 요구사항이 생겼습니다.
클러스터의 모든 노드가 아니라, 특정 노드에만 Pod이 실행되도록 Taint & Toleration을 적용해야 합니다.
• 특정 노드에 monitoring-only=true:NoSchedule Taint를 적용해야 합니다.
• DaemonSet의 이름은 monitoring-agent이어야 합니다.
• tolerations를 사용하여 특정 Taint를 가진 노드에서만 실행되도록 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. 특정 노드에 Taint를 추가하여 기본적으로 모든 Pod이 실행되지 않도록 설정해야 합니다.
• monitoring-only=true:NoSchedule을 설정하여 일반적인 Pod 배포를 차단
2. DaemonSet의 tolerations를 설정하여 Taint가 적용된 노드에서만 실행되도록 설정해야 합니다.
✅ 정답 Manifest (Taint & Toleration을 적용한 DaemonSet 설정)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-agent # DaemonSet 이름
spec:
selector:
matchLabels:
name: monitoring-agent # Pod 선택을 위한 레이블
template:
metadata:
labels:
name: monitoring-agent # Pod 레이블
spec:
tolerations:
- key: "monitoring-only"
operator: "Equal"
value: "true"
effect: "NoSchedule" # Taint가 설정된 노드에서만 실행
containers:
- name: monitoring
image: busybox # 테스트용 컨테이너
command: ["sh", "-c", "echo Monitoring agent running; sleep 3600"]
📌 적용 후 예상 결과 값
1. 특정 노드에 Taint 추가
kubectl taint nodes worker-node1 monitoring-only=true:NoSchedule
💡 예상 출력 값
node/worker-node1 tainted
2. DaemonSet 생성 확인
kubectl get daemonset
💡 예상 출력 값
NAME DESIRED CURRENT READY AGE
monitoring-agent 1 1 1 5s
3. Pod이 특정 노드에서만 실행되는지 확인
kubectl get pods -o wide
💡 예상 출력 값
NAME READY STATUS NODE AGE
monitoring-agent-xyz1 1/1 Running worker-node1 5s
4. Taint가 적용되지 않은 노드에서는 실행되지 않는지 확인
kubectl get pods --all-namespaces -o wide | grep monitoring-agent
💡 예상 출력 값
monitoring-agent-xyz1 1/1 Running worker-node1 5s # 다른 노드에서는 실행되지 않음
2️⃣ 특정 노드에서만 실행되는 DaemonSet 배포 검증
❓ 문제 상황
운영팀에서 DaemonSet이 설정한 Taint를 적용한 노드에서만 실행되는지 검증해야 하는 요구사항이 생겼습니다.
이를 위해 새로운 노드를 추가하고 해당 노드에 Taint를 적용한 후 DaemonSet이 올바르게 배포되는지 확인해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. 새로운 노드(worker-node2)에 동일한 Taint를 적용해야 합니다.
• monitoring-only=true:NoSchedule Taint를 추가
2. 새로운 노드에서 DaemonSet이 자동으로 배포되는지 확인해야 합니다.
✅ 검증 과정
1. 새로운 노드에 동일한 Taint 추가
kubectl taint nodes worker-node2 monitoring-only=true:NoSchedule
💡 예상 출력 값
node/worker-node2 tainted
2. DaemonSet이 새로운 노드에도 배포되었는지 확인
kubectl get pods -o wide
💡 예상 출력 값
NAME READY STATUS NODE AGE
monitoring-agent-xyz1 1/1 Running worker-node1 5s
monitoring-agent-abc2 1/1 Running worker-node2 5s
3. Taint가 적용되지 않은 노드에서는 실행되지 않는지 확인
kubectl get pods --all-namespaces -o wide | grep monitoring-agent
💡 예상 출력 값
monitoring-agent-xyz1 1/1 Running worker-node1 5s
monitoring-agent-abc2 1/1 Running worker-node2 5s # Taint가 적용된 노드에서만 실행