Maintenance
クラスターの一部のノードで、ソフトウェアのアップグレードや、セキュリティパッチを適用させたい場合など、メンテナンスでノードを停止させたい場面が出てくる。
そこで、Node内のPodを、一時的に別のNodeに退避させたり、スケジューラの対象から外したりすることで、メンテナンスを行う。
kubectl cordonとdrain
kubectl drain
該当のNodeで、Podをスケジュールさせることはできない。
Podを他のNodeに移動させたあと、その間にNodeを再起動させたり、メンテナンスをする。
ただ、調べた感じ、使用シーンとしては、他のNodeに退避させて、その間にメンテナンスと言うよりは、Graceful Shutdownを実現するために使われているような印象を受けました。
参考
https://kubernetes.io/ja/docs/tasks/run-application/run-replicated-stateful-application/#%E3%83%8E%E3%83%BC%E3%83%89%E3%82%92drain%E3%81%99%E3%82%8B
https://kubernetes.io/ja/docs/concepts/scheduling-eviction/_print/#node%E3%81%AE%E9%9A%94%E9%9B%A2%E3%82%84%E5%88%B6%E9%99%90
kubectl cordon
既存のノード上のPodは終了したり、移動しない。余分なポッドがノードに追加されるのを防ぐ。
ノードが cordon された後は、新しいポッドをそのノードにスケジュールすることはできない。
該当のNodeで、新しいPodはスケジュールされず、既存のPodは動き続ける。
kubectl drainの挙動
ノード上で実行している全てのPodを退避させる排出処理(drain)を行うには、kubectl drainを使う。
ノードが排出処理を開始すると、ノードをSchedulingDiasabledに変更してから、各Podに対してSIGTERMシグナルを送信し、Podを退避させる。
排出処理を開始すると、停止可能なPodは退避処理(Eviction)が行われる。
また、排出処理にはそれ以降のスケジューリング候補から除外する機能も含まれているため、前もってkubectl cordonで、指定したNodeにスケジュールさせないよう、実行する必要もない。
例えばこんな感じ。
まず、ポッドを確認。
root@controlplane:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
aws1 1/1 Running 0 3m24s xx node01 <none> <none>
aws2 1/1 Running 0 3m24s xx node01 <none> <none>
aws3 1/1 Running 0 3m24s xx node01 <none> <none>
drain実行。
root@controlplane:~# kubectl drain node01 --ignore-daemonsets
node/node01 cordoned
WARNING: ignoring DaemonSet-managed Pods:
kube-system/kube-flannel-ds-hoge, kube-system/kube-proxy-fuga
evicting pod default/aws1
evicting pod default/aws2
evicting pod default/aws3
pod/aws1 evicted
pod/aws2 evicted
pod/aws3 evicted
node/node01 evicted
PodがEvictedされている。
参考
https://networkandcode.wordpress.com/2019/10/10/kubernetes-nodes-drain-or-cordon-nodes/
https://intl.cloud.tencent.com/document/product/457/30654
https://cloud.google.com/kubernetes-engine/docs/tutorials/migrating-node-pool
https://qiita.com/toshihirock/items/d22fee20b1a561b9efea
https://qiita.com/tkusumi/items/946b0f31931d21a78058
https://www.mtioutput.com/entry/2020/06/21/000000
https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/
参考にさせていただきました。ありがとうございます。