CKA 실습을 하다보면, 특정 Node에는 Pod이 배포되지 않도록 요구하는 문제를 많이 볼 수 있다. 그때마다 설정하는 내용을 보면 Taint / Tolerations을 설정하여 특정 Node에 대한 사용을 제한한다.
오늘은 Taint, Tolerations에 대한 내용을 알아보자!!
k8s Node Taint이란?
Taint에 대한 사전적인 내용을 보면 "오염"으로 풀이된다. 즉, Node가 오염되었기 때문에 Pod의 Schedule을 제한한다.
보통 Taint는 특정 Node에 대해 특정 Pod만 실행할 수 있도록 역할을 제한하기 위한 목적으로 많이 사용된다.
- 예를들어) Batch Node에는 System batch pod만 Schedule되어야한다. 모든 Pod 별로 Nodename을 지정하면 문제가 없겠지만, 지정하지 않는 Pod이 발생할 수 있고 이러한 문제를 미연에 방지하고자 Batch Node에 Taint 설정을 하는것이다.
Taint 설정은 어떻게 하는것일까?
가장 간단한 기본 명령어는 아래와 같다. {}를 제외하고 Value를 입력하면 된다.
[Node Taint 기본 명령어]
kubectl taint node {nodename} {key}={value}:{option}
- nodename : Taint 설정을 할 nodename이다.
- key=value : Taint에 대한 Tolerations에 부합하는 값이다.
- option : Taint에 대한 역할 제한이다. 일반적으로 NoSchedule, PreferNoschedule, NoExecute 3가지 설정이 존재한다.
- NoSchedule : Pod를 해당 Node에 Schedule 할 수 없다. 단, 기존 실행되던 Pod에는 적용안된다.
- PreferNoschdule : Pod를 해당 Node에 Schedule 할 수 없다. 다만, NoSchedule과는 다르게 필수값이 아니다.
즉, Cluster 내의 자원이 부족하거나 특정 상황에 따라서는 Taint 설정된 Node에 Pod이 배포될 수 있다. - NoExecute : Pod에 대해 Toleration 설정이 없으면, Schedule 되지 않고 기존에 실행되던 Pod도 Delete 된다.
구분 | 역할 | Pod Schedule | 기존 Pod 영향 | 비고 |
NoSchedule | Pod no Schedule | Toleration 필수값 | 영향 없음 | - |
PreferNoschdule | Pod no Schedule | Toleration 선택적 값 | 영향 없음 | - |
NoExecute | Pod no Schedule and no Execute | Toleration 필수값 | 영향 있음 | - |
Node에 Taint 설정을 하게되면, 아래와 같이 Desribe로 Taint 항목이 설정된것을 볼 수 있다.
아래와 같이 설정되어 있다면, node01에는 기본적으로 Pod Schedule이 불가하고 Toleration이 app=nginx로 설정된 Pod만 Schedule 될 수 있다. 또한, Taint 설정 이전의 Schedule 된 Pod에 대해서는 영향을 주지 않는다.
Taint 해제는 어떻게할까?
Taint를 설정하는 방법과 매우 유사하다. taint 설정 가장 끝에 option에서 "-"만 추가하면 된다.
k8s Node Tolerations이란?
위에서 Taint가 "오염"이라고 했다면, Tolerations는 해당 "오염"을 견딜 수 있는 "내성"을 뜻한다.
즉, Taint 설정이 되어있더라도 해당 Taint에 부합하는 value를 Pod Tolerations에 지정하면 해당 Node에 Schedule 될 수 있다.
Pod Toleration 설정은 어떻게할까?
Toleration 설정하는것은 어렵지 않다. Pod를 생성하는 yaml 파일에서 "tolerations" 옵션을 주면 된다.
[node01 Taint 명령어]
kubectl taint node node01 app=nginx:NoSchedule
[node01 pod toleration yaml 파일]
apiVersion: v1
kind: Pod
metadata:
name: taint-test
...
spec:
tolerations:
- effect: NoSchedule
key: app
value: nginx
- ...
...
Node Taint 외 Pod Schedule을 막는 다른 방법은 없을까?
물론 있다. 바로 Node에 cordon 설정을 하는것이다. cordon 명령어를 사용하면 조금 더 쉽게 Taint 설정을 할 수 있다.
실습
현재 node01에는 Taint 설정이 되어 있다. 그렇기 때문에 taint-test Pod를 생성할 때 Tolerations 옵션을 주지 않으면 NODE Schedule이 불가하기 때문에 Pod의 상태가 Pedning이 된다.
그렇지만, Pod yaml에서 Tolerations 옵션을 주게되면 node1에 Schedule 되는 모습을 볼 수 있고, Pod 상태가 Running이 된다.
또한 기본적으로 controlplane node가 default로 생성되어 있다. 하지만 controlplane node지만, kube-ststem과 관련된 Pod만 할당하여 사용하므로 일반적으로 아래와 같은 Taint 설정이 되어 있다. 임의의 Pod Schedule을 막는다.
Node Taint는 위에서도 알 수 있듯이, Schedule을 하지 않도록 하는 설정이다. 그렇기때문에 Pod 생성시에 직접 nodeName 옵션으로 Node를 입력하면 이는 Pod이 생성된다.
다만, k8s에서 Sechedule의 의미는 Pod 생성시에 nodeName이 없을 경우, 전체 Node를 살펴보고 Pod 생성이 가능한 최적의 Node를 식별하고 해당 Node에 Pod을 생성하는것이다. 그래서 직접 nodeName 옵션이 있는것은 Schedule 된다고 볼 수 없고 해당 Node를 사용할 수 있다.
'기술 이모저모 > [K8s] Kubernetes' 카테고리의 다른 글
[k8s] KodeKloud Practice test - Resouce Limis (0) | 2022.10.10 |
---|---|
[k8s] Kubernetes NodeAffinity의 개념정리 (0) | 2022.10.10 |
[k8s] 명령형 접근방법과 선언형 접근방법의 차이 (0) | 2022.10.02 |
[k8s] Kubernetes Namespace란? 개념정리 (0) | 2022.10.02 |
[k8s] Service 개념 및 Type 정리 (0) | 2022.09.18 |