Node Taints & Tolerations | ROAD TO CKA ☸️
쿠버네티스에서 특정 노드에 아무 파드나 배치되지 않도록 “출입 제한”을 걸어야 할 때가 있습니다. 이때 사용되는 핵심 메커니즘이 바로 Taint(테인트)와 Toleration(톨러레이션)입니다.
이 두 가지의 관계는 직관적인 비유를 통해 쉽게 이해할 수 있습니다. 바로 ‘사람(Node)과 벌레 기피제(Taint)’의 관계입니다.
1. 직관적 비유: 벌레 기피제와 내성
아래 그림은 Taint와 Toleration이 작동하는 방식을 보여줍니다.

- 상황 1 (왼쪽): 사람이 몸에 강력한 벌레 기피제(Taint)를 뿌렸습니다. 일반적인 벌레(Pod A)는 이 기피제 냄새를 견딜 수 없어 사람에게 접근하지 못하고 튕겨 나갑니다.
- 상황 2 (오른쪽): 똑같이 기피제를 뿌렸지만, 이번에는 이 기피제 성분에 대한 내성(Toleration)을 가진 특수한 벌레(Pod B)가 나타났습니다. 이 벌레는 기피제의 영향을 받지 않고 문제없이 사람에게 다가갈 수 있습니다.
2. 기술적 해석: 노드 접근 제어
이 비유를 쿠버네티스 아키텍처에 대입해 보겠습니다.
- 사람 = 노드 (
Node): 파드가 스케줄링 되어야 할 대상 서버입니다. - 기피제 뿌리기 =
Taint설정: “이 노드에는 아무나 오지 마라”는 표식을 노드에 설정하는 행위입니다. Taint가 설정된 노드는 기본적으로 파드의 스케줄링을 거부합니다. - 벌레의 내성 =
Pod의Toleration: 파드 정의(YAML)에 “나는 특정 Taint를 견딜 수 있다”고 명시하는 것입니다.
즉, Taint와 Toleration은 “노드가 파드를 능동적으로 거부”할 수 있게 만드는 기능입니다.
- Taint(얼룩/오염): 노드에 설정합니다. “이 표식이 있는 노드에는 함부로 스케줄링하지 마시오”라는 출입 금지 팻말과 같습니다.
- Toleration(관용/내성): 파드에 설정합니다. “나는 이 Taint 팻말이 있어도 들어갈 수 있는 출입증이 있습니다”라는 의미입니다.
3. 노드의 파드 스케쥴링 제어 (taint, toleration)

예를 들어, 4개의 파드(Pod A, B, C, D)를 배포해야 하는 상황입니다.
- Node 3: 이 노드에는
Taint(출입 제한)가 걸려 있어서, 허가받지 않은 파드는 들어올 수 없습니다. - Pod A: 유일하게
Toleration(입장권)을 가지고 있어 Node 3에 정상적으로 배치됩니다. - Pod B, C, D: 입장권이 없기 때문에 Node 3에는 진입하지 못하고, 제한이 없는 일반 노드인 Node 1과 Node 2로 나뉘어 배치됩니다.
Taints(노드)와 Tolerations(파드) 설정

taints – Node
💻 명령어 구성:
bashkubectl taint node <노드이름> <Key>=<Value>:<Taint-Effect>
- Key=Value: 테인트 자체를 식별하는 꼬리표입니다. 특정 애플리케이션 전용 노드임을 표시하는 데 사용할 수 있습니다. (예:
app=blue) - Taint-Effect: 테인트를 견디지 못하는(Toleration이 없는) 파드에게 어떤 조치를 취할지 정의합니다.
NoSchedule: 새로운 파드가 스케줄링되지 못하게 막습니다. (가장 일반적)PreferNoSchedule: 최대한 스케줄링을 피하려고 노력하지만, 자원이 없으면 배치될 수도 있습니다.NoExecute: 새로운 파드를 막는 것은 물론, 기존에 실행 중이던 파드도 쫓아냅니다.
| Effect | 새로운 파드 배치? | 기존 파드 유지? | 비유 |
|---|---|---|---|
| NoSchedule | ❌ 불가 | ✅ 유지 | “입장 금지” |
| PreferNoSchedule | 🔺 가능하면 피함 | ✅ 유지 | “배려석” |
| NoExecute | ❌ 불가 | ❌ 추방 (Evict) | “강제 퇴거” |
💡 중요 체크 포인트 Taint가 있는 노드에 Toleration을 가진 파드가 반드시 스케줄링된다는 보장은 없습니다.
Taint/Toleration은 자격이 없는 파드를 ‘제한’하는 용도이지, 특정 노드에 파드를 ‘강제 할당’하는 기능이 아님을 명심해야 합니다.
Tolerations – PODs
Toleration은 파드(Pod)에 설정하는 속성으로, 노드에 걸린 Taint를 무시하고 들어갈 수 있는 “출입증”과 같습니다. 노드에 설정된 Taint의 Key, Value, Effect와 일치하는 정보를 파드의 YAML에 적어줘야 합니다.
💻 예시 (app=blue:NoSchedule 테인트 통과하기):
yamlapiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- image: nginx
name: nginx
tolerations: # 여기에 출입증 정보를 입력합니다.
- key: "app"
value: "blue"
operator: "Equal"
effect: "NoSchedule"
📝 [실습] Taint 적용과 Toleration, 그리고 해제
1. 노드 상태 및 Taint 확인
현재 클러스터 노드 확인 및 특정 노드(node01)의 Taint 여부를 점검합니다.
bash# 1. 노드 목록 확인
kubectl get nodes
# NAME STATUS ROLES AGE
# controlplane Ready control-plane 10m
# node01 Ready <none> 9m
# 2. node01의 Taint 확인
kubectl describe node node01 | grep Taints
# Taints: <none> (오염 없음)
2. Taint 설정 (Node 제한)
node01에 벌레 기피제(spray=mortein)를 뿌려 아무 파드나 오지 못하게 막습니다.
bash# 형식: kubectl taint node [노드명] [Key]=[Value]:[Effect]
kubectl taint node node01 spray=mortein:NoSchedule
# 적용 확인
kubectl describe node node01 | grep Taints
# Taints: spray=mortein:NoSchedule
3. 일반 Pod 생성 및 실패 (Pending)
Toleration(내성)이 없는 일반 파드(mosquito)를 생성하여 스케줄링 상태를 확인합니다.
bash# 파드 생성
kubectl run mosquito --image=nginx
bash# 상태 확인
kubectl get pods
# NAME READY STATUS RESTARTS
# mosquito 0/1 Pending 0 <-- 배치되지 못함
bash# 원인 분석
kubectl describe pod mosquito
# Warning FailedScheduling:
# 0/2 nodes are available:
# 1 node(s) had untolerated taint {node-role...control-plane},
# 1 node(s) had untolerated taint {spray: mortein}.
결과: 갈 곳이 없어 Pending 상태 유지.
4. Toleration 적용 Pod 생성 (성공)
이번에는 Taint를 견딜 수 있는 Toleration을 설정한 파드(bee)를 생성합니다.
bash# YAML 파일 생성
kubectl run bee --image=nginx --dry-run=client -o yaml > bee.yaml
vi bee.yaml 수정:
yamlapiVersion: v1
kind: Pod
metadata:
name: bee
spec:
containers:
- image: nginx
name: bee
tolerations: # Taint와 일치하는 내성 추가
- key: "spray"
value: "mortein"
effect: "NoSchedule"
operator: "Equal"
bashkubectl apply -f bee.yaml
kubectl get pods
# NAME READY STATUS RESTARTS
# bee 1/1 Running 0 <-- 정상 스케줄링 됨
5. ControlPlane Taint 확인 및 제거
마스터 노드(controlplane)에 기본적으로 걸려 있는 Taint를 확인하고 제거해 봅니다.
bash# ControlPlane Taint 확인
kubectl describe node controlplane | grep Taints
# Taints: node-role.kubernetes.io/control-plane:NoSchedule
bash# Taint 제거 (명령어 끝에 '-' 붙이기)
kubectl taint nodes controlplane node-role.kubernetes.io/control-plane:NoSchedule-
# node/controlplane untainted
bash# 제거 확인
kubectl describe node controlplane | grep Taints
# Taints: <none>
Tip: Taint 삭제 문법 설정할 때 썼던 명령어 맨 뒤에 마이너스(-)만 붙이면 해당 Taint가 삭제됩니다.
- 특정 키 삭제:
kubectl taint nodes foo dedicated- - 전체 삭제:
kubectl taint nodes foo key=value:NoSchedule-