핵심 인사이트 (3줄 요약)

  1. 본질: 테인트 (Taint)와 톨러레이션 (Toleration)은 파드(Pod)가 특정 노드(Node)에 스케줄링되는 것을 노드 입장에서 거부하고, 이를 예외적으로 허용하는 방어적 스케줄링 통제 기법이다.
  2. 가치: 고가의 GPU 노드나 특정 서비스 전용 노드에 무관한 파드가 배치되어 자원을 고갈시키는 것을 물리적으로 차단하여, 클러스터의 목적별 자원 격리를 완벽하게 보장한다.
  3. 판단 포인트: 테인트는 단순히 스케줄링을 막을 뿐만 아니라(NoSchedule), 이미 배치된 파드를 쫓아낼 수도 있으므로(NoExecute), 장애 복구나 유지보수를 위한 노드 비우기(Drain) 전략과 연계하여 사용해야 한다.

Ⅰ. 개요 및 필요성

쿠버네티스 (Kubernetes)의 기본 스케줄러는 가용 자원만 확인하면 파드를 무작위로 분산 배치한다. 만약 클러스터에 딥러닝 연산을 위한 고가 GPU 노드나, 보안 데이터베이스 전용 노드가 섞여 있다면 심각한 문제가 발생한다. 일반적인 웹 서버 파드가 텅 빈 GPU 노드에 멋대로 들어가 메모리를 차지하면, 정작 필요한 AI 파드는 자원 부족으로 배정받지 못해 대기 상태(Pending)에 빠지기 때문이다.

이러한 무분별한 배정을 막기 위해 노드에 "접근 금지" 속성인 테인트를 부여한다. 테인트가 설정된 노드에는 어떠한 파드도 스케줄링될 수 없다. 단, 이 테인트를 무시할 수 있는 내성인 톨러레이션을 가진 파드만이 예외적으로 해당 노드에 들어갈 수 있게 함으로써, 자원의 오남용을 원천 차단한다.

  • 📢 섹션 요약 비유: 테인트는 클럽 입구에 세워둔 "VIP 전용, 일반인 출입 금지" 팻말과 같고, 톨러레이션은 그 팻말을 무시하고 들어갈 수 있는 "VIP 패스"와 같다.

Ⅱ. 아키텍처 및 핵심 원리

테인트와 톨러레이션은 Key, Value, Effect라는 세 가지 요소의 완벽한 일치(Match)를 통해 작동한다. 노드에 테인트를 설정하면, 파드의 매니페스트(YAML)에 정의된 톨러레이션과 비교하여 스케줄링 여부를 결정한다.

┌──────────────────────────────────────────────────────────────┐
│       테인트와 톨러레이션의 매칭 아키텍처 (Key-Value-Effect)        │
├──────────────────────────────────────────────────────────────┤
│ [일반 웹 파드] (Toleration 없음) ─▶ (스케줄링 거부!)             │
│                                      │                       │
│ [AI 전용 파드] (Toleration 장착) ─▶  ▼                       │
│ ┌─────────────────────────┐      ┌─────────────────────────┐ │
│ │ Toleration:             │ 일치 │ Node 2 (GPU 서버)       │ │
│ │ key=gpu, value=true     │ ═══▶ │ Taint:                  │ │
│ │ effect=NoSchedule       │      │ key=gpu, value=true     │ │
│ └─────────────────────────┘      │ effect=NoSchedule       │ │
│                                  └─────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘

이 구조에서 가장 중요한 것은 Effect (효과)다. 스케줄러가 파드를 거부하는 강도를 결정하기 때문이다.

  1. NoSchedule: 톨러레이션이 없는 파드는 이 노드에 새로 스케줄링되지 않는다. 단, 기존에 실행 중이던 파드는 건드리지 않는다.
  2. PreferNoSchedule: K8s 시스템이 톨러레이션이 없는 파드를 이 노드에 스케줄링하지 않으려고 최선을 다하지만, 다른 노드에 자원이 전혀 없다면 어쩔 수 없이 배정한다 (소프트한 거부).
  3. NoExecute: 가장 강력한 통제다. 새로운 파드 배정을 막는 것은 물론, 이미 실행 중인 파드 중 톨러레이션이 없는 것들은 즉시 노드에서 쫓아낸다 (Evict).
  • 📢 섹션 요약 비유: NoSchedule은 "지금부터 반바지 입은 사람 출입 금지", NoExecute는 "지금부터 반바지 입은 사람 출입 금지이며, 이미 들어온 반바지 입은 사람도 멱살 잡고 내쫓아라"와 같다.

Ⅲ. 비교 및 연결

K8s에서 파드 배치를 제어하는 대표적 방법으로 노드 어피니티 (Node Affinity)테인트/톨러레이션이 있다. 이 둘은 목적이 정반대이므로 상호 보완적으로 사용된다.

항목테인트 (Taint) / 톨러레이션 (Toleration)노드 어피니티 (Node Affinity)
주체노드 (Node) 가 파드를 거부함 (Repel)파드 (Pod) 가 노드를 선택함 (Attract)
주요 목적특정 노드에 아무 파드나 못 들어오게 방어 (전용 노드 격리)파드가 자신에게 맞는 노드를 찾아가도록 유도
적용 사례GPU 노드 격리, 장애 노드 퇴출 (Drain)SSD 스토리지 노드 선호, 특정 존(Zone) 배치
한계해당 노드에 들어가는 것은 통제하지만, 톨러레이션이 있는 파드가 다른 일반 노드에 가는 것은 막지 못함파드가 특정 노드를 찾아가지만, 그 노드에 다른 잡다한 파드가 섞여 들어오는 것은 막지 못함

따라서 완벽한 전용 노드(Dedicated Node)를 구축하려면, 노드에는 테인트를 걸어 잡다한 파드를 쫓아내고, 전용 파드에는 톨러레이션을 주어 입장권을 부여함과 동시에 노드 어피니티를 설정하여 해당 파드가 반드시 그 전용 노드에만 배치되도록 양방향 통제를 걸어야 한다.

  • 📢 섹션 요약 비유: 어피니티는 "나는 창가 자리에 앉고 싶어"라고 손님이 자리를 찜하는 것이고, 테인트는 "이 테이블은 예약석이니 아무나 앉지 마세요"라고 식당이 팻말을 세우는 것이다.

Ⅳ. 실무 적용 및 기술사 판단

실무에서 테인트와 톨러레이션은 단순히 스케줄링을 넘어, 장애 복구 및 유지보수 자동화의 핵심 메커니즘으로 쓰인다.

  1. 노드 유지보수 (Drain):
    • 서버 커널 업데이트나 하드웨어 교체를 위해 kubectl drain 명령을 내리면, K8s는 내부적으로 해당 노드에 node.kubernetes.io/unschedulable:NoSchedule 테인트를 건다. 이후 기존 파드들을 안전하게 쫓아내어 유지보수 환경을 만든다.
  2. 장애 상태 자동 대응:
    • 노드의 네트워크가 끊기거나(NotReady), 메모리가 부족해지면(MemoryPressure), K8s의 노드 컨트롤러가 자동으로 NoExecute 테인트를 부여한다. 이를 통해 파드들이 죽은 노드에 머물지 않고 정상 노드로 빠르게 대피(Evict)하도록 만든다.

기술사 판단 포인트: 퍼블릭 클라우드에서 스팟 인스턴스 (Spot Instance)나 비용이 비싼 GPU 노드 그룹을 운영할 때는 반드시 테인트를 부여해야 한다. 그렇지 않으면 CI/CD 파이프라인에서 쏟아지는 단발성 빌드 파드들이 GPU 노드를 점유하여 클라우드 비용 폭탄을 유발할 수 있다.

  • 📢 섹션 요약 비유: 고장 난 비행기에 "탑승 불가" 딱지를 붙여 새로운 승객을 막고, 이미 탄 승객을 다른 비행기로 갈아태우는 비상 대피 시스템과 같다.

Ⅴ. 기대효과 및 결론

테인트와 톨러레이션을 도입하면 클러스터 내의 자원 혼재를 막고, 예측 가능한 성능을 보장할 수 있다. 값비싼 하드웨어를 온전히 목적에 맞게 활용하여 TCO (Total Cost of Ownership)를 최적화할 수 있으며, 장애 시 자동화된 파드 대피를 통해 서비스 가용성을 높인다.

결론적으로, K8s의 스케줄링은 "파드를 어디로 보낼 것인가"라는 파드의 권리뿐만 아니라, "노드가 어떤 파드를 거부할 것인가"라는 노드의 권리를 함께 설계해야만 완성된다. 테인트는 이러한 노드의 권리를 보장하는 가장 확실한 방어선이다.

  • 📢 섹션 요약 비유: 아무리 넓은 운동장이라도 선을 그어 축구장, 농구장, 육상 트랙을 나누지 않으면 사고가 난다. 테인트는 이 운동장에 쳐놓은 튼튼한 철조망이다.

📌 관련 개념 맵

개념연결 포인트
Node Affinity파드가 노드를 끌어당기는(Attract) 규칙으로, 테인트(Repel)와 결합 시 완벽한 전용 노드 구축
Pod Eviction (축출)NoExecute 테인트 발동 시 기존 파드가 노드에서 쫓겨나는 메커니즘
DaemonSet (데몬셋)기본적으로 톨러레이션을 내장하여, 테인트가 있는 노드에도 로깅/모니터링 에이전트를 강제로 배포
Cordon / Drain노드 유지보수를 위해 의도적으로 스케줄링을 막거나(Cordon) 파드를 비울 때(Drain) 내부적으로 테인트 사용

📈 관련 키워드 및 발전 흐름도

노드 어피니티 (Node Affinity)
(파드의 노드 선택)
    │
    ▼
테인트와 톨러레이션 (Taint & Toleration)
(노드의 파드 거부 및 예외 허용)
    │
    ▼
전용 노드 (Dedicated Node) 풀 구성
(고비용 자원 격리)
    │
    ▼
자동 테인트 기반 축출 (Taint-based Eviction)
(노드 장애 자동 감지 및 대피)

👶 어린이를 위한 3줄 비유 설명

  1. 쿠버네티스 마을에는 일반 집과 수영장이 달린 아주 비싼 대저택(GPU 노드)이 있어요.
  2. 대저택 주인은 아무나 들어오지 못하게 문 앞에 "냄새나는 마늘(Taint)"을 잔뜩 뿌려놨어요.
  3. 오직 수영 국가대표 선수들만 "코마개(Toleration)"를 가지고 있어서 냄새를 참고 저택에 들어가 수영장을 독차지할 수 있답니다!