taint라는 개념을 봤는데 정확히 어디 쓰이는지 모르는 개념이었다. 이를 오늘 알아보고 활용하고자 한다.
개념
여러 곳에서 taint의 원래 뜻을 알아보고 그에 대한 toleration 개념을 알려주는데 오히려 헷갈려서 개념을 쌓는데 더 오래 걸렸다. 한마디로 둘의 개념은 이거다.
- taint : 제한 걸어주기
- toleration : 제한 풀어주기
이 말로 설명하는 게 제일 간단한 듯하다.
pod에는 각각의 할당되어지는 노드들이 존재한다. 이 노드들의 가지고 있는 성능에 따라 돌리고 싶은 노드들이 존재하기에 이 때문에 제약을 걸어두는 것이다.
taint & tolerations 알아보기
우선 제한을 걸어두는 taint에 대해서 알아보자면 세 가지의 옵션이 존재한다.
- NoSchedule : taint에 대한 key,value값을 지정하면 pod가 스케줄되지 않는다. 기존에 실행되던 pod에는 적용이 되지 않는다.
- PreferNoSchedule : taint에 대한 key,value값을 지정하면 pod가 스케줄되지 않는다. 기존에 실행되던 pod에는 적용이 되지 않는다.
- 다만 따라서 Cluster 내의 자원이 부족하거나 특정 상황에 따라서는 Taint 설정된 Node에 Pod이 배포될 수 있다.
- NoExecute : toleration이 없으면 pod이 스케줄되지 않으며 기존에 실행되던 pod도 toleration이 없으면 종료시킨다.
kubectl taint node {nodename} {key}={value}:{option}
untaint 적용하기
kubectl taint node {nodename} {key}={value}:{option}-
taint가 적용된 것을 없애려면 이는 마지막에 -옵션만 주면 된다.
tolerations 걸어주기
spec:
tolerations
yaml에 toleraions 옵션만 넣어주면 해당 taint가 적용되지 않는다.
taint 걸어주기
1) taint를 적용하기
taint를 적용하기 위해 위에서 작성한대로 쓰면 taint가 적용이 된다.
2) taint 적용한 노드 확인하기
마스터 노드에 taint가 적용되었는지 확인한다. 기본적으로 마스터노드에서는 NoSchedule이라는 taint가 기본적으로 존재한다. 그리고 내가 적용한 key1=value1:NoSchedule가 있는 것을 확인할 수 있다.
status가 containerCreating이 계속되거나, status가 pending이라면 할당되지 않은 것이다. 이는 위의 마스터 노드에 pod를 할당할 수 없게 만든 taint가 있기에 노드가 할당되지 않은 것이다.
3) tolerations 걸기
위에서 taint를 걸어주었는데, master node의 기본적인 taint때문에 필요가 없게 되었다. 그래서 이를 tolerations를 사용하여 제한을 풀어주고자 한다.
위와 같이 파일에 tolerations옵션만 작성하면 아래의 taint가 적용이 되지 않는다.
4) taint yaml 파일 적용하기
tolerations을 작성한 파일을 적용해준다. 그리고 마스터 노드의 기본적으로 걸려있는 taint를 untaint해준다.
untaint가 된다.
4) 적용되었는지 확인하기
runing이 되고 node에 제대로 마스터 노드가 할당된 것을 확인할 수 있다.