Kubernetes Taint와 Toleration 쉽게 이해하기

2–3분

Kubernetes를 운영하다 보면 파드를 특정 노드에 배치하거나, 특정 노드에서만 실행되도록 제어해야 할 때가 있습니다. 이럴 때 Taint와 Toleration이라는 기능을 활용하면 원하는 대로 노드와 파드를 매칭할 수 있습니다. 이번 글에서는 Taint와 Toleration의 개념부터 실전 사용 방법까지, 쉽게 이해할 수 있도록 설명 드리겠습니다.


Taint와 Toleration, 이게 뭘까?

  • Taint: 말 그대로 노드에 “lable”을 붙이는 겁니다. 특정 파드가 아무나 들어오지 못하게 막는 일종의 “배제 규칙”이라고 볼 수 있어요.
    • 예시:이렇게 하면 톨러레이션(Toleration)을 가지고 있는 파드만 이 노드에서 실행될 수 있습니다.
kubectl taint nodes <노드이름> key=value:NoSchedule
  • Toleration: 테인트를 뚫고 들어올 수 있는 “통행권”이라고 보시면 됩니다. 파드에 톨러레이션을 설정해두면 특정 노드의 테인트를 무시하고 배치될 수 있어요.
tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"


Taint의 효과는 무엇인가

  1. NoSchedule: 톨러레이션이 없는 파드는 절대 이 노드에 스케줄링되지 않습니다.
  2. PreferNoSchedule: 톨러레이션이 없는 파드는 가능하면 이 노드에 안 가려고 하지만, 다른 선택지가 없으면 스케줄링됩니다.
  3. NoExecute: 톨러레이션이 없는 파드는 이미 실행 중이라도 강제로 퇴출됩니다.

Taint와 Toleration이 필요한 상황

  1. 특정 워크로드를 전용 노드에서 실행하고 싶을 때 데이터베이스나 백그라운드 작업 같은 민감한 작업은 전용 노드에서 실행하는 것이 좋습니다. 이럴 때 테인트를 활용하면 다른 파드들이 그 노드로 들어오는 것을 막을 수 있죠. 그리고 데이터베이스 파드에는 톨러레이션을 추가해서 배치하면 됩니다.
kubectl taint nodes node1 dedicated=database:NoSchedule

  1. 마스터 노드 보호하기 일반적으로 Kubernetes의 마스터 노드는 워크로드가 실행되지 않도록 테인트가 기본적으로 설정되어 있습니다. 시스템 중요 파드만 마스터 노드에서 실행되도록 하고 싶다면 이렇게 톨러레이션을 추가하면 됩니다:
tolerations:
- key: "node-role.kubernetes.io/master"
  operator: "Exists"
  effect: "NoSchedule"
  1. 노드 제거 시 파드 안전하게 이동시키기 특정 노드를 비우거나 제거할 때 NoExecute 효과를 사용하면, 해당 노드에 있는 파드들이 점차적으로 퇴출됩니다. 필요하면 tolerationSeconds 옵션을 사용해 유예 시간을 줄 수도 있어요.

NodeSelector와 Taint의 차이점은?

많이들 헷갈리시는 부분인데, NodeSelector는 특정 파드가 특정 노드에 배치되도록 유도하는 “선호 규칙”입니다.

반면, Taint는 해당 노드에 파드가 들어오지 못하도록 적극적으로 막는 “배제 규칙”이에요.

따라서, Taint와 Toleration은 워크로드를 엄격히 격리해야 할 때 적합합니다.


실전 예제: Istio 전용 노드 구성하기

Istio 같은 네트워크 워크로드를 특정 노드에서만 실행하려면 다음과 같이 설정할 수 있습니다:

node에 taint 추가

kubectl taint nodes <노드이름> istio=true:NoSchedule

파드에 톨러레이션과 NodeSelector 추가

apiVersion: v1
kind: Pod
metadata:
  name: istio-pod
spec:
  tolerations:
  - key: "istio"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"
  nodeSelector:
    istio: "true"
  containers:
  - name: app-container
    image: istio/example-app

이렇게 하면 istio=true 테인트가 설정된 노드에서만 해당 파드가 실행됩니다.


Taint와 Toleration 사용할 때 팁

  1. 너무 많은 테인트는 금물 테인트를 너무 많이 사용하면 톨러레이션이 없는 파드가 스케줄링되지 못해 혼란이 생길 수 있습니다. 꼭 필요한 곳에만 적용하세요.
  2. Node Affinity와 병행 사용 Taint와 Toleration은 노드 격리에 강력하지만, 필요에 따라 Node Affinity 같은 규칙을 함께 사용하면 더 세밀하게 제어할 수 있습니다.

마무리

Taint와 Toleration은 Kubernetes에서 파드 스케줄링을 세밀하게 제어할 수 있는 강력한 도구입니다. 올바르게 사용하면 클러스터 운영의 안정성과 효율성을 크게 높일 수 있어요.

이제 여러분도 Taint와 Toleration을 활용해 원하는 워크로드를 깔끔하게 격리하고 관리해보세요! Kubernetes 운영이 훨씬 쉬워질 겁니다. 😊