728x90
📌 Taint & Toleration
- 쉽게 말해 노드와 파드 간의 상호작용을 제어하는 기능이다.
- Taint와 Toleration을 함께 사용하면 특정 노드에만 특정 유형의 파드를 스케줄링하도록 제한할 수 있다.
- 이를 통해 특정한 역할을 가진 노드에만 특정한 유형의 파드를 할당하거나, 노드를 보호하기 위해 파드가 스케줄링되지 않도록 할 수 있다.
📌 Taint
- 노드에 특정한 제약 조건을 설정한다.
- 주로 노드에 특정한 상황이나 제약 사항이 있는 경우에 사용된다.
- 예를 들어, 특정 노드에는 특정한 유형의 파드만 스케줄링하고 싶다면 해당 노드에 Taint를 설정하여 다른 유형의 파드가 해당 노드에 스케줄링되지 않도록 할 수 있다.
Kubectl taint nodes <nodeName> key=value:<taintEffect>
💡 taint-effect
NoSchedule
- Taint가 설정된 노드에 해당 toleration이 없는 파드를 스케줄링할 수 없도록 막는 옵션이다.
- 만약 노드에 NoSchedule Taint가 설정되어 있다면 해당 노드에는 파드가 자동으로 스케줄링되지 않는다.
PreferNoSchedule
- Taint가 설정된 노드에 파드를 스케줄링하긴 하지만 다른 노드(Taint가 설정되지 않은)를 우선적으로 고려하는 옵션이다.
- 즉, 파드는 가능한 경우 다른 노드에 스케줄링되지만, 해당 노드에만 스케줄링이 가능한 경우에는 그대로 스케줄링된다.
- 특정 노드를 피하고자 하지만, 어쩔 수 없을 때에는 해당 노드에 스케줄링되는 것을 허용하고자 하는 경우에 사용한다.
NoExecute
- Taint가 설정된 노드에 이미 스케줄링되어 있는 파드들에게 영향을 주는 옵션이다.
- NoExecute Taint가 설정된 노드에 파드가 이미 스케줄링되어 있는 경우, 해당 노드에서 Taint를 허용하지 않는 파드들은 다른 노드로 이동하게 됩니다.
- 이는 노드의 상태가 변경되어 파드를 안전하게 이동시키고자 할 때 유용합니다.
🧹 taint 제거
kubectl taint nodes controlplane node-role.kubernetes.io/control-plane:NoSchedule-
위 명령어와 같이 '-'를 붙이는 것으로 taint를 제거할 수 있다.
📌 Toleration
- 파드가 특정한 Taint를 허용하도록 지정하는 것이다.
- Toleration을 설정한 파드는 해당 Taint가 설정된 노드에 스케줄링될 수 있게 된다.
- 파드의 스펙에 tolerations 필드를 추가하여 설정할 수 있다.
예시
- key: 말 그대로 key이다.
- value: 말그대로 value이다.
- effect: 위의 taint-effect를 말한다.
operator
- "Equal" 연산자 (=): Tolerations의 키-값 쌍과 노드의 Taint의 키-값 쌍이 정확히 일치하는 경우에만 파드를 해당 노드에 스케줄링한다.
- "Exists" 연산자 (Exists): Tolerations의 키-값 쌍과 노드의 Taint의 키가 일치하는 경우에만 파드를 해당 노드에 스케줄링합니다. 값은 일치하지 않아도 된다.
- "DoesNotExist" 연산자 (DoesNotExist): Tolerations의 키가 노드의 어떤 Taint와도 일치하지 않는 경우에만 파드를 해당 노드에 스케줄링한다.
📌 Node Selector & Node Affinity
- 파드가 특정 노드에 스케줄링할 수 있도록 노드 선택에 제한을 두는 기능이다.
📌 Node Selector
- 파드가 어떤 노드에 스케줄링될지를 결정하는 데 사용된다.
- 노드의 레이블(Label)과 일치하는 조건을 지정하여 특정 노드에 파드를 스케줄링할 수 있다.
- 예를 들어, "env=production"이라는 레이블이 있는 노드에만 파드를 할당하고자 할 때 해당 노드의 레이블을 파드의 spec.nodeSelector의 하위에 입력하여 사용한다.
💡 노드에 Label을 적용하기
kubectl label nodes <node-name> <label-key>=<label-value>
📌 Node Affinity
- 파드가 특정 노드에 스케줄링되도록 하는 기능을 제공한다.
- Node Selector보다 더 유연한 스케줄링 제어가 가능하여 복잡한 요구사항에 대응할 수 있다.
operator
"In" 연산자
- key와 일치하는 노드 레이블의 값이 리스트에 포함되는 경우에 조건이 충족된다.
- 예를 들어 size: ["small", "medium"]라는 레이블이 있는 노드에 파드를 스케줄링하고자 할 때 operator: In을 사용하면 size의 값이 "small" 또는 "medium"인 노드에만 파드를 할당할 수 있다.
"NotIn" 연산자
- key와 일치하는 노드 레이블의 값이 리스트에 포함되지 않는 경우에 조건이 충족된다.
- 예를 들어 size: ["large", "x-large"]라는 레이블이 없는 노드에 파드를 스케줄링하고자 할 때 operator: NotIn을 사용하면 size 키의 값이 "medium"이나 "small" 등 "large" 또는 "x-large"이 아닌 레이블을 가진 노드에만 파드를 할당할 수 있다.
"Exists" 연산자
- key와 일치하는 노드 레이블이 존재하는 경우에 조건이 충족된다.
- 예를 들어, size라는 레이블이 있는 노드에 파드를 스케줄링하고자 할 때 operator: Exists를 사용하면 size 레이블이 존재하는 노드에만 파드를 할당할 수 있다.
"DoesNotExist" 연산자
- key와 일치하는 노드 레이블이 존재하지 않는 경우에 조건이 충족된다.
- 예를 들어, size라는 레이블이 없는 노드에 파드를 스케줄링하고자 할 때 operator: DoesNotExist를 사용하면 size레이블이 존재하지 않는 노드에만 파드를 할당할 수 있다.
💡 Node Affinity의 세 가지 유형
- 아래의 세 유형을 활용하여 특정 노드에 파드를 할당하거나 특정 노드를 우선적으로 선택할 수 있다.
requiredDuringSchedulingIgnoredDuringExecution
- 파드가 스케줄링될 때 반드시 지정된 조건을 충족하는 노드에 할당되어야 한다.
- 스케줄링 단계에서만 Node Affinity를 고려하며 이미 실행 중인 파드는 무시한다.
preferredDuringSchedulingIgnoredDuringExecution
- 파드가 스케줄링될 때 지정된 조건을 가진 노드에 가능한 한 할당되도록 한다.
- 해당 조건을 충족하지 않는 다른 노드에 할당될 수 있다.
- 스케줄링 단계에서는 선호도를 고려하여 스케줄링 하지만 이미 실행 중인 파드는 무시한다.
requiredDuringSchedulingRequiredDuringExecution
- 파드가 스케줄링될 때 지정된 조건을 충족하는 노드에 할당되어야 한다.
- 실행 중인 파드도 해당 조건을 만족하는 노드에서 계속 실행되어야 한다.
- 만약, 실행중인 파드가 해당 조건을 충족하지 못하면 노드에서 퇴출당한다.
출처
뤼튼
Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests
https://velog.io/@pinion7/Kubernetes-Pod-배치전략-Taint와-Toleration에-대해-이해하고-실습해보기
728x90
'[DevOps] > Kubernetes' 카테고리의 다른 글
kubernetes - DaemonSet, Static Pod (0) | 2023.12.04 |
---|---|
쿠버네티스 CKA 응시료 할인받고 접수하기(Cyber Monday 50% 할인) (2) | 2023.12.03 |
쿠버네티스 Labels & Selector 간단 정리 (0) | 2023.11.10 |
쿠버네티스의 스케줄러 간단 정리 (0) | 2023.11.10 |
kubernetes - Label & Selector의 역할 쉽게 이해하기 (1) | 2023.10.26 |