쿠버네티스의 drain, cordon, uncordon 명령어는 클러스터의 노드 상태를 제어하고 유지 관리 작업을 할 때 유용하게 사용된다.

 

이 명령어들을 사용하여 특정 노드를 클러스터에서 일시적으로 격리하거나, 해당 노드에서 실행 중인 모든 Pod를 안전하게 다른 노드로 옮길 수 있습니다.

 

이러한 명령어들은 worker 노드의 OS나 kubelet 버전 업데이트 등을 위해 활용된다.

 

Drain

 

Drain 명령어는 특정 노드에서 실행 중인 모든 Pod를 안전하게 다른 노드로 이동시킨다.

 

Pod는 중단되거나 종료되지 않고, 다른 가용한 노드로 이동(스케줄링)된다. 이 명령은 노드에서 유지보수 작업을 수행할 때 유용하다.

 

Drain 명령어는 해당 노드를 Cordon 상태로 만들고, 그 후에 모든 Pod를 다른 노드로 이동시킵니다. 노드에서 서비스가 중단되지 않도록 안전하게 작업을 진행할 수 있다.

 

또한, Drain이 적용된 노드는 SchedulingDisabled 상태가 되며, 이후 새롭게 생성되는 어떤 Pod도 해당 노드에 생성되지 않는다.

 

Drain 실습

 

Drain을 하기 전 모습이다. 

 

 

Drain 이후의 모습

 

kubectl drain <node name> --ignore-daemonsets

 

--ignore-daemonsets 옵션으로 daemonset으로 만들어진 pod를 무시하고 drain을 진행할 수 있다. 즉 해당 pod들은 계속 drain 하려는 node에 남아있다. 

 

 

node01이 성공적으로 SchedulingDisabled가 된 것을 확인 가능하다. 또한 기존에 node01에 있던 pod들이 Controlplane으로 이동한 것을 볼 수가 있다. 

 

현재 Controlplane에 taint가 걸려있지 않기 때문에 가능했다. 

 

 

Drain 특징

 

또 알아둬야할 점이 Drain을 한 후에도 Static Pod들은 사라지지 않는다.

 

Static Pod들은 노드에서 바로 정의되기 때문에 자세히는 노드의 특정 디렉터리에 있는 파일을 기반으로 실행되기 때문에쿠버네티스 API 서버에서 조회하거나 제어할 수 없으며, 일반적인 Pod와는 다르게 ReplicaSet, Deployment 같은 컨트롤러의 영향을 받지 않는다.

 

drain 명령은 노드에서 API 서버가 관리하는 Pod들만 대상으로 하기 때문에, Kubelet이 관리하는 Static Pod는 영향을 받지 않고 계속 실행된다.

 

drain 명령 자체가 node가 1개인 kubernetes 환경에서는 사용하기가 어렵다. 2개 이상의 node를 가진 환경에서 사용할 수 있겠다.

 

Replicaset, DaemonSet, StatefulSet 등에 의해 관리되고 있는 Pod만 새로운 노드에 스케쥴링된다. 따라서, Standalone Pod은 다른 노드에 배포되지 않고 그냥 사라지게 된다. 만약 중요한 Pod가 Standalone으로 띄워져 있다면 사용에 주의해야한다.

 

Cordon

Cordon 명령어는 특정 노드를 스케줄링에서 제외시킨다.

 

즉, 해당 노드에 더 이상 새로운 Pod가 스케줄링되지 않게 된다. 이미 노드에 배치된 기존 Pod는 그대로 실행되지만, 추가적인 Pod는 배치되지 않는다.

 

Drarin 과정에 Cordon이 포함되어 있는 것이다. 

 

Cordon 실습

 

hr-app StandAlone pod가 Node가 SchedulingDisabled 되어도 Node에 남아있고 또 정상 작동하는 것을 확인할 수 있다.

 

UnCordon

UnCordon 명령어는 Cordon으로 스케줄링에서 제외된 노드를 다시 스케줄링 가능 상태로 되돌린다. 이 명령어를 실행하면 해당 노드는 다시 새로운 Pod를 받을 수 있다.

 

UnCordon 실습

'DevOps > Kubernetes' 카테고리의 다른 글

Kubernetes 내부 ETCD Backup and Restore  (0) 2024.10.26
Kubernetes Cluster Upgrade  (0) 2024.10.24
Kubernetes InitContainer  (0) 2024.10.23
Kubernetes 환경 변수(Configmap, secret) 설정  (0) 2024.10.22
Kubernetes Metrics Server 구축  (0) 2024.10.20