[k8s] node 셧다운하기
쿠버든 뭘 쓰든 간에 결국 컴퓨터는 물리 장비고, 운영을 하다 보면 여러가지 이유로 재부팅이나 패치를 포함한 여러가지 유지보수 작업이 필요하게 된다.
그러려면 유지보수할 node에 실행되고 있던 Pod들을 적절히 다른 곳으로 재배치해야할 필요가 있다. 그 방법에 대해 간단히 정리해본다.
신규 스케줄링 중단: cordon
일단 가장 먼저 해야할 것은 해당 노드에 신규 Pod가 추가되지 않게 하는 것이다.
가장 간단한 방법은 cordon이란 명령을 쓰는 것이다.
kubectl cordon <노드명>
이 명령은 내부적으로 node.kubernetes.io/unschedulable:NoSchedule라는 taint를 붙여서 taint 기반의 스케줄링 가드를 걸어버린다. 사실 taint 명령으로 직접 붙이는 것과 차이는 없고, 그냥 숏컷이다.
신규 등록을 중단했으니, 이제 기존 Pod를 내리면 된다.
서버 중단: drain
drain 명령을 쓰면, 특정 node의 기존 Pod들을 다른 Pod로 재스케줄링되게 할 수 있다.
kubectl drain <노드명> --ignore-daemonsets --delete-emptydir-data
보통 이런 패턴으로 사용한다.
이러면 해당 노드에서 실행되던 Pod들이, 사용 가능한 다른 Pod들로 하나씩 이사를 갈 것이다.
drain이 완료되었다면, 실행되고 있는 유의미한 Pod가 없다는 말이니, 이 때 적절히 유지보수 작업을 하면 된다.
재부팅을 하든, 하드웨어 교체를 하든 간에 말이다.
after: 스케줄링 복구
유지보수가 끝났다면, node에 붙어있는 taint를 떼줘야 한다.
가장 간단한 방법은 uncordon 명령을 쓰는 것이다.
kubectl uncordon <노드명>
근데 이건 신규 등록을 가능하게 할 뿐이지, 기존 Pod들을 강제로 다시 끌고올 강제력은 없다.
또 그걸 자동으로 한번에 재배치를 유도할 방법도 없다. 그러려면 기존 Pod를 죽이거나 해야한다.
참조
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/
https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/