ETC/Kubernetes

[Kubernetes] Taint / Toleration

seokhyun2 2021. 3. 21. 17:22

쿠버네티스 클러스터를 운영하다보면, 특정 워커에는 배포가 되지 않도록 막고 싶은 경우가 생길 수 있습니다.

예를 들어, 딥러닝 어플리케이션들이 배포되는 클러스터에서 일부 워커에만 GPU가 붙어있을 때 GPU가 필요없는 어플리케이션들은 해당 워커들에 배포가 되지 않도록 막고 싶은 경우입니다.

이럴 때 사용할 수 있는 기능이 Taint/Toleration 입니다.

Taint

Taint란 한국어로는 얼룩이라는 뜻으로, taint가 설정된 노드에는 일반적인 pod는 배포될 수 없으며 taint가 지정된 노드에는 toleration을 적용하면 배포할 수 있습니다.

 

Taint 설정 방법

Taint는 아래와 같이 설정할 수 있습니다.

>> kubectl taint node [NODE_NAME] [KEY]=[VALUE]:[EFFECT]

NODE_NAME은 원하는 노드를 지정하면 되고, KEY와 VALUE는 자유롭게 지정하면 되며 EFFECT는 3가지(NoSchedule, NoExecute, PreferNoSchedule) 중에 골라서 taint를 설정하면 됩니다.

- NoSchedule : toleration이 완전히 일치하는 pod만 배포할 수 있음
- NoExecute : 새로운 pod만 영향을 끼치는게 아니라, 기존에 돌고 있던 pod도 evict하고(다른 node로 옮김), 새 pod도 못 들어 오게 함(NoSchedule + 기존 pod에도 적용)
- PreferNoSchedule : NoSchedule의 소프트한 버전으로 가급적 배포하지 않지만 리소스가 부족할 경우엔 배포될 수 있음

 

각 worker는 node로 간주되므로, 원하는 worker에 대해서 taint를 지정하면 되며, 전체 노드 리스트를 보는 명령어는 아래와 같습니다. 

>> kubectl get nodes

 

아래는 taint를 지정한 예시입니다.

>> kubectl taint node worker-01 type=gpu:NoSchedule

 

여기서, taint가 지정되었는지 확인하는 방법은 다음과 같습니다.

>> kubectl get nodes [NODE_NAME] -o yaml

 

toleration

toleration은 한국어로 관용이라는 뜻으로, taint가 적용된 노드에 배포할 수 있습니다.

 

toleration 설정 방법

toleration은 taint 적용 시에 활용했던 [KEY], [VALUE], [EFFECT]를 활용하여 pod의 spec에 아래와 같이 추가하면 됩니다.

tolerations:
  - key: [KEY]
    operator: Equal
    value: [VALUE]
    effect: [EFFECT]

 

위의 예시에서 worker-01 노드에 [KEY]는 type, [VALUE]는 gpu, [EFFECT]는 NoSchedule로 taint를 설정했기 때문에, worker-01 노드에 배포하고 싶은 어플리케이션은 pod에 동일하게 작성하여 toleration을 설정하면 됩니다.

 

여기서 toleration 적용하면 taint 노드에 배포를 수는 있지만, taint 노드에만 스케쥴링이 되는 것은 아닙니다. 만약taint 노드에만 배포되도록 하고 싶으면 추가적으로 node affinity 활용하면 완전히 독립적으로 운영할 있습니다.

'ETC > Kubernetes' 카테고리의 다른 글

[Kubernetes] Delete pod forcefully, 파드 강제로 삭제하기  (0) 2021.08.21