전공공부
[K8S - CKA] Scheduling & Taints and Tolerant 본문
1. How to Schedule?
정상적인 동작을 하는 스케쥴러라면 알아서 노드 후보자를 쫙 꺼낸 뒤 자동으로 스케쥴 될 노드에 바인딩 객체를 만들어서 포드를 할당하게 됩니다.
노드를 모니터링하고 스케줄 해줄 객체가 존재하지 않는다면 어떻게 될까요?
pod.yaml 파일 내부의 spec.nodeName 부분에 할당 할 노드의 이름을 써줘야 합니다. (nodeName은 pod create 할 때만 사용 할 수 있습니다.)
또는, 바인딩 객체를 실제로 생성하고 바인딩 API가 그것을 읽게해야 합니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeName: kube-01
2. Labels and Selectors
labeling을 하는 이유는 특정 필드만을 이용하여 Select 하여 객체끼리의 연결 또는 모니터링을 진행하기 위해서이다.
예제로 아래 예시를 살펴보자
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
위 예제에서 Deployment는 (key 이름 : app , value 이름 : nginx) 인 Label Pod를 탐색 할 것이다. 이는 template의 설정된 pod의 labels을 가져와서 모니터링 할 수 있게 만들기 위함이고 만일, 기존 사용하던 pod의 labeles app 이름을 바꾸면 더이상 해당 객체는 deployment로 모니터링 되지 않느 것을 확인 할 수 있다.
3. Taints And Tolerations
Taint 설명을 위한 예시를 들어보겠습니다.
우리에게 벌레가 꼬일 때 우리는 모기 방지 스프레이를 우리 몸에 뿌리죠 이것이 Taint 입니다.
그러면 모기는 이 스프레이 냄새를 맡고 달아나서 intolerant 상태가 됩니다. 그러나, 무당벌레의 경우 이 냄새를 맡아도 지장이 없죠 그럴때는 사람에게 꼬이게 됩니다. 이 경우는 Tolerant 상태입니다.
자, 그럼 이것을 요약 해봅시다.
허용 가능한 경우
- Taint 가 있는 객체
- Taint를 버틸 수 있는 객체
위 예시를 사람을 -> 노드로 벌레를 -> 포드로 생각하면 됩니다.
즉, 노드에 taint를 뿌려두고 이를 견딜 수 있는 pod는 tolerant 상태가 되면서 Node에 붙을 수 있겠죠.
이것을 쓰는 예시는 노드1에는 어떠한 응용 프로그램을 설치해서 그것을 사용하는 pod만 붙이고 싶습니다. 그렇다면 taint를 노드에 걸고 tolerant한 pod만 받을 수 있겠죠.
(Taint는 노드에 정해지고 , tolerant는 pod에 정의 됌을 기억하자)
Taints - Node
k taint nodes <node-name> key=value:taint-effect
여기서 taint-effect는 Pod가 taint를 견디지 못 할때 설정할 부작용입니다. (NoSchedule, PreferNoSchedule, NoExecute)
실제 예제
k taint nodes node1 app=blue:NoSchedule
app=blue가 아니라면 taint에 걸린 Pod들은 모두 NoSchedule 상태가 됩니다.
아래 pod.yaml에 따르면 (key name : app, value name : blue , effect : NoSchedule) 으로 잡았기 때문에 위 node의 taint에는 허용되는 상태가 되는 것입니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "app"
operator: "Equals"
value: "blue"
effect: "NoSchedule"
Taints Status - NoExecute
Taint 효과가 실행이 되면 Pod 상태가 실행 상태에서 Execute 불가능하게 됩니다.
결론
taint와 tolerant는 선호하는 node를 만드려는 것이 아닙니다. 특정 포드만 특정 노드에 붙게 하려면 노드 선호도를 지정하죠.
*그저, 특정 pod의 접근을 막기 위함이고 이는, 마스터 노드에 application pod들이 못 들어오게 끔 하는 성질을 만들어 준 것입니다. *
'Study > K8S' 카테고리의 다른 글
[K8S - CKA] Multiple Schedulers (0) | 2023.10.15 |
---|---|
[K8S - CKA] Node Selectors & Node Affinity (0) | 2023.10.03 |
[K8S - CKA] Services (1) | 2023.08.26 |
[K8S - CKA] Kubectl Apply Command (0) | 2023.08.26 |
[K8S - CKA] Imperative 접근 방식 vs. Declarative 접근 방식 (0) | 2023.08.22 |