k8s Taint와 Toleration이란?
**Taint(테인트)**와 **Toleration(톨러레이션)**은 Kubernetes에서 특정 노드에 파드(Pod)가 스케줄되는 것을 제어하는 메커니즘입니다. 주로 특정 노드에 제한된 파드만 배포하거나, 특정 리소스(GPU 등)를 가진 노드에 불필요한 파드가 올라가지 않도록 할 때 사용합니다.123
Taint(테인트):
-
노드(Node)에 설정합니다.
-
해당 노드에 “오염” 표시를 하여, 일치하는 톨러레이션이 없는 파드는 스케줄되지 않도록 제한합니다.
-
예시 명령어:
kubectl taint nodes node1 key1=value1:NoSchedule
위 명령은 node1에 key1=value1, 효과는 NoSchedule인 테인트를 추가합니다. 이제 이 조건을 만족하는 톨러레이션이 없는 파드는 node1에 스케줄되지 않습니다.143
Taint 효과 옵션:
-
NoSchedule: 일치하는 톨러레이션이 없으면 파드가 스케줄되지 않음
-
NoExecute: 기존에 실행 중인 파드도 퇴출(Eviction)됨
Toleration(톨러레이션):
-
파드(Pod) 단위로 설정합니다.
-
특정 테인트를 “무시”하고 해당 노드에 스케줄될 수 있도록 허용합니다.
-
파드의 spec에 아래와 같이 추가합니다:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
위 예시는 key1=value1:NoSchedule 테인트가 걸린 노드에 파드가 스케줄될 수 있게 합니다.124
정리
-
테인트는 노드에 “이런 파드는 받지 않겠다”는 제한을 거는 것
-
톨러레이션은 파드에 “나는 이런 제한을 무시할 수 있다”는 허용을 거는 것
-
두 기능을 조합해, 특정 노드에 특정 파드만 배포하거나, 반대로 특정 파드는 특정 노드에만 배포되도록 제어할 수 있습니다.123
참고
-
톨러레이션만 있다고 해서 반드시 해당 노드에만 스케줄되는 것은 아닙니다. 노드 어피니티(Node Affinity)와 함께 사용하면 더욱 강력하게 제어할 수 있습니다.2
-
테인트와 톨러레이션은 클러스터 내 리소스 분리, 중요 파드 보호, 특수 하드웨어 노드 관리 등에 널리 활용됩니다.
NoSchedule, NoExecute, PreferNoSchedule 효과의 차이
| 효과 | 신규 파드 스케줄링 | 기존 파드 영향 | 설명 |
| :— | :— | :— | :— |
| NoSchedule | 불가 | 영향 없음 | 조건에 맞는 톨러레이션이 없는 파드는 해당 노드에 스케줄되지 않음. 기존 실행 중인 파드는 영향 없음.6789 |
| NoExecute | 불가 | 즉시 또는 일정 시간 후 퇴출 | 조건에 맞는 톨러레이션이 없는 파드는 노드에 스케줄되지 않으며, 이미 실행 중인 파드도 퇴출(evict)됨. tolerationSeconds 설정 시 일정 시간 후 퇴출 가능.67810 |
| PreferNoSchedule | 가급적 불가 | 영향 없음 | 조건에 맞는 톨러레이션이 없는 파드는 해당 노드에 가급적 스케줄되지 않으나, 리소스 부족 등 특별한 상황에서는 스케줄될 수 있음. 기존 실행 중인 파드는 영향 없음.67810 |
상세 설명
-
NoSchedule
-
해당 테인트에 맞는 톨러레이션이 없는 파드는 노드에 스케줄되지 않습니다.
-
이미 실행 중인 파드는 영향을 받지 않습니다.
-
NoExecute
-
해당 테인트에 맞는 톨러레이션이 없는 파드는 노드에 스케줄되지 않습니다.
-
이미 실행 중인 파드도 퇴출(eviction) 대상이 됩니다.
-
tolerationSeconds를 지정하면 일정 시간 후 퇴출됩니다.
-
PreferNoSchedule
-
해당 테인트에 맞는 톨러레이션이 없는 파드는 노드에 가급적 스케줄되지 않습니다.
-
하지만 반드시 막는 것은 아니며, 상황에 따라 스케줄될 수 있습니다.
-
기존 실행 중인 파드는 영향을 받지 않습니다.
요약:
- NoSchedule: 신규 파드만 차단
- NoExecute: 신규 파드 차단 + 기존 파드 퇴출
k8s에서 taint와 toleration의 핵심 차이점
-
**Taint(테인트)**는 노드(Node)에 적용하는 설정입니다. 특정 노드에 taint를 추가하면, 그 노드에는 일치하는 toleration이 없는 파드는 스케줄되지 않습니다. 즉, “이 노드에는 아무나 올 수 없다”는 제한을 거는 역할입니다.111213
-
**Toleration(톨러레이션)**은 파드(Pod)에 적용하는 설정입니다. 파드에 toleration을 추가하면, 해당 파드는 일치하는 taint가 있는 노드에도 스케줄될 수 있습니다. 즉, “나는 이 제한을 무시하고 해당 노드에 올라갈 수 있다”고 허용하는 역할입니다.111213
요약
-
Taint: 노드에 적용, 특정 파드의 스케줄을 제한
-
Toleration: 파드에 적용, taint 제한을 무시하고 노드에 스케줄될 수 있게 허용
테인트와 톨러레이션은 함께 사용되어, 특정 노드에 특정 파드만 배포하거나, 리소스 분리를 효과적으로 제어할 수 있게 해줍니다.1213
참조
Footnotes
-
https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/ ↩ ↩2 ↩3 ↩4
-
https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/ ↩ ↩2 ↩3 ↩4
-
https://docs.redhat.com/ko/documentation/openshift_container_platform/4.9/html/post-installation_configuration/post-install-taints-tolerations ↩ ↩2
-
https://stackoverflow.com/questions/50966318/difference-between-noexecute-noschedule-prefernoschedule ↩ ↩2 ↩3
-
https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/ ↩ ↩2