Kubernetes Taint & Toleration
[Kubernetes Scheduler 관련 글 목록]
Kubernetes Scheduler (Pod를 원하는 Worker Node에 배포하기)
Kubernetes Scheduler (nodeSelector)
Kubernetes Scheduler (Taint & Toleration)
Kubernetes Scheduler (Affinity)
Kube-Scheduler의 다양한 기능을 사용해서 관리자가 직접
특정 Worker Node에 Pod 가 생성되도록 설정할 수 도 있음
대표적으로
nodeSelector
Taint & Toleration
Affinity
3가지 방법이 있는데
이 글에서는Taint & Toleration에 대해서 알아보겠음.
[환경]
Master Node server
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
api verison : 1.26
Worker Node server 1
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
api verison : 1.26
Worker Node server 2
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
api verison : 1.26
Kubernetes version
1.18
Taint & Toleration이란?
특정 Worker Node에 Pod가 배치되지 않기를 원하면 Taint를 적용하고
Taint가 적용된 Worker Node에 Pod를 배치하기를 원한다면 Pod에 Taint에 맞는 Toleration을 적용해야함.
Taint
Node에 정의.
특정 Worker Node에 Pod를 배치하지 않기를 원한다면 Taint를 적용.
즉 Taint가 설정되어있는 Worker Node에는 Pod가 배포되지 않음.
Toleration
Pod에 정의.
Taint 처리가 되어 있는 Worker Node에는
Taint에 맞는 Toleration을 가지고 있는 Pod만 배포될 수 있음.
일종의 티켓 같은 개념.
( 참고 )
“배포된다"가 아니라, “배포될 수 있다" 라는 의미.
그 Node가 아니라 다른 조건에 맞는 Node가 있다면, 배포될 수 있음.
예로 들자면 Taint 설정이 되어있는 Worker Node One 이 있고
Taint 설정이 안되어있는 Worker Node Two 가 있으면
Toleration 설정이 된 Pod 는 Worker Node One, Two 모두에 랜덤으로 생성될 수 있고,
Toleration 설정이 안된 Pod 는 Worker Node Two에만 생성이 가능함.
해당 기능을 잘 활용하면 GPU와 같은 특수 하드웨어를 가진 노드를 별도로 관리할 수 있다.
Taint Effect
NoSchedule
Taint 설정 중 Effect 로 NoSchedule이 설정된 Worker Node에는
Pod가 배포되지 못하고 Toleration이 일치할 경우에만 배포.
기존에 실행되고 있었던 Pod에는 적용되지 않고,
새롭게 배포되는 Pod에만 적용됨.
하지만 Pod가 Update되서 재생성된다면 NoSchedule이 적용되서
새로운 Pod 배포되지 않음.
NoExecute
기존에 실행되고있던 Pod에도 영향을 주는 설정.
Taint 설정 중 Effect 로 NoExcute이 설정된 Worker Node에
Taint에 맞는 Toleration을 가지고 있는 Pod가 동작하고 있었다면
그대로 동작하게 해주지만
만약 Taint에 맞지 않는 Toleration을 가지고 있는 Pod 이거나
Toleration을 가지고 있지 않는 Pod라면
Worker Node에서 삭제됨.
만약 삭제된 Pod 가 Deployment나 Replicaset 설정이 되어있는 Pod라면
다른 배포가능한 Worker Node에 다시 배포됨.
새로 배포되는 Pod도 Toleration이 일치할 경우에만 배포되고
일치하지 않는다면 배포되지 못함.
NoExecute Effect가 적용되어 특정 Pod가 다른 Worker Node 로 옮겨야할 경우
tolerationSeconds파라미터가 선언되어 있다면
선언된 파라미터의 시간만큼 남아 있다가 다른 Worker Node 로 이동함.
PreferNoSchedule
Taint 설정 중 Effect 로 PreferNoSchedule이 설정된 Worker Node에는
NoSchedule Effect와 동일하게
Pod가 배포되지 못하고 Toleration이 일치할 경우에만 배포하지만.
Prefer라는 뜻의 단어가 붙은 그대로
NoSchedule 보다는 자비로운 설정임.
모든 Worker Node가 리소스가 부족해서 어떠한 Worker Node에서도
Pod가 배포될 수 없는 상황이라면
우선순위를 낮추어서 Toleration이 없는 Pod라도 배포가 되도록 함.
Taint & Toleration 실습
1. 특정 Worker Node에 Taint 설정
[ 명령어 ]
kubectl taint nodes [Worker Node Name] [Key]=[ Value ]:[ Taint Effect ]
예) kubectl taint nodes kube.workerone.node testkey=iksoonvalue:NoSchedule
참고) 아래와 같이 한번에 다수의 Taint를 설정할 수도 있음
kubectl taint nodes [Worker Node Name] [Key]=[ Value ]:[ Taint Effect ] [Key]=[ Value ]:[ Taint Effect ]
이제 kube.workerone.node 에는
testkey=iksoonvalue:NoSchedule 로 Toleration 설정이 적용된 Pod만 배치가 됨.
2. Worker Node Taint 적용 확인
[ 명령어 ]
kubectl get nodes [Worker Node Name] -o yaml
예) kubectl get nodes kube.workerone.node -o yaml
3. Toleration 적용이 안된 Pod 배포 확인
[예제 no_Toleration_deployment.yaml ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment-test labels: app: iksoon-test spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.6 ports: - containerPort: 8080 |
[ 결과 ]
Pod가 Taint 설정된 worker node one에는 생성이 안되고
무조건 worker node two에만 생성이 됨
강제로 nodeSelector 설정으로 Taint 설정이 된 kube.workerone.node 로 지정했을 경우.
[예제 no_Toleration_deployment.yaml ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment-test labels: app: iksoon-test spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.6 ports: - containerPort: 8080 nodeSelector: # Worker Node One에 강제로 배치되도록 nodeSelector를 사용 kubernetes.io/hostname: kube.workerone.node |
[ 결과 ]
Pending 상태로 Pod가 생성되지 않음.
describe 로 확인 시
Node One 에는
Taint {testkey: iksoonvalue} 설정이 되어있는데
배치 될려고 하는 Pod는 Toleration이 없어서 배치가 안된다고 하고
Node Two 에는
nodeSelector가 매치가 안되서 생성이 안됨.
4. Toleration 적용이 된 Pod 배포 확인
[예제 toleration_deployment.yaml ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment-test labels: app: iksoon-test spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.6 ports: - containerPort: 8080 tolerations: - key: testkey value: iksoonvalue effect: NoSchedule operator: Equal |
[ 결과 ]
Pod가 Taint 설정된 worker node one에는 생성이 됨
worker node two에도 생성이 가능해서 Worker Node one, two 중 랜덤으로 생성이 됨
다양한 Toleration 설정 방법
key, value, effect 3개가 모두 일치하는
Taint 설정된 Worker Node 에 배포될 수 있는 toleration 설정.
tolerations: - key: testkey value: iksoonvalue effect: NoSchedule operator: Equal |
key, effect가 일치하는
Taint 설정된 Worker Node 에 배포될 수 있는 toleration 설정.
value 값은 일치되지 않더라도 배포될 수 있음
tolerations: - key: testkey effect: NoSchedule operator: Exists |
key가 일치하는
Taint 설정된 Worker Node 에 배포될 수 있는 toleration 설정.
value, effect 값은 일치되지 않더라도 배포될 수 있음
tolerations: - key: testkey operator: Exists |
5. Taint 제거.
특정 Worker Node에 Taint 제거.
[ 명령어 ]
kubectl taint nodes [Worker Node Name] [Key]:[ Taint Effect ]-
예) kubectl taint nodes kube.workerone.node testkey:NoSchedule-
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
[Taint, Toleration]
https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
https://bcho.tistory.com/1344?category=731548
'Kubernetes > Scheduler' 카테고리의 다른 글
kubernetes PriorityClass ( Priority & Preemption ) (0) | 2020.10.11 |
---|---|
Kubernetes Scheduler (Affinity) (0) | 2020.10.11 |
Kubernetes Scheduler (nodeSelector) (0) | 2020.10.11 |
Kubernetes Scheduler (Pod를 원하는 Worker Node에 배포하기) (0) | 2020.10.11 |