개요

Kubernetes에서 Taints는 노드에 거는 출입 제한 설정이고 Tolerations는 파드가 가진 출입 허용 키에 해당함 이 조합으로 스케줄러가 특정 파드를 특정 노드에서 배제하거나 허용하도록 제어 가능 비용이 높은 노드 보호, 장애 노드 격리, 점검 중 노드 비우기 같은 운영 시나리오에서 효과적임

비유로 이해하기

노드가 VIP 라운지, Taint는 라운지 입구의 안내 표지, 파드는 손님, Toleration은 출입증에 해당함 Taint가 있는 노드에는 아무 파드나 배치되지 않음 해당 Taint를 허용하는 Toleration을 가진 파드만 스케줄링 가능

Taint의 효과 종류

  1. NoSchedule
  • 해당 Toleration이 없으면 새 파드 스케줄링 금지
  • 이미 노드에 있는 파드는 유지
  • 특수 목적 노드에 일반 워크로드가 올라오는 것 방지에 가장 흔히 사용
  1. PreferNoSchedule
  • 가능하면 스케줄링하지 않도록 시도
  • 여유 자원이 부족한 등 불가피하면 배치될 수 있음
  • 유연한 격리가 필요할 때 선택
  1. NoExecute
  • 해당 Toleration이 없으면 새 파드 스케줄링 금지
  • 이미 있는 파드도 퇴거 처리
  • 노드 점검이나 문제 발생 시 파드를 신속히 비워야 할 때 사용

실제 사용 방법

단계 1 노드에 Taint 설정

kubectl로 직접 적용 가능

kubectl taint nodes node-1 gpu=true:NoSchedule

노드 그룹이 오토스케일링으로 증감하는 환경에서는 관리형 노드 그룹 수준에서 Taint를 선언해 두는 편이 안전함 이렇게 하면 새로 생성되는 노드에도 동일한 Taint가 자동 적용됨

단계 2 파드에 Toleration 추가

해당 노드로 갈 수 있는 파드에 최소한의 Toleration만 추가 Deployment 등의 전체 매니페스트는 생략하고 핵심 블록만 예시로 표기함

spec:
  tolerations:
  - key: "gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"

위 설정은 gpu=true NoSchedule Taint가 있는 노드에서도 이 파드가 스케줄링될 수 있음을 의미함

함께 알아둘 점

Taints는 밀어내는 메커니즘이고 Tolerations는 그 배제를 무력화하는 출입 허용 키 역할임 특정 파드를 특정 노드로 반드시 보내고 싶다면 Node Affinity와 함께 사용 권장

  • Taint로 일반 파드가 특수 노드에 올라오는 것을 차단
  • Node Affinity로 해당 파드가 그 노드를 선호하도록 선언

두 개를 동시에 써야 전용 노드 보장과 의도된 배치가 함께 충족됨

운영 팁

  • GPU나 고성능 CPU 노드를 전용으로 보호하고 싶을 때 NoSchedule을 기본값으로 두고 필요한 워크로드에만 Toleration을 부여
  • 장애나 점검으로 노드를 비워야 할 때 NoExecute 사용 검토
  • 노드 자동 증설 환경에서는 노드 그룹 템플릿에 Taint를 선언해 누락을 방지
  • Toleration은 최소한으로 유지해 의도치 않은 노드 유입을 줄임

요약

  • 목적 특정 노드에 일반 워크로드가 배치되지 않도록 차단하고 필요한 파드만 허용하기 위함
  • 방법 노드에 Taint로 제한을 걸고 파드에 필요한 Toleration만 부여
  • 주의 Taints는 배제를, Affinity는 선호를 표현하므로 전용 노드 보장은 두 기능을 함께 사용

특정 노드 그룹을 전용 용도로 쓰고 싶다면 지금 바로 Taint를 적용하고 필요한 파드에만 Toleration을 부여할 것

참고자료