Taints + Tolerations + Node Affinity
개념 요약
- Taints: 노드에 "오염(Taint)"을 적용해, 특정 조건의 Pod가 아니면 해당 노드에 스케줄링되지 않도록 제한합니다.
- Tolerations: Pod가 특정 Taint를 "관용(Tolerate)"할 수 있도록 설정해, 해당 노드에 스케줄링될 수 있게 허용합니다.
- Node Affinity: 노드에 설정된 Label 기반으로 Pod가 선호하거나 반드시 배치되어야 하는 노드를 지정합니다.
한계점
- Taints + Tolerations의 한계
- Taint가 설정된 노드에 대해, Toleration이 없는 Pod는 스케줄링되지 않지만, Toleration이 있는 Pod는 Taint가 없는 일반 노드에도 스케줄링될 수 있습니다.
- ❗즉, 특정 노드에만 배치되기를 원하지만, 다른 일반 노드에 배치될 수 있는 가능성 존재
- 예: Toleration: color=blue인 Pod는 color=blue Taint가 있는 노드에도, 아무 설정 없는 노드에도 스케줄될 수 있음
- Taint가 설정된 노드에 대해, Toleration이 없는 Pod는 스케줄링되지 않지만, Toleration이 있는 Pod는 Taint가 없는 일반 노드에도 스케줄링될 수 있습니다.
- Node Affinity의 한계
- Node Affinity는 특정 조건(label)에 맞는 노드에 스케줄을 유도할 수 있지만,
- Affinity 조건이 없는 Pod는 해당 노드에 스케줄링이 가능함 (차단 기능이 아님)
- 또한 preferredDuringScheduling는 단순 선호이므로 강제성이 없음
완벽한 제어 방법
- 세 가지를 조합해야 특정 노드에만 특정 Pod가 스케줄되도록 완벽한 제어가 가능:
기능 역할
Taint (노드) | 노드에 "이 Pod 아니면 거절" 조건 부여 (NoSchedule, PreferNoSchedule 등) |
Toleration (Pod) | Taint 조건을 만족하는 Pod만 스케줄 가능하게 허용 |
Node Affinity (Pod) | 특정 라벨이 있는 노드에만 스케줄되도록 제어 |
✅ 예시 구성
- 노드 설정:
- node1 → Label: node-type=blue, Taint: key=color:blue:NoSchedule
- Pod 설정:
- Toleration: key=color, value=blue, effect=NoSchedule
- Node Affinity: requiredDuringSchedulingIgnoredDuringExecution → node-type=blue
→ 이렇게 설정하면:
- 해당 Pod는 node-type=blue인 노드에만 스케줄링되고,
- color=blue Taint가 없으면 거절되므로,
- 해당 조건을 모두 만족하는 노드에만 Pod가 배치됨
🔚 결론
- Taints + Tolerations은 접근을 차단/허용하는 장치
- Node Affinity는 배치 조건을 지정하는 장치
- 이 둘은 상호보완적으로 사용되어야 완전한 스케줄링 제어가 가능