쿠버네티스 클러스터를 운영하다보면, 특정 워커에는 배포가 되지 않도록 막고 싶은 경우가 생길 수 있습니다.
예를 들어, 딥러닝 어플리케이션들이 배포되는 클러스터에서 일부 워커에만 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 |
---|