쿠버네티스 클러스터를 사용하다 보면 특정 노드에 있는 포드들을 모두 다른 곳으로 옮기거나 아니면 특정 노드에는 포드들이 스케쥴링 되지 않도록 제한을 걸어둘 필요가 있다. 그럴 때 사용하는 것이 cordon, drain이다.
cordon
: cordon은 지정된 노드에 더 이상 pod들이 스케쥴링되어서 실행되지 않도록 제재하는 것을 말한다.
1) pod 확인하기
kubectl get po -o wide
위의 명령어를 쳐서 pod들에게 할당되어진 pod들을 확인한다. 내 경우 워커노드를 3개를 돌리고 있어서 각각 w1,w2,w3에게 골고루 지정되어 있다.
2) cordon 지정하기
kubectl scale deployment <deployment name> --replicas=1
우선 워커들이 pod들에게 지정되어 있으므로 replicas를 pod 하나로 줄여준다. 그리고 cordon을 써서 하나의 노드에서 더이상 pod들이 스케쥴링되지 않게 한다.
kubectl scale deployment <deployment name> --replicas=6
replicas수를 늘려 worker들이 지정되어지는지 확인한다.
위와 같이 w3에 pod들이 지정되지 않음을 확인할 수 있다.
uncordon
글씨 그대로 cordon한 것을 해제하는 것을 말한다.
kubectl uncordon <워커노드>
drain
: 기존 파드를 제거한다.
kubectl drain <워커노드>
위와 같이 치면 drain이 적용되는데 그런데 아래와 같이 에러가 뜨게 된다.
그 이유는 워커노드의 데몬셋에 의해 관리되는 pod들이 없어지기 때문이다. 이를 무시하고 진행하려면 위의 warning을 따라한다.
kubectl drain <워커노드> --ignore-daemonsets --force
위와 같이 뜨며 node에 변화가 있게 된다.
kubectl get node
위와 같이 SchedulingDisabled가 뜨게 된다. 이렇게 보면 모르니 어떠한 영향이 있는지 아래의 명령어를 쳐서 확인한다.
kubectl get all -o wide
위가 drain을 하기전이고 아래가 한 후이다. pod를 보면 변화를 알 수 있는데, 위에서는 w3노드가 할당되어진 pod가 존재했지만, 아래에서는 존재치 않는다. 이전에 w3노드에 할당되어져 있던 pod가 master가 담당함을 알 수 있다.
kubectl uncordon <워커노드>
마지막으로 노드를 정상화시킬려면 위의 명령어를 쳐서 해당 노드에 pod를 배정하도록 한다.
👇🏻 참고사이트
https://nayoungs.tistory.com/entry/Kubernetes-k8s-Cordon과-Drain
https://velog.io/@koo8624/Kubernetes-Drain-Cordon-and-Uncordon