본문 바로가기
  • ✨contact : survd0404@gmail.com
K8S

Taint 와 Toleration

by 수민이수민수민이수민 2025. 12. 4.
첫번째부터 taint 는 무엇이고 왜 필요할까?

 

이것을 알기 위해선 '쿠버네티스의 기본 전제' 를 알아야한다.
쿠버네티스의 기본 전제

 

  1. 모든 노드는 동등하다고 가정
  2. 어떤 Pod이든 어떤 노드든 갈 수 있다
  3. 리소스(CPU, 메모리)만 충분하면 OK

node  를 양동이 pod 를 액체이라고 가정하자. 각 양동이가 3개 있을 때 양동이 종류는 다르다. 각 양동이가 그림과 같이 있을 때

 

쿠버네티스는 각 양동이의 가격도 모르고 양동이에 허용 가능한 액체 용량이 담기는지도 모른다. 또한 어느 곳에 놓아야 어떤 액체를 더 효율적으로 관리할 수 있는지도 모른다. 임의적으로 쿠버네티스가 양동이에 물을 배분할 때 낭비가 발생할 수 있다.

 

더 구체적인 문제 예시가 아래와 같이 있다.

웹 서버가 GPU 노드에 배치됨 → GPU 낭비
AI 학습이 일반 노드에 배치됨 → 실행 안 됨
DB가 일반 디스크 노드에 배치됨 → 성능 나쁨
개발자의 테스트 Pod이 프로덕션 노드에 배치 → 리소스 경쟁
결제 시스템이 개발 노드에 배치 → 성능 보장 못함

 

이럴 때 taint 가 필요하다.

 

taint 의 뜻은 오염이다. 

 

node A, node B, node C, node D

 A40 pod 에 hydrochloric-acid 라는 taint 를 주었다고 가정하자. 현재 node 4개가 있을 때 그 어떤 node 들도 이 오염 물질을 견딜 수 없다.(intolerate) 따라서 어떤 노드들도 A40에 배치할 수 없다. 그래서 이 노드에 원치 않는 파드들을 배치하지 않았으므로 문제가 해결 될 수 있다.

 그치만 node D 만을 A40에 배치하고 싶다. 이런 경우 toleration에 node D 를 추가하면 된다. 그러면 node D는 A40에 '내성' 이 생긴 것이다. 

 

그럼 이것을 어떻게 할 수 있을까?

 

kubectl taint node node-d material=hydrochloric-acid:NoSchedule

 

kubectl taint nodes [node-name] [key]=[value]:[taint-effect]

 

이런식으로 돌아간다.

taint-effect 에는 3가지 종류가 있는데 어떤식으로 taint 가 pod 스케쥴링에 어떤 효과를 미치는지 설명해보자 한다.

 

1. NoSchedule (스케줄 금지)

  • 가장 강력한 제한
  • 효과: 이 taint가 있는 노드에는 해당 toleration이 없는 Pod은 절대 스케줄링되지 않음
  • 기존 Pod: 이미 실행 중인 Pod에는 영향 없음
  • 사용 사례:
    • 전용 노드 (GPU 노드, 고성능 스토리지 노드 등)
    • 특정 팀/프로젝트 전용 노드
    • 테스트/스테이징 전용 노드
# GPU 노드를 GPU 전용으로 사용
kubectl taint nodes gpu-node1 hardware=gpu:NoSchedule

 

 

2. PreferNoSchedule (선호적 스케줄 금지)

  • 유연한 제한
  • 효과: 스케줄러가 가능하면 피하려고 하지만, 다른 노드가 없으면 스케줄링 허용
  • 기존 Pod: 이미 실행 중인 Pod에는 영향 없음
  • 사용 사례:
    • 선호하지 않는 노드 (예: 오래된 하드웨어, 특정 AZ)
    • 점진적인 마이그레이션
    • "가능하면 피해주세요" 정도의 제약
# 오래된 하드웨어 노드를 선호하지 않음
kubectl taint nodes old-node1 hardware=old:PreferNoSchedule

 

3. NoExecute (실행 금지)

  • 가장 공격적 효과
  • 효과:
    1. 새로운 Pod: toleration이 없는 Pod은 스케줄링되지 않음
    2. 기존 Pod: 이미 실행 중인 Pod이라도 toleration이 없으면 즉시 축출(evict)됨
  • 옵션: tolerationSeconds로 축출 지연 시간 설정 가능
  • 사용 사례:
    • 노드 유지보수 (drain 작업)
    • 노드 장애 시 자동 이동
    • 리소스 부족 시 Pod 정리
    • 스팟 인스턴스 사용 시
# 노드 유지보수를 위한 drain
kubectl taint nodes node-1 maintenance=true:NoExecute

# Pod이 300초(5분) 동안만 버티도록 설정
tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 300

 

결론: 왜 taint 는 필요한가?

 

Taint는 "노드의 속성과 상태를 선언하고, 그에 맞는 Pod만 수용하도록 제어"하는 도구이다.

  1. 노드의 특수성 표현: "나는 GPU가 있다", "나는 개발용이다", "나는 유지보수 중이다"
  2. 자동 제어: 특성에 맞지 않는 Pod은 자동으로 배제
  3. 운영 효율성: 노드 상태 변경 시 일괄 적용 가능
  4. 안정성 보장: 중요한 워크로드를 적절한 노드에 보장

간단히 말하면: "모든 노드가 만능인 척 하지 말고, 각자의 특색을 가지고 거기에 맞는 일만 하자!"

Taint/Toleration은 쿠버네티스가 단순한 스케줄러를 넘어서, 실제 비즈니스 요구사항과 하드웨어 제약을 반영할 수 있게 해주는 중요한 메커니즘이다.

'K8S' 카테고리의 다른 글

Docker Compose와 Kubernetes 비교  (0) 2025.11.30