Taints, Tolerations
특정 "Taint"가 씌워진 노드에는 Toleration이 없는 Pod가 배치될 수 없다
- 강의에서는 "모기기피제를 뿌린 사람과 내성 없는 벌레"라는 비유를 쓴
하지만, 만약 특정 Taint에 대한 Toleration이 있는 Pod라면 해당 Taint가 씌워진 노드에 배치될 수 있다.
- 다만, 어떤 Pod이 특정 Taint에 대한 Toleration을 가지고 있다고 해서, Taint가 일치하는 노드에만 배치된다는 것은 아님
- 스케줄러의 마음에 따라서는, 그냥 Taint 없는 다른 노드에 갈 수도 있음
- 이것은 "특정 노드가 어떤 Pod을 받아들일것인가"에 대한 문제이기 때문에, "특정 Pod을 어떤 노드에 지정하고 싶다"라는 경우 Node Selector를 이용하여야 함
- 스케줄러의 마음에 따라서는, 그냥 Taint 없는 다른 노드에 갈 수도 있음
- 다만, 어떤 Pod이 특정 Taint에 대한 Toleration을 가지고 있다고 해서, Taint가 일치하는 노드에만 배치된다는 것은 아님
즉 Taint는 노드에, Toleration은 Pod에 부여되는 것
실제
Taint
kubectl taint nodes 노드명 key=value:taint-effect
형태
- key=value 쌍이라는 Taint를 노드에 부여
taint-effect
: 적절한 Toleration이 없는 Pod에게 무엇을 할 것인가?- NoSchedule: Toleartion 없는 Pod를 배치하지 않음
- PreferNoSchedule: 되도록 배치하지 않음
- NoExecute: Toleartion 없는 Pod을 배치하지 않고, 이미 들어가 있는 Pod도 쫓아냄
예를 들어, kubectl taint nodes node01 app=blue:NoSchedule
같은 형식이 된다
fun fact) 컨트롤 노드에 사용자의 Pod이 배치되지 않는 이유는, 쿠버 설치 시에 기본값으로 Taint가 설정되기 때문이다.
삭제
kubectl taint nodes 노드명 key=value:taint-effect-
(맨 뒤에 -
가 붙음) 으로 삭제 가능
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 15s default-scheduler 0/2 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 1 node(s) had untolerated taint {spray: mortein}. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
Tolerations
Pod Definiton file에 설정 적용
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: nginx-container // -는 YAML에서 리스트의 첫 항목임을 가리킴
image: nginx
tolerations: //app=blue:NoSchedule이라면
- key: "app"
operator: "Equal"
value: "blue"
effect: "NoSchedule"
Node Selector
"특정 Pod을 어떤 노드에 지정하고 싶다"라는 경우 Node Selector를 이용하여야 함
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: nginx-container
image: nginx
nodeSelector:
size: Large // 선택할 노드의 label!
그럼 노드를 어떻게 라벨링하는가
kubectl label nodes 노드명 lavel-key=lavel-value
이 경우에는, kubectl label nodes node-1 size=Large
같은 식이 될 것
Node Selector의 문제점
만약에 특정 Pod을 size=Large이거나 size=Medium인 노드에 배치하고 싶다면? (OR)
혹은, size=Large가 아닌 Pod에 배치하고 싶다면? (NOT)
- Node Selector로는 달성 불가
- Node Affinity와 Anti-Affinity를 사용하여야 함
Node Affinity
"Great Power comes with Great Complexity"
apiVersion: apps/v1
kind: Deployment
metadata:
name: blue
labels:
name: blue
spec:
selector:
matchLabels:
name: blue
template:
metadata:
name: blue-pod
labels:
name: blue
spec:
containers:
- name: blue-nginx
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: color
operator: In
values:
- blue
- green
replicas: 3
if (values.in(key)) 같은 느낌
- operator 종류: In, NotIn, Exists, ...
Affinity의 종류
requiredDuringSchedulingIgnoredDuringExecution
- During Scheduling (Pod이 존재하지 않다가 처음 생성되는 때)
- 만약 규칙에 match되는 노드가 없으면 그냥 그 Pod은 스케줄링이 안된다
- During Execution (Pod이 실행 중인 상태. Affinity 룰이 새롭게 들어갔을 경우, 노드의 label이 바뀌었을 경우 ...)
- Ignored (지금 실행중인 경우에는 Affinity가 무시됨)
- During Scheduling (Pod이 존재하지 않다가 처음 생성되는 때)
preferredDuringSchedulingIgonredDuringExecution
- During Scheduling (Pod이 존재하지 않다가 처음 생성되는 때)
- 만약 규칙에 match되는 노드가 없으면 대충 아무 노드에 넣는다
- During Scheduling (Pod이 존재하지 않다가 처음 생성되는 때)
정리
- Taint & Toleration은, "특정 노드"에 Toleration을 가진 Pod만 들어갈 수 있게 하는 역할을 한다
- Node Selector & Node Affinity는, "특정 Pod"이 어느 노드에 삽입될 수 있는지를 결정한다
- 이 둘을 동시에 사용하면, 특정 노드에 특정 Pod만, 또 특정 Pod에 특정 노드만 들어가게 할 수가 있다
'콤퓨우터 > 필기: KodeKloud CKA 강의' 카테고리의 다른 글
71. DaemonSet (0) | 2024.05.17 |
---|---|
67. Resource Requests and Limits (0) | 2024.05.14 |
44. Imperative v. Declarative (0) | 2024.05.14 |
41. Namespaces (0) | 2024.05.14 |
36. Services (0) | 2024.05.14 |