[Kubernetes] Drain, Cordon and Uncordon

bluewhale·2021년 7월 30일
0

kubernetes

목록 보기
5/11
post-thumbnail

kubectl은 노드의 pod-scheduling 정책을 변경할 수 있는 drain, cordon, uncordon 등의 명령어를 제공한다. 이러한 명령어들은 worker 노드의 OS나 kubelet 버전 업데이트 등을 위해 활용된다.

Drain

$ kubectl drain <node-name> 

Drain은 직역하면 배수구, 물 빠짐 등의 의미로 번역된다. 이름에서 알 수 있듯, kubectl drain은 노드에 존재하는 모든 Pod을 제거하여 노드를 비우고, Pod들을 다른 노드에 새롭게 스케쥴링하는 명령어이다.

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

Before Drain

$ kubectl get nodes

After Drain

$ kubectl drain minikube --force --ignore-daemonsets # 모든 Pod이 종료되므로 주의
$ kubectl get nodes

위 명령어를 실행하면, minikube 노드의 STATUSSchedulingDisalbed가 추가된 것을 볼 수 있다. 원래라면, minikube 노드에 스케쥴링 되어 있던 Pod도 다른 노드로 옮겨지게 되지만, 1개 노드로 구성된 클러스터라서 그렇지 못 하였다.

한 가지 흥미로운 점은, drain을 후에도 CoreDNS Pod을 제외한 kube-system 네임스페이스에 존재하는 팟들은 사라지지 않고 남아있는 것을 확인할 수 있다. 그 이유는, kube-apiserver, kube-proxy와 같은 Pod들은 kubelet이 local에 저장된 Pod의 설정 파일을 읽어서 자체적으로 관리하고 있는 Static Pod이기 때문이다. Static Pod에 대한 자세한 설명은 다음의 링크에 자세히 설명되어 있다.

CoreDNS Pod은 다른 Pod과 다르게 Static Pod이 아니기 때문에, kube-scheduler에 의해 스케쥴링 되지 못 하고, Pending 상태로 남아있는 것을 확인할 수 있다.

주의할 점

  • kubectl drain 명령어는 새로운 Pod을 배포할 수 있는 추가적인 노드가 있는 경우에 유효하다. 따라서, 1개의 노드로 운영되는 minikube 환경에서는 테스트가 어려울 수 있다.

  • Replicaset, DaemonSet, StatefulSet 등에 의해 관리되고 있는 Pod만 새로운 노드에 스케쥴링된다. 따라서, Standalone Pod은 다른 노드에 배포되지 않고 그냥 사라지게 된다.

  • Daemonset은 모든 node에 하나씩만 존재하는 Pod으로, 다른 팟에 추가적으로 scheduling 되지 않는다. drain 과정에서 Daemonset을 무시하려면 --ignore-daemonsets 옵션을 추가하면 된다.

  • kubelet에 의해 자체적으로 관리되고 있는 Static Pod은 다른 노드에 scheduling 되지 않고 계속 남아있게 된다.

Cordon

$ kubectl cordon <node-name>

kubectl cordon은 현재 노드에 배포된 Pod은 그대로 유지하면서, 추가적인 Pod의 배포를 제한하는 명령어이다. 따라서, drain 과정에 cordon이 포함되어 있다고 볼 수 있다.

Uncordon

$ kubectl uncordon <node-name>

kubectl drain 혹은 kubectl cordon 명령어를 적용한 노드는 SechedulingDisabled 상태가 되어 더 이상 Pod이 scheduling되지 않는다.kubectl uncordon은 노드의 이러한 SchedulingDisabled 상태를 제거하여 노드에 Pod이 정상적으로 스케쥴링 될 수 있도록 복구하는 명령어이다.

profile
안녕하세요

0개의 댓글