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)됨

  • PreferNoSchedule: 가급적이면 스케줄하지 않지만, 상황에 따라 스케줄될 수 있음245


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: 신규 파드 차단 + 기존 파드 퇴출
  • PreferNoSchedule: 가급적 신규 파드 차단(소프트 제한).678109

k8s에서 taint와 toleration의 핵심 차이점

  • **Taint(테인트)**는 노드(Node)에 적용하는 설정입니다. 특정 노드에 taint를 추가하면, 그 노드에는 일치하는 toleration이 없는 파드는 스케줄되지 않습니다. 즉, “이 노드에는 아무나 올 수 없다”는 제한을 거는 역할입니다.111213

  • **Toleration(톨러레이션)**은 파드(Pod)에 적용하는 설정입니다. 파드에 toleration을 추가하면, 해당 파드는 일치하는 taint가 있는 노드에도 스케줄될 수 있습니다. 즉, “나는 이 제한을 무시하고 해당 노드에 올라갈 수 있다”고 허용하는 역할입니다.111213


요약

  • Taint: 노드에 적용, 특정 파드의 스케줄을 제한

  • Toleration: 파드에 적용, taint 제한을 무시하고 노드에 스케줄될 수 있게 허용

테인트와 톨러레이션은 함께 사용되어, 특정 노드에 특정 파드만 배포하거나, 리소스 분리를 효과적으로 제어할 수 있게 해줍니다.1213

참조

Footnotes

  1. https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/ 2 3 4

  2. https://seokhyun2.tistory.com/65 2 3 4 5

  3. https://successisnotfaraway.tistory.com/96 2 3

  4. https://gngsn.tistory.com/282 2 3

  5. https://gruuuuu.github.io/cloud/k8s-taint-toleration/

  6. https://dobby-isfree.tistory.com/163 2 3 4

  7. https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/ 2 3 4

  8. https://bcho.tistory.com/1344 2 3 4

  9. https://docs.redhat.com/ko/documentation/openshift_container_platform/4.9/html/post-installation_configuration/post-install-taints-tolerations 2

  10. https://stackoverflow.com/questions/50966318/difference-between-noexecute-noschedule-prefernoschedule 2 3

  11. https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/ 2

  12. https://gngsn.tistory.com/282 2 3

  13. https://fairycode.tistory.com/95 2 3