メンテナンスなどで特定のnodeから予めpodを他のnodeに移しておきたいことがあります。
スケジューリングをyamlに定義して適用しても良いのですが、コマンド一発でサクッと済ませたいな、、と思いました。
まとめ
-
drain
で排出(他へ移動) -
--ignore-daemonsets
オプションは付ける - 元に戻すには
uncordon
実際にやってみた
microk8s-0
~microk8s-5
まで6nodesある中で、microk8s-1
を対象に作業してみる。
まずは現状確認
nodeのSTATUSはReady
。
ubuntu@k8s:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
microk8s-3 Ready <none> 13d v1.25.4
microk8s-2 Ready <none> 13d v1.25.4
microk8s-4 Ready <none> 13d v1.25.4
microk8s-5 Ready <none> 13d v1.25.4
microk8s-1 Ready <none> 13d v1.25.4
microk8s-0 Ready <none> 26d v1.25.4
microk8s-1
に配置されているpods。
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep microk8s-1
kube-system fluentd-5rmfh 1/1 Running 0 9d 10.1.211.143 microk8s-1 <none> <none>
logging elasticsearch-89d7968d7-dsskn 1/1 Running 0 9d 10.1.211.144 microk8s-1 <none> <none>
metallb-system speaker-rlv76 1/1 Running 3 (8d ago) 13d 172.17.0.91 microk8s-1 <none> <none>
kube-system calico-node-dgc6x 1/1 Running 0 8d 172.17.0.91 microk8s-1 <none> <none>
drainの実行
--ignore-daemonsets
を付けないとエラーになる。
microk8s-1
が閉鎖(cordoned)され、daemonsetsではないelasticsearch
のみが排出された。
--delete-emptydir-data
のオプションが必要になるときもある。←ローカルデータは削除される。
ubuntu@k8s:~$ kubectl drain microk8s-1 --ignore-daemonsets
node/microk8s-1 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/fluentd-5rmfh, metallb-system/speaker-rlv76, kube-system/calico-node-dgc6x
evicting pod logging/elasticsearch-89d7968d7-dsskn
pod/elasticsearch-89d7968d7-dsskn evicted
node/microk8s-1 drained
drain後の状態確認
nodeのSTATUSはReady,SchedulingDisabled
。
ubuntu@k8s:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
microk8s-5 Ready <none> 13d v1.25.4
microk8s-0 Ready <none> 26d v1.25.4
microk8s-3 Ready <none> 13d v1.25.4
microk8s-2 Ready <none> 13d v1.25.4
microk8s-1 Ready,SchedulingDisabled <none> 13d v1.25.4
microk8s-4 Ready <none> 13d v1.25.4
elasticsearch
がmicrok8s-1
から消え、microk8s-2
に移動している。
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep microk8s-1
kube-system fluentd-5rmfh 1/1 Running 0 9d 10.1.211.143 microk8s-1 <none> <none>
metallb-system speaker-rlv76 1/1 Running 3 (8d ago) 13d 172.17.0.91 microk8s-1 <none> <none>
kube-system calico-node-dgc6x 1/1 Running 0 8d 172.17.0.91 microk8s-1 <none> <none>
ubuntu@k8s:~$
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep logging | grep elasticsearch
logging elasticsearch-89d7968d7-wqf47 1/1 Running 0 2m3s 10.1.36.243 microk8s-2 <none> <none>
これでmicrok8s-1
を停止したり様々なメンテナンスがしやすくなった。
元に戻してみる(uncordon)
microk8s-1
を指定してuncordon
を実行
ubuntu@k8s:~$ kubectl uncordon microk8s-1
node/microk8s-1 uncordoned
nodeのSTATUSがReady
に戻った!
ubuntu@k8s:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
microk8s-4 Ready <none> 12d v1.25.4
microk8s-2 Ready <none> 12d v1.25.4
microk8s-3 Ready <none> 12d v1.25.4
microk8s-0 Ready <none> 12d v1.25.4
microk8s-1 Ready <none> 12d v1.25.4
microk8s-5 Ready <none> 12d v1.25.4
元々あったelasticsearch
は自動では戻らない。
※nodeAffinity設定してたら戻ると思いますが未確認。
ubuntu@k8s:~$ kubectl get pods -A -o wide | grep microk8s-1
kube-system fluentd-2w7fn 1/1 Running 4 (112s ago) 12d 10.1.189.144 microk8s-1 <none> <none>
metallb-system speaker-vkb9z 1/1 Running 4 (112s ago) 12d 10.9.6.41 microk8s-1 <none> <none>
kube-system calico-node-4hxxx 1/1 Running 4 (112s ago) 8d 10.9.6.41 microk8s-1 <none> <none>