(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】WorkerNodeに対してdrain/uncordonを行う

スポンサーリンク

はじめに

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を行うのみとなります。

以上、ご参考になれば幸いです。