본문 바로가기
클라우드 및 인프라/Kubernetes

[kubernetes] cordon, uncordon, drain, taint

by 작은소행성 2023. 7. 17.

 

명령어 사용 이유

클러스터를 사용하다보면 특정 노드에 있는 pod 를 다른 곳으로 옮기거나 특정 node 에는 pod 가 스케쥴링 되지 않게 제한을 둘 필요가 있다. 

이 명령어들은 worker노드의 OS나 kubelet 버전 업데이트에 사용한다.

 

 

 

cordon 

: 지정된 node에서 더이상 pod들이 scheduling되서 실행되지 않도록 한다.

현재 노드에 배포된 Pod는 그대로 유지하면서 추가적인 Pod의 배포를 제한하는 명령어이다. 

kubectl cordon <node-name>

 

uncordon

: pod가 node에 정상적으로 scheduling 시키는 명령어이다.

kubectl drain, kubectl cordon 명령어를 적용한 노드의 Pod는 스케쥴링이 되지 않는데, uncordon은 노드에 Pod가 정상적으르 scheduling될 수 있도록 복구하는 명령어이다. 

uncordon 이 정상적으로 되면 node 상태는Ready만 남고 Pending으로 남아있던 pod 가 정상적으로 scheduling되어 실행되는 것을 확인할 수 있다. 

kubectl uncordon <node-name>

 

 

drain

: node 관리를 위해서 지정된 노드에 있는 pod 를 다른곳으로 이동시키는 명령어이다. 

노드에 존재하는 모든 Pod를 제거해 노드를 비우고 Pod를 다른 노드에 새롭게 스케쥴링 하는 명령어이다. 

kubectl drain <node-name>

 

사용 방법

1. 새로운 pod 가 node에 스케쥴링되어 실행되지 않도록 설정

2. 기존에 해당 노드에서 실행중인 pod 를 삭제한다

3. 이 때 node에 데몬셋으로 실행된 pod 가 있으면 drain 이 실패한다. (데몬셋으로 실행된 pod는 삭제해도 데몬셋이 다시 실행시키기 때문에)

 

--ignore-daemonsets 옵션

DaemonSet은 모든 node에 하나씩만 존재하는 Pod로 다른 Pod 에는 추가적으로 스케쥴링되지 않는다.

따라서 drain 과정에서 DaemonSet을 무시하기 위해서는 --ignore-daemonsets 옵션을 사용한다. 

 

 

참고 

drain 명령어는 1개의 노드 이상이 있어야 한다. 그래서 minikube환경에서는 테스트가 어려울 수 있다. 

해당 명령어에는 cordon이 포함되어 있다. 

 

 

taint

특정 키와 값이 일치하는 Pod 만 해당 노드에서 예약되도록 함

taint 는 노드가 파드 셋을 제외시킬 수 있다.

 

노드에 테인트 추가하기

kubectl taint nodes node1 key1=value1:NoSchedule
-----------------
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"

 

추가했던 테인트 제거하기 (명령어 끝에 '-' 붙이기)

kubectl taint nodes node1 key1=value1:NoSchedule-

 

 

toleration

toleration을 통해 스케줄러는 그와 일치하는 테인트가 있는 파드 스케줄 가능하다.

toleration은 스케줄을 허용하지만 보장하지는 않는다.

 

 

 

 

 

반응형