🔹Kubernetes

taint와 toleration을 사용하는 이유

terranbin 2025. 2. 27. 17:59
728x90
SMALL

쿠버네티스의 API Server + Scheduler는 일반적으로 모든 Worker Node에 적절하게 Pod를 배분하지만,
어떤 경우에는 특정 노드에만 Pod를 배포해야 하거나, 특정 노드를 피해야 하는 경우가 있다.
이때 Taint(오염)Toleration(허용) 을 사용하여 스케줄링을 더 세밀하게 조정한다.


📌 taint와 toleration이 필요한 이유

1️⃣ 특정 노드에서만 특정 Pod를 실행하고 싶을 때

예: GPU가 있는 노드에서만 AI/ML 관련 Pod를 실행하고 싶음.
✅ 해결책: GPU 노드에 taint를 추가하고, GPU가 필요한 Pod만 toleration을 설정하여 해당 노드에서 실행되도록 함.

 
kubectl taint nodes gpu-node gpu=true:NoSchedule
  • 위 명령어를 사용하면 "gpu=true"라는 Taint가 설정된 노드에는 일반 Pod가 배포되지 않음.
  • 대신 GPU를 사용하는 Pod는 Toleration을 추가하여 해당 노드에서 실행되도록 설정함.

GPU 전용 Pod 설정 (Toleration 추가)

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  tolerations:
  - key: "gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"
  containers:
  - name: ai-model
    image: tensorflow/tensorflow
  • 이 설정을 하면 "gpu=true"가 있는 노드에서만 실행됨.

2️⃣ 특정 노드에서 일반 Pod 실행을 막고 싶을 때

예: Master Node에서는 일반 애플리케이션이 실행되지 않도록 설정해야 함.
✅ 해결책: Master 노드에 NoSchedule Taint를 추가하면, 일반 Pod는 해당 노드에서 실행되지 않음.

kubectl taint nodes master-node node-role.kubernetes.io/master=:NoSchedule
  • 이렇게 설정하면 일반 Worker Node에서만 Pod가 실행되고, Master Node는 Control Plane 용도로만 사용됨.

3️⃣ 특정 노드가 유지보수 중이거나 장애 발생 시 Pod 배포를 막고 싶을 때

예: 유지보수를 위해 특정 노드에서 Pod를 일시적으로 실행하지 않도록 설정해야 함.
✅ 해결책: 해당 노드에 NoSchedule Taint를 적용하면 유지보수 중인 노드로 Pod가 배포되지 않음.

kubectl taint nodes maintenance-node maintenance=true:NoSchedule
 
  • 해당 노드에 새로운 Pod가 배포되지 않으며, 기존 Pod는 정상적으로 유지됨.

📌 결론

✅ 기본적으로 쿠버네티스 Scheduler는 Worker Node에 자동으로 Pod를 배포하지만,
✅ taint와 toleration을 사용하면 특정 노드에서만 실행되도록 제한하거나, 특정 노드를 피할 수 있음.
GPU, Master Node, 유지보수 중인 노드, 고성능 서버 등에서 유용하게 사용.

👉 즉, taint와 toleration은 쿠버네티스의 기본 스케줄링을 세밀하게 조정하는 기능

LIST