본문 바로가기

Container/Kubernetes

[K8S] Taint & Toleration

파드(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