728x90
1️⃣ 개요
DaemonSet은 클러스터의 모든 노드에 Pod을 하나씩 자동으로 배포하는 구조입니다.
하지만 다양한 이유로 인해 특정 노드에 DaemonSet Pod이 배포되지 않거나, 실패한 상태로 남는 경우가 있습니다.
이 글에서는 DaemonSet이 일부 노드에 정상적으로 배포되지 않았을 때 이를 자동으로 감지하고, 복구하는 방법에 대해 설명합니다.
2️⃣ DaemonSet이 노드에 배포되지 않는 주요 원인
유형 | 설명 |
Taint/Toleration 불일치 | 해당 노드에 Taint가 설정되어 있고, DaemonSet이 이를 Toleration하지 않음 |
NodeSelector/NodeAffinity 조건 불일치 | 노드의 라벨 조건과 맞지 않아 스케줄링에서 제외됨 |
리소스 부족 | CPU, 메모리 부족으로 스케줄링 불가 |
Pod 스케줄러 오류 | 스케줄링 중 실패 또는 충돌 발생 |
노드 상태 이상 | NotReady 또는 SchedulingDisabled 상태일 경우 |
✅ 이 모든 경우에 DaemonSet은 일부 노드에 배포되지 않은 채로 남을 수 있습니다.
3️⃣ 현재 배포 상태 확인 명령어
kubectl get daemonset -n <namespace>
출력 예시:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
log-agent 5 4 4 4 4 <none> 1h
📌 설명
- DESIRED 수(노드 수)와 CURRENT, READY 수가 일치하지 않으면 일부 노드에 배포되지 않은 상태입니다.
4️⃣ 어떤 노드에 DaemonSet이 빠졌는지 확인하기
kubectl get pods -o wide -l app=log-agent -n <namespace>
kubectl get nodes
✅ 비교하여 Pod이 없는 노드를 찾을 수 있습니다.
또는 다음 스크립트를 통해 자동으로 누락된 노드를 탐지할 수 있습니다:
# 모든 노드 목록
nodes=$(kubectl get nodes -o jsonpath='{.items[*].metadata.name}')
# DaemonSet이 배포된 노드 목록
pods=$(kubectl get pods -n kube-system -l app=log-agent -o jsonpath='{.items[*].spec.nodeName}')
# 누락된 노드 출력
for node in $nodes; do
echo $pods | grep -w $node >/dev/null || echo "❗ DaemonSet 누락된 노드: $node"
done
📌 설명
- log-agent DaemonSet이 배포되지 않은 노드를 자동으로 출력합니다.
5️⃣ 자동 감지 및 알림 시스템 구성 방안
구성 요소 | 설명 |
CronJob | 일정 주기로 누락 노드 감지 스크립트 실행 |
ConfigMap + Script | 탐지 로직을 ConfigMap에 저장하고 Pod에서 실행 |
알림 연동 | 감지 결과를 Slack, Email, Alertmanager 등으로 전송 |
예시: curl -X POST를 이용해 슬랙 웹훅 연동 가능
6️⃣ 복구 전략
상황 | 대응 방법 |
노드 조건 불일치 | NodeSelector, Toleration 조건 확인 및 수정 |
리소스 부족 | 리소스 쿼터 확인, 스케줄링 제한 해제 |
노드 상태 이상 | 노드 상태 점검 후 cordon, uncordon, 재등록 수행 |
이미지 문제 | 이미지 태그, 레지스트리 접근 권한 재확인 |
🔥 7️⃣ 결론
✔ DaemonSet이 모든 노드에 배포되지 않을 수 있으므로 주기적으로 상태를 점검하는 것이 중요합니다.
✔ 노드 라벨, Taint/Toleration, 리소스 상태, 스케줄러 문제 등 다양한 원인을 고려하여 탐지 및 복구 전략을 마련해야 합니다.
✔ 자동화된 감지 스크립트와 알림 시스템을 통해 운영의 신뢰성을 높일 수 있습니다.
728x90