[Kubernetes] Taint & Toleration


서론

Taint와 Toleration의 관계에 대해서 설명한다.

Taint와 Toleration는 사람과 벌레 두 요소로 예를 들면 이해하기가 쉽다.

사람은 노드에 비유하며 벌레는 파드이다.

벌레 스프레이(Taint)를 사람(Node)에게 뿌리면 벌래(Pod)는 사람(Node)에게 접근하지 못한다.

그러나 특정 벌레는 벌레 스프레이(Taint)에 내성(Tolerant)을 가지고 있는 경우도 있다.

이러한 벌레(Pod)들은사람에게 접근이 가능하다.

Taint & Toleration

  • 노드가 특정 파드를 수용하지 못하게 제한하는 용도로 사용된다.
  • 특정 노드로 파드를 보내는 기능이 아니다.
  • 노드에게 특정 toleration을 가진 파드만 수용하라고 제한하는 것이다.
  • 특정 노드에만 파드를 배치하고 싶다면 NodeAffinity라는 개념을 통해 구현된다.

Taint(벌레 스프레이)

  • 사전적 의미: 더럽히다, 오염시키다.
  • 노드에 걸어주는 속성
# kubectl taint nodes {nodeName} key=value:Effect
kubectl taint nodes node1 app=blue:Noschdule
  • Effect에는 3가지 종류가 있다.
    • NoSchedule: 새로운 파드가 특정 노드에 스케줄되지 않는다.
    • PreferNoSchedule: 시스템은 특정 노드에 파드를 배치하지 않으려 시도하지만 보장되지는 않음.
    • NoExecute: 특정 노드에 새로운 파드는 배치되지 않고, 기존에 있던 파드들도 taint를 견디지 못하면 강제로 파드가 종료됨

Tolerations(벌레)

  • 사전적 의미: 참을 수 있는 견디는, 내성이 있는
  • 파드에 걸어주는 속성
# Pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: nginx-container
    image: nginx
  
  tolerations:
  - key: "app"
    operator: "Equal"
    value: "blue"
    effect: "NoSchedule"

Taint of control plane

마스터는 기본적으로 taint로 보호된다.

  • 쿠버네티스 클러스터가 처음 설치될 때, 마스터 노드에는 자동으로 taint가 설정된다.
  • 이 설정은 필요에 따라 수정할 수도 있지만 일반적으로 마스터 노드에는 애플리케이션 파드를 배치하지 않는 것이 권장
# 아래 명령어로 테인트 확인 가능
kubectl describe node <마스터노드명> | grep Taint

Taint & Toleration VS Label & Selector

Label & Selector: ReplicaSet, Service, Deployment 등의 리소스가 어떤 Pod와 연결될지를 결정할 때 사용(그륩핑과 필터링)