はじめに
Kubernetesでは構成サーバはマスターノードとワーカーノードに分かれており、kubectl get nodes
にてそれぞれの一覧が確認できます。
今回は以下のような構成のクラスターにて1台のWorkerを一時的に切り離すべくdrainした後にuncordonする手順を紹介します。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION test1 Ready master 29m v1.15.7 test2 Ready <none> 28m v1.15.7 test3 Ready <none> 28m v1.15.7
環境情報
- Ubuntu 18.04.4 LTS
- kubectl v1.15.7
事前準備
以下記事でも利用した10個のPodでnginxを立ち上げるdeploymentを実行します。
Podが展開されているNodeを確認すると以下のようにWokerNode2台にて分散されていることが確認できます。
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-5754944d6c-2vjbv 1/1 Running 0 4m7s 192.168.111.1 test3 <none> <none> nginx-deployment-5754944d6c-4fnk7 1/1 Running 0 4m7s 192.168.163.199 test2 <none> <none> nginx-deployment-5754944d6c-627g6 1/1 Running 0 4m7s 192.168.163.198 test2 <none> <none> nginx-deployment-5754944d6c-fntqj 1/1 Running 0 4m7s 192.168.111.2 test3 <none> <none> nginx-deployment-5754944d6c-fxltn 1/1 Running 0 4m7s 192.168.111.3 test3 <none> <none> nginx-deployment-5754944d6c-np8ff 1/1 Running 0 4m7s 192.168.163.197 test2 <none> <none> nginx-deployment-5754944d6c-trb6d 1/1 Running 0 4m7s 192.168.163.200 test2 <none> <none> nginx-deployment-5754944d6c-trgz5 1/1 Running 0 4m7s 192.168.111.5 test3 <none> <none> nginx-deployment-5754944d6c-vfqzh 1/1 Running 0 4m7s 192.168.111.4 test3 <none> <none> nginx-deployment-5754944d6c-w2gdv 1/1 Running 0 4m7s 192.168.163.196 test2 <none> <none>
Workerノードをdrainする
Node自体を再起動したりする場合は事前にkubectl drain
を行うことでPodをクリーンに移動させることができます。
$ kubectl drain test2 --ignore-daemonsets --delete-local-data node/test2 cordoned WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-vtkng, kube-system/kube-proxy-hk9zl evicting pod "coredns-5d4dd4b4db-hls4w" evicting pod "nginx-deployment-5754944d6c-np8ff" evicting pod "nginx-deployment-5754944d6c-4fnk7" evicting pod "nginx-deployment-5754944d6c-627g6" evicting pod "calico-kube-controllers-758d7b8fd-z42jh" evicting pod "nginx-deployment-5754944d6c-trb6d" evicting pod "nginx-deployment-5754944d6c-w2gdv" evicting pod "coredns-5d4dd4b4db-6dsmx" pod/coredns-5d4dd4b4db-6dsmx evicted pod/nginx-deployment-5754944d6c-w2gdv evicted pod/calico-kube-controllers-758d7b8fd-z42jh evicted pod/nginx-deployment-5754944d6c-627g6 evicted pod/nginx-deployment-5754944d6c-trb6d evicted pod/nginx-deployment-5754944d6c-4fnk7 evicted pod/coredns-5d4dd4b4db-hls4w evicted pod/nginx-deployment-5754944d6c-np8ff evicted node/test2 evicted
node evictedという文言が出れば成功で、以下のようにSTATUSが「Ready,SchedulingDisabled」に変更され
$ kubectl get nodes NAME STATUS ROLES AGE VERSION test1 Ready master 16m v1.15.7 test2 Ready,SchedulingDisabled <none> 15m v1.15.7 test3 Ready <none> 15m v1.15.7
Podは別のWorkerノードに移動して上で起動しています
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-5754944d6c-2vjbv 1/1 Running 0 9m44s 192.168.111.1 test3 <none> <none> nginx-deployment-5754944d6c-69jjb 1/1 Running 0 29s 192.168.111.10 test03 <none> <none> nginx-deployment-5754944d6c-6h6zl 1/1 Running 0 29s 192.168.111.8 test3 <none> <none> nginx-deployment-5754944d6c-fkn6w 1/1 Running 0 29s 192.168.111.11 test3 <none> <none> nginx-deployment-5754944d6c-fntqj 1/1 Running 0 9m44s 192.168.111.2 test3 <none> <none> nginx-deployment-5754944d6c-fxltn 1/1 Running 0 9m44s 192.168.111.3 test3 <none> <none> nginx-deployment-5754944d6c-l6wgb 1/1 Running 0 29s 192.168.111.7 test3 <none> <none> nginx-deployment-5754944d6c-trgz5 1/1 Running 0 9m44s 192.168.111.5 test3 <none> <none> nginx-deployment-5754944d6c-vfqzh 1/1 Running 0 9m44s 192.168.111.4 test3 <none> <none> nginx-deployment-5754944d6c-xbhbl 1/1 Running 0 29s 192.168.111.9 test3 <none> <none>
ちなみに--delete-local-data
を付与している理由は同オプション無しでは以下のエラーでNode上のPodが移動しなかったからです。
$ kubectl drain test2 --ignore-daemonsets node/test2 cordoned error: unable to drain node "test2", aborting command... There are pending nodes to be drained: test2 error: cannot delete Pods with local storage (use --delete-local-data to override): kube-system/coredns-5d4dd4b4db-6dsmx, kube-system/coredns-5d4dd4b4db-hls4w
上記通りでEmptyDirのようにローカルにデータを溜め込むPodは同オプションを付与しない場合は失敗します。
Workerノードをuncordonする
ノードのメンテナンスが完了すれば以下コマンドでWorkerノードとして再度機能させることができます。
$ kubectl uncordon test2 node/test2 uncordoned
$ kubectl get nodes NAME STATUS ROLES AGE VERSION test1 Ready master 16m v1.15.7 test2 Ready <none> 16m v1.15.7 test3 Ready <none> 16m v1.15.7
ただしNodeを上げただけでは偏ったPodは再配置されません。
Kubernetesにはdeschedularという機構があるようですが
特定のPodを分散させるだけであればそのPodを管理するDeploymentに対してReplica数を変更するなどの操作を行うことで再度Nodeに分散させることができました。
終わりに
Workerノードを暫定的に切り離す本手順ですが、実際のPodの配置はMasterが良しなにやってくれるので実際はdrain&uncordonを行うのみとなります。
以上、ご参考になれば幸いです。