TECH

Node Taints & Tolerations | ROAD TO CKA ☸️

minoooo1119
2026년 2월 5일
3

쿠버네티스에서 특정 노드에 아무 파드나 배치되지 않도록 “출입 제한”을 걸어야 할 때가 있습니다. 이때 사용되는 핵심 메커니즘이 바로 Taint(테인트)와 Toleration(톨러레이션)입니다.

이 두 가지의 관계는 직관적인 비유를 통해 쉽게 이해할 수 있습니다. 바로 ‘사람(Node)과 벌레 기피제(Taint)’의 관계입니다.

1. 직관적 비유: 벌레 기피제와 내성

아래 그림은 Taint와 Toleration이 작동하는 방식을 보여줍니다.

  • 상황 1 (왼쪽): 사람이 몸에 강력한 벌레 기피제(Taint)를 뿌렸습니다. 일반적인 벌레(Pod A)는 이 기피제 냄새를 견딜 수 없어 사람에게 접근하지 못하고 튕겨 나갑니다.
  • 상황 2 (오른쪽): 똑같이 기피제를 뿌렸지만, 이번에는 이 기피제 성분에 대한 내성(Toleration)을 가진 특수한 벌레(Pod B)가 나타났습니다. 이 벌레는 기피제의 영향을 받지 않고 문제없이 사람에게 다가갈 수 있습니다.

2. 기술적 해석: 노드 접근 제어

이 비유를 쿠버네티스 아키텍처에 대입해 보겠습니다.

  • 사람 = 노드 (Node): 파드가 스케줄링 되어야 할 대상 서버입니다.
  • 기피제 뿌리기 = Taint 설정: “이 노드에는 아무나 오지 마라”는 표식을 노드에 설정하는 행위입니다. Taint가 설정된 노드는 기본적으로 파드의 스케줄링을 거부합니다.
  • 벌레의 내성 = PodToleration: 파드 정의(YAML)에 “나는 특정 Taint를 견딜 수 있다”고 명시하는 것입니다.

즉, Taint와 Toleration은 “노드가 파드를 능동적으로 거부”할 수 있게 만드는 기능입니다.

  1. Taint(얼룩/오염): 노드에 설정합니다. “이 표식이 있는 노드에는 함부로 스케줄링하지 마시오”라는 출입 금지 팻말과 같습니다.
  2. 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

💻 명령어 구성:

bash
kubectl 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 테인트 통과하기):

yaml
apiVersion: 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 수정:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: bee
spec:
  containers:
  - image: nginx
    name: bee
  tolerations:       # Taint와 일치하는 내성 추가
  - key: "spray"
    value: "mortein"
    effect: "NoSchedule"
    operator: "Equal"
bash
kubectl 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-

'TECH' 카테고리의 다른 글

💬 댓글 (0)

댓글을 불러오는 중...