Taints and Tolerance

  • 특정 노드에 파드의 무작위 스케줄링을 제한하고, 특정 유형의 파드의 스케줄링만 허용할 때 사용되는 설정
  • 노드를 taint (오염) 시켜서 파드가 접근하지 못 하게 한 후, 노드에 적용된 taint에 대한 tolerance(내성) 을 가진 파드만 스케줄링 된다는 개념

Node에 Taint 적용하기

kubectl taint nodes <node-name> <key>=<value>:<taint-effect>

예시)

# node1에 taint 적용
kubectl taint nodes node1 app=blue:NoSchedule

# taint 제거
kubectl taint nodes node1 app=blue:NoSchedule-  

taint-effect 의 유형

  • NoSchedule - 포드가 스케쥴되지 않음
  • PreferNoSchedule - 해당 노드는 피하지만 보장된 것은 아님
  • NoExecute - 파드가 스케쥴되지 않으며, 현재 존재하는 파드도 tolerant가 없다면 제외함.

Pod에 Tolerance 적용하기

# ex) pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
	name: sleeper
	
spec:
	container: 
		- name: ubuntu
			image: ubuntu
			
	tolerations:  

        # key와 value가 모두 명시된 경우 
		- key: "app"
		   value: "blue"
           operator: "Equal"  # value와 매치 될 수 있도록 "Equal" operator 사용
		   effect: "NoSchedule"

        # value가 주어지지 않은 경우
		- key: "app"
           operator: "Exists"  # 해당 key를 가진 노드에 대해 toleration을 가짐
		   effect: "NoSchedule"
  • key 가 비워져있고, operator 가 Exists 인 경우 → 모든 노드에 대해 toleration을 가짐
  • effect가 비워져있을 경우 → Node taint 로 설정된 effect를 따라감

NOTE

Taint & Tolerance

  • 특정 Pod 외 다른 Pod 의 스케줄링을 제한하기 위한 설정.
  • 특정 Pod 가 해당 노드에 바로 스케줄링 되도록 하는 설정이 아님. (오해하기 쉬움)
  • 따라서 Tolerance를 적용한 Pod라고 해도, kube-scheduler가 다른 노드에 스케줄링 할 수도 있음.
  • 특정 파드를 특정 노드에 스케줄링 하고자 한다면 Node Affinity가 적절함.

Reference