파드(Pod)와 노드(Node) 간 스케줄링 규칙을 정하기 위해 사용된다.
Taint
노드에 적용되는 속성으로, 특정 조건을 만족하지 않는 파드가 해당 노드에 스케줄링되지 않도록 제약 조건을 설정
📖 Pod와 node의 관계, Pod가 어떤 노드에 assign될지에 대한 restriction
주요 특징:
- 노드 보호: 특정 노드를 특정 작업(예: 시스템 프로세스 전용)으로 예약
- 파드 제한: 지정된 파드만 특정 노드에 배포되도록 제한
- 키-값-효과: Taint는 키(Key), 값(Value), 효과(Effect)의 조합으로 정의
- Key: Taint를 식별하는 키
- Value: 추가적인 설명 정보 제공
- Effect: Taint가 작동하는 방식을 정의
Node taint, Pod toleration
Taint는 제한을 설정, Toleration을 해당 제한 허용을 설정
$ kubectl taint nodes <노드 이름> <key>=<value>:<effect>
ex)
$ kubectl taint nodes node1 app=blue:NoSchedule
$ kubectl taint nodes node1 dedicated=frontend:NoSchedule
-> frontend 파드만 node1에 스케줄링 가능.
- worker node에 taint가 설정된 경우 동일 값의 toleration이 있는 Pod만 배치된다.
- Toleration은 파드에 적용되는 속성으로, 특정 Taint를 허용하여 해당 노드에 스케줄링될 수 있도록 설정한다.
- toleration이 있는 Pod는 동일한 taint가 있는 node를 포함하여 모든 node에 배치된다.
- effect 필드 종류
- NoSchedule: Toleration 이 없는 파드는 배치되지 않는다.
- PreferNoschedule: Toleration 이 없는 파드는 배치되지 않으나, 클러스터 리소스가 부족하면 할당된다.(not guaranteed)
- NoExecute: Toleration이 없는 파드는 즉시 제거된다.
- new pods가 node에 스케줄되지 않고, 노드에 존재하던 Pod들은 taint를 허용하지 않으면 종료된다.
# 만약 master/ node 둘 다 Taint가 설정되어 있지 않으면 어디에도 배정될 수 있다.
$ kubectl describe node node01 | grep Taint
Taints: <none>
$ kubectl describe node controlplane | grep Taint
Taints: <none>
# 마스터에는 Pod가 배치되지 않는다.
root@master:~# kubectl describe nodes master | grep -i taint
Taints: node-role.kubernetes.io/control-plane:NoSchedule
# 워커노드에도 설정해보기
root@master:~# kubectl taint nodes node1.example.com role=web:NoSchedule
node/node1.example.com tainted
root@master:~# kubectl taint nodes node2.example.com role=web:NoSchedule
node/node2.example.com tainted
root@master:~# kubectl describe nodes node{1..3}.example.com | grep -i taint
Taints: role=web:NoSchedule
Taints: role=web:NoSchedule
Taints: <none>
root@master:~/pod-scheduling# cat deploy-nginx_default.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webui
spec:
replicas: 4
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
root@master:~/pod-scheduling# kubectl apply -f deploy-nginx_default.yaml
deployment.apps/webui created
Every 2.0s: kubectl get pods -o wide master.example.com: Fri Apr 12 16:48:52 2024
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
webui-bd76d5967-8jvdv 1/1 Running 0 34s 10.47.0.3 node3.example.com <none> <none>
webui-bd76d5967-bljmk 1/1 Running 0 34s 10.47.0.4 node3.example.com <none> <none>
webui-bd76d5967-mxpf2 1/1 Running 0 34s 10.47.0.1 node3.example.com <none> <none>
webui-bd76d5967-p89kz 1/1 Running 0 34s 10.47.0.2 node3.example.com <none> <none>
# 1,2를 제외한 3에서만 실행되는 것 확인
# taint가 설정되어 있어도 실행시켜보고 싶을 때.
root@master:~/pod-scheduling# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webui
spec:
replicas: 4
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
tolerations:
- key: "role"
operator: "Equal"
value: "web"
effect: "NoSchedule"
# tolerations을 설정해주면 1,2,3 전부에 배치된다.
root@master:~# kubectl describe nodes node{1..3}.example.com | grep -i taint
Taints: role=web:NoSchedule
Taints: role=web:NoSchedule
Taints: <none>
# Taint 다시 삭제
root@master:~# kubectl taint nodes node2.example.com role-
node/node2.example.com untainted
root@master:~# kubectl taint nodes node1.example.com role-
node/node1.example.com untainted
root@master:~# kubectl describe nodes node{1..3}.example.com | grep -i taint
Taints: <none>
Taints: <none>
Taints: <none>
- 유지관리 : 특정 노드를 유지 관리 상태로 설정
$ kubectl taint nodes node1 maintenance=true:NoSchedule
# 유지 관리가 완료되면 Taint 제거
$ kubectl taint nodes node1 maintenance-
실습]
# Command line으로는 pod의 toleration을 설정할 수 없다.
root@master:~# kubectl run bee --image=nginx --dry-run=client -o yaml > bee.yaml
root@master:~# vi bee.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: bee
name: bee
spec:
containers:
- image: nginx
name: bee
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
tolerations:
- key: "spray"
value: "mortein"
effect: "NoSchedule"
operator: "Equal"
status: {}
root@master:~# kubectl create -f bee.yaml
pod/bee created
반응형
'Container > Kubernetes' 카테고리의 다른 글
CKA 시험준비 (0) | 2024.04.16 |
---|---|
[K8S] cordon & drain (0) | 2024.04.13 |
[K8S] Affinity & antiAffinity (0) | 2024.03.25 |
[K8S] Secret (0) | 2024.03.20 |
[K8S] Canary Deployment (0) | 2024.03.20 |