해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.
⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.
이번 강의에서는 Pod와 node 관계에 대해 이야기해보고, 어떤 파드가 어떤 노드에 배치되는지를 제한하는 방법에 대해 알아보겠습니다.
Taints and Tolerations
taint 및 tolerations의 개념은 초보자에게는 약간 혼란 스러울 수 있습니다. 따라서 사람에게 접근하는 벌레의 비유를 사용하여 taint 과 tolerations이 무엇인지 이해해보겠습니다. 벌레가 사람에게 상륙하는 것을 방지하기 위해, 우리는 사람에게 구충제 스프레이를 뿌립니다. 여기서 구충제 스프레이는 taint를 의미합니다. 벌레는 구충제 스프레이의 냄새를 참지 못하기 때문에 사람에게 다가가지 못합니다. 즉, taint가 버그를 제거한 것입니다. 그러나 이 냄새에 내성이 있는 다른 벌레가 있을 수 있습니다. 그 벌레에게는 taint가 효과가 없는 것이죠. 결국 그 벌레는 사람에게 착륙합니다. 벌레가 사람에게 착륙하는 것을 결정하는 두 가지가 있습니다.
- 사람에게 taint가 있는가
- 벌레가 그 taint를 얼만큼 참을 수 있는가 ![[Pasted image 20230106183110.png]] 쿠버네티스로 돌아가서, 비유에서의 사람은 노드이고 벌레는 파드입니다. taint 과 tolerations은 클러스터에 대한 보안 또는 침입과 아무 상관이 없습니다. taint 및 tolerations는 어떤 파드가 노드에 스케쥴될수 있는지에 대한 제한을 설정하는 데 사용됩니다.
세 개의 워커 노드가 있는 간단한 클러스터를 보겠습니다. 노드의 이름은 1, 2, 3 입니다. 또한 이러한 노드에 배포할 수 있는 파드 세트가 있습니다. 파드들은 A, B, C, D라고 하겠습니다. 파드가 생성되면 Kubernetes 스케줄러는 이러한 파드를 사용 가능한 워커 노드에 배치하려고 시도합니다. 현재로서는 아무 제한이 없기때문에 스케줄러는 모든 노드에 균등하게 균형을 맞추어 파드를 배치합니다.
이제 노드 1에 특정 use case나 애플리케이션을 위한 전용 리소스가 있다고 가정해봅시다. 그렇다면 노드1에는 특정 애플리케이션에 속하는 파드만 배치하고 싶습니다. 우리의 요구사항은 아래 두 가지 입니다.
- 노드1 에 원치 않는 파드는 배치되지 않는다.
- 노드1 에는 특정한 파드만 배치된다.
첫째, 해당 노드에 taint를 배치하여 모든 파드가 그 노드에 배치되는 것을 방지합니다. 이 taint를 blue라고 부릅시다. 파드는 디폴트로 tolerations를 가지고 있지 않습니다. 따로 명시해주지 않을 경우에는 어떠한 파드도 taint가 있는 곳에 갈 수 없습니다. 따라서 현재 어떤 파드도 taint blue를 참을 수 없기 때문에 노드1에는 어떤 파드도 배치될 수 없습니다. 이것으로 우리의 요구사항의 절반을 해결했습니다.
나머지 요구사항의 절반은 특정한 파드를 해당 노드에 배치하는 것입니다. 이를 위해서는 어떤 파드가 특정한 taint에 tolerant한지(참을 수 있는지) 지정해야 합니다. 지금 케이스에서는, 파드 D만 노드1에 배치되는 것을 허용하고 싶습니다. 그렇다면 파드 D에 toleration을 추가합니다. 이제 파드 D는 blue taint를 참을 수 있게 됩니다. 따라서 스케쥴러가 이 파드를 노드1에 배치하려고 할 때, 배치가 가능해집니다. 노드1은 blue taint에 대한 toleration를 가지고 있는 파드만 허용할 수 있습니다. 이것이 taints와 toleration가 존재할 때 파드가 스케쥴되는 방식입니다. 스케쥴러는 파드 A를 노드1에 배치하려고 하지만 노드1의 taint에 의해 허용되지 않고, 노드2로 이동합니다. 그리고 스케쥴러는 파드B를 노드1에 배치하려고 시도합니다. 그러나 다시 taint에 의해 파드B는 허용되지 않고, 다음 free 노드인 노드3에 배치됩니다. 그런 다음, 스케쥴러는 파드C를 노드1에 배치하려고 시도하지만, 다시 허용되지 않고 노드2에서 끝납니다. 그리고 마지막으로 스케쥴러는 파드D를 노드1에 배치하려고 합니다. 파드D는 노드1에 대한 toleration이 있으므로 허용됩니다. taint는 노드에 설정되고, toleration는 파드에 설정된다는 것을 기억해주세요.
Taints
그래서 이것을 어떻게 적용할 수 있을까요? kubectl taint nodes
커맨드를 사용하여 노드에 taint를 설정합니다. 커맨드 뒤에 key-value쌍으로 노드이름과 taint를 지정하면 됩니다. Syntex
$ kubectl taint nodes <node-name> key=value:taint-effect
Example
$ kubectl taint nodes node1 app=blue:NoSchedule
예를 들어 노드를 blue 애플리케이션 전용으로 지정하려는 경우, key-value 쌍은 app=blue가 됩니다.
taint effect는 taint에 toleration가 없는 파드를 어떻게 처리할 것인지를 결정합니다. 3가지 종류의 taint effect가 있습니다.
- NoSchedule: 앞에서 우리가 말한 것 처럼 toleration가 없는 파드는 taint가 있는 노드에 스케쥴링 되지 않습니다.
- PreferNoSchedule: 시스템이 되도록이면 taint가 있는 노드에 파드를 배치하지 않으려하지만 가능은 합니다.
- NoExcuse: toleration이 없는 새로운 파드는 노드에 배치되지 않으며, 이미 노드에 존재하는 파드는 toleration가 없다면 축출됩니다. 이미 노드에 존재하던 파드는 노드에 taint가 설정되기 전에 스케쥴링되었을 것입니다.
예제 커맨드는 노드 1에 taint를 설정하는 커맨드입니다. key-value 쌍은 app=blue이며, taint effect는 NoSchedule입니다.
Tolerations
파드에 toleration을 추가하려면 먼저 파드 Definition file을 가져와야 합니다. difinition file의 spec
섹션에 tolerations
라는 섹션을 추가합니다. taint를 생성했을 때 사용한 값과 동일하게 입력합니다. value
는 "blue"이고, effect
는 "NoSchedule"입니다. toleration
섹션의 모든 값은 쌍따옴표로 감싸야 하는 것을 기억하세요.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: nginx-container
image: nginx
tolerations:
- key: "app"
operator: "Equal"
value: "blue"
effect: "NoSchedule"
이제 파드가 toleration를 가지고 생성되거나 toleration을 가지도록 업데이트될 때, effect에 따라 스케쥴링이 안되거나 기존 노드에서 제거될 것입니다.
Taint - NoExcute
NoExcuse taint effect에 대해 더 알아보겠습니다. 예를 들어 3개의 노드가 있습니다. 지금은 아무런 taint나 toleration이 없기 때문에 아래와 같은 방식으로 스케쥴링이 이루어집니다. ![[Pasted image 20230106182947.png]] 이제 노드1을 특정 애플리케이션 전용으로 사용하기로 결정했습니다. 노드에 taint를 애플리케이션 이름으로 설정하고 특정 애플리케이션에 속하는 파드D 에도 toleration을 추가했습니다. taint effect는 NoExcuse로 설정했습니다. taint effect가 발생하면 파드 C는 노드에서 제거되게 됩니다. 제거된 파드 C는 죽습니다. 파드D는 blue taint에 toleration을 가지고 있기 때문에 노드에서 계속 실행됩니다. ![[Pasted image 20230106182932.png]]
이제 다시 taints와 toleration을 구성했던 원래 시나리오로 돌아가겠습니다. taints와 tolerations은 노드가 특정한 파드를 허용하는 것에 대한 제한을 의미한다는 것을 기억하세요. 이 케이스에서는 노드 1은 오직 파드 D만 수용할 수 있습니다. 그러나 파드D가 항상 노드1에 있다는 것을 보장하지는 않습니다. 다른 두 노드에 taints가 적용되지 않았기 때문에, 파드 D는 다른 두 노드에도 배치될 수 있습니다. 따라서 taints와 tolerations가 파드가 특정 노드로 간다는 것을 말하는 것이 아님을 기억하세요. 대신, 노드가 특정 toleration을 가지고 있는 파드만 허용한다는 것을 의미합니다. ![[Pasted image 20230106183032.png]] 만약 요구사항이 파드가 특정 노드로 가는 것을 제한하는 것이라면, 이는 또 다른 개념인 node affinity를 통해 달성됩니다. node affinity는 다음 강의에서 다루게 됩니다. 마지막으로 흥미로운 사실 하나를 살펴보겠습니다. 지금까지는 우리는 워커 노드만 언급했습니다. 그러나 클러스터에는 마스터 노드도 있습니다. 마스터노드는 파드를 호스팅하고 모든 관리 소프트웨어를 실행할 수 있습니다. 이제 스케쥴러가 마스터 노드의 파드를 스케쥴링하지 않는다는 것을 눈치채셨는지 모르겠습니다. 왜 그럴까요? Kubernetes 클러스터가 처음 설정되면 마스터 노드에 taint가 자동으로 설정되어 파드가 마스터 노드에 스케쥴링되지 않도록 합니다. 우리는 이 것을 확인할수도 있고 필요하면 동작을 수정할 수도 있습니다. 그러나 best pratice는 마스터 서버에 애플리케이션 워크로드를 배포하지 않는 것입니다. 이 taint를 보려면 kubectl describe node kubemaster
명령을 실행하십시오. taint섹션을 보려면 $ kubectl describe node kubemaster |grep Taint
를 실행하면 됩니다. 아래와 같이 taint가 설정된 것을 볼 수 있습니다.
'MLOps > Doker & Kubernetes' 카테고리의 다른 글
Udemy CKA 강의 정리 59: Solution - Taints and Tolerations (Optional) (0) | 2023.01.06 |
---|---|
Udemy CKA 강의 정리 58: Practice Test - Taints and Tolerations (0) | 2023.01.06 |
Udemy CKA 강의 정리 56: Solution - Labels and Selectors (Optional) (0) | 2023.01.06 |
Udemy CKA 강의 정리 55: Practice Test - Labels and Selectors (0) | 2023.01.06 |
Udemy CKA 강의 정리 54. Labels and Selectors (0) | 2023.01.06 |
댓글