Kubernetes - taint와 toleration

brillog·2023년 8월 13일
0

Kubernetes

목록 보기
3/11

관리자는 Pod를 배치하고 싶지 않은 노드에 taint를 설정합니다. taint는 '오염', '얼룩'이라는 뜻이기 때문에 직관적으로 생각해 보면 Pod를 띄우고 싶지 않은 노드를 오염시켜 오염된 노드에는 Pod가 뜨지 않도록 하는 것이라고 이해할 수 있습니다.

toleration은 '허용', '용인'이라는 뜻으로, taint가 부여된 노드도 toleration(허용)된 Pod는 띄웁니다. 즉 taint되어 아무 Pod도 뜨지 않는 노드에서도 toleration(허용)된 Pod는 생성될 수 있습니다.

따라서 taint/toleration은 지정하지 않는 한 노드에 스케줄링되지 않으며, 조건에 맞지 않는 Pod는 그 노드에서 축출될 수도 있습니다.

taint='오염' → Node에 적용
toleratoin='허용' → Pod에 적용

taint

taint는 세 가지 파라미터를 사용한 Key=Value:Effect 형식으로 구성되며 Effect는 taint와 toleration이 일치하지 않을 경우의 동작입니다. 총 3종류가 있으며 PreferNoSchedule ▶ NoSchedule ▶ NoExecute 순서로 조건이 엄격해집니다.

Taint Effect

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

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"

Reference

개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.

profile
Cloud & DevOps ♡

0개의 댓글