관리자는 Pod를 배치하고 싶지 않은 노드에 taint를 설정합니다. taint는 '오염', '얼룩'이라는 뜻이기 때문에 직관적으로 생각해 보면 Pod를 띄우고 싶지 않은 노드를 오염시켜 오염된 노드에는 Pod가 뜨지 않도록 하는 것이라고 이해할 수 있습니다.
toleration은 '허용', '용인'이라는 뜻으로, taint가 부여된 노드도 toleration(허용)된 Pod는 띄웁니다. 즉 taint되어 아무 Pod도 뜨지 않는 노드에서도 toleration(허용)된 Pod는 생성될 수 있습니다.
따라서 taint/toleration은 지정하지 않는 한 노드에 스케줄링되지 않으며, 조건에 맞지 않는 Pod는 그 노드에서 축출될 수도 있습니다.
taint='오염' → Node에 적용
toleratoin='허용' → Pod에 적용
taint는 세 가지 파라미터를 사용한 Key=Value:Effect
형식으로 구성되며 Effect
는 taint와 toleration이 일치하지 않을 경우의 동작입니다. 총 3종류가 있으며 PreferNoSchedule ▶ NoSchedule ▶ NoExecute 순서로 조건이 엄격해집니다.
taint 명령어 사용 방법은 아래와 같습니다.
#####################
##### taint 사용 #####
#####################
# (value 파라미터가 있을 경우)
$ kubectl taint nodes <NodeName> <KeyName>=<ValueName>:<Effect>
# (value 파라미터가 없을 경우) 특정한 한 대의 노드에 taint 부여
$ kubectl taint nodes <NodeName> <KeyName>:<Effect>
# (value 파라미터가 없을 경우) 특정 label을 가진 모든 노드(linux 노드)에 taint 부여
#####################
##### taint 제거 #####
#####################
# (value 파라미터가 있을 경우) <KeyName>을 key로 하는 NoSchedule taint 삭제
$ kubectl taint nodes <NodeName> <KeyName>=<ValueName>:<Effect>-
# (value 파라미터가 없을 경우) <KeyName>을 key로 하는 NoSchedule taint 삭제
$ kubectl taint nodes <NodeName> <KeyName>:<Effect>-
# <KeyName>을 key로 하는 taint 삭제
$ kubectl taint nodes <NodeName> <KeyName>-
부여된 taint를 확인할 때는 kubectl describe 명령어를 사용하면 됩니다.
$ kubectl describe node <NodeName>
# 결과 (예시)
...
Taints: env=prd:NoSchedule
...
toleration 설정 방법은 다음과 같습니다.
# taint에 설정에 value 파라미터가 있을 경우
tolerations:
- key: "<KeyName>"
operator: "Equal"
value: "<ValueName>"
effect: "NoSchedule"
# taint에 설정에 value 파라미터가 없을 경우
tolerations:
- key: "<KeyName>"
operator: "Exists"
effect: "NoSchedule"
# 어떤 taint가 부여되든 관계없이 스케줄링하는 경우
tolerations:
- operator: "Exists"
operator는 Equal
또는 Exists
가 될 수 있으며 각각의 의미는 아래와 같습니다.
Equal
: Key와 Value가 같다.Exists
: Key가 존재한다.(예시) toleration을 지정한 Pod의 .yaml
# operator = "Exist" 또는 "Equal"
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "example-key"
operator: "Exists" # 의미: Key가 존재한다.
effect: "NoSchedule"
# 또는
tolerations:
- key: "example-key"
operator: "Equal" # 의미: Key와 Value가 같다.
value: "example-value"
effect: "NoSchedule"
개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.