KCNA — 쿠버네티스·클라우드 네이티브 입문 · 쿠버네티스 아키텍처 · 실습
노드가 셋인데 파드가 갈 곳이 없다
목표
테인트/톨러레이션, nodeSelector, 노드 어피니티가 파드의 배치를 각각 어떻게 바꾸는지 직접 걸어 보고,
같은 Pending 이라도 원인(테인트를 못 견딤 / 라벨이 안 맞음 / 맞는 존이 없음)이 다르다는 것을 관찰합니다.
왜 중요한가
쿠버네티스에서 "파드가 어느 노드에서 도는가" 는 우연이 아니라 스케줄러의 계산 결과입니다.
kube-scheduler 는 배정되지 않은 파드를 지켜보다가, 노드마다 테인트·라벨·자원·어피니티를 따져
통과하는 노드를 고르고 spec.nodeName 을 채웁니다. 이 결정이 왜 그렇게 났는지 읽지 못하면,Pending 하나를 두고 "자원이 없나?" "노드가 죽었나?" 하고 헤매게 됩니다.
테인트는 노드가 "나는 아무나 받지 않는다" 고 선언하는 것이고, 톨러레이션은 파드가 "나는 그걸 견딘다" 고
답하는 것입니다. nodeSelector 와 노드 어피니티는 반대로 파드가 "나는 이런 노드가 좋다/필수다" 라고
요구하는 것입니다. 둘은 방향이 반대라 함께 걸릴 때가 많고, 그래서 하나만 봐서는 배치를 설명하지 못합니다.
단계
1. 네임스페이스 kcna-sched 를 만들고 노드 이름과 존 라벨을 파일로 뽑습니다.
2. 세 노드 모두에 tier=reserved:NoSchedule 테인트를 겁니다.
3. 톨러레이션 없는 파드 plain 이 Pending 에 멈추는 것을 확인합니다.
4. 테인트를 견디는 톨러레이션을 준 파드 tolerant 가 배정되는 것을 확인합니다.
5. lab-node-0 에 disktype=ssd 라벨을 붙이고 nodeSelector 로 그 노드에만 앉는 파드를 만듭니다.
6. 노드 어피니티로 zone-1·zone-2 노드에만 앉는 파드를 만듭니다.
7. 없는 라벨(disktype=nvme)을 요구해 Pending 에 멈추는 파드를 만듭니다.
8. 각 파드의 결과를 /root/kcna-sched/report.txt 에 장부로 남깁니다.
참고
kubectl describe pod <이름> -n kcna-sched의 Events 와PodScheduled조건의 reason 이 "왜 못 갔는지" 를 알려 줍니다.- 테인트를 못 견뎌 막히는 것과 셀렉터가 안 맞아 막히는 것은 증상이 같으니, describe 로 원인을 구분하세요.
- 공식 문서: [테인트와 톨러레이션](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) ·
[노드에 파드 배정하기](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/) ·
[kube-scheduler](https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/).
단계 8개
- 작업 네임스페이스와 노드 지도 만들기
- 세 노드를 모두 예약 표시로 잠그기
- 갈 곳 없는 파드가 Pending 에 멈추다
- 예약 표시를 견디는 파드는 들어간다
- SSD 노드에만 앉히기
- 특정 존으로만 보내는 노드 어피니티
- 아무 노드도 만족하지 못하는 요구
- 무엇이 배치를 정했는지 장부로 남기기