kubernetesノードメンテナンスcordon,drain,uncordon

3529 ワード

この3つのコマンドは正式releaseの1.2に新しく追加されたコマンドであり、3つのコマンドが一緒に紹介されているのは、3つのコマンドが組み合わせて使用されることでノードのメンテナンスを実現できるからである.1.2以前は、対応するコマンドサポートがなかったため、ノードを維持するにはstopノード上のkubeletのみがノードをクラスタから脱退し、クラスタが新しいpodをノードにスケジューリングしていない.ノード上でpodが実行されていない場合、ビジネスには影響しません.ノードにpodが実行されている場合、kubeletが停止すると、masterはノードが到達できないことを発見し、ノードをnotReady状態とマークし、新しいノードをノードにスケジューリングしません.同時に、他のノードに新しいpodが作成され、そのノードのpodが置き換えられます.この方法はクラスタの堅牢性を保証することができるが、暴力的であっても、業務が1つのコピーしかなく、そのコピーがメンテナンスノード上でちょうど動作している場合、業務の一時的な中断をもたらす可能性がある.
1.2に新しく追加されたこの3つのコマンドは、ノードのメンテナンス時に、被メンテナンスノード上のトラフィックを他のノードにスムーズに移行し、トラフィックが影響を受けないことを保証します.
次の図に示すように、ノードのメンテナンス全体のプロセスです(demoを容易にするために、ノード情報を表示する操作がいくつか追加されました):
1)まず、現在のクラスタのすべてのノードの状態を表示し、両方のノードがready状態にあることを見ることができる.
[root@master run]# kubectl get nodes
NAME                   STATUS    AGE
node1-192.168.52.132   Ready     1d
node2-192.168.52.130   Ready     1d

2)現在のtomcatの2つのコピーがnode 1の2つのノードで実行されていることを確認します.
[root@master run]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE
tomcat-kl9pc   1/1       Running   0          2m        172.17.82.3   node1-192.168.52.132
tomcat-l9hlp   1/1       Running   0          2m        172.17.82.2   node1-192.168.52.132

3)cordonコマンドを使用してnode 1をスケジューリング不可とマークする.
[root@master run]# kubectl cordon node1-192.168.52.132
NAME                   STATUS                     AGE
node1-192.168.52.132   Ready,SchedulingDisabled   1d
node2-192.168.52.130   Ready                      1d

4)kubectl get nodesを使用してノード状態を確認すると,node 1はまだReady状態であるがスケジューリングが禁止されていることが分かった.これは,新しいpodがnode 1にスケジューリングされないことを意味する.
5)tomcatのステータスを確認し、変更はなく、2つのコピーはnode 1で実行されます.
[root@master run]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE
tomcat-kl9pc   1/1       Running   0          2m        172.17.82.3   node1-192.168.52.132
tomcat-l9hlp   1/1       Running   0          2m        172.17.82.2   node1-192.168.52.132

6)drainコマンドを実行し、node 1で実行されたpodを他のノードにスムーズに追いかける.
[root@master run]# kubectl drain node1-192.168.52.132
node "node1-192.168.52.132" cordoned
pod "tomcat-l9hlp" evicted
pod "tomcat-kl9pc" evicted
node "node1-192.168.52.132" drained

7)tomcatの状態を再確認すると、node 1のコピーがnode 2に移行されていることが分かった.この場合、node 1に対してカーネルのアップグレード、Dockerのアップグレードなどのノードメンテナンスの操作を行うことができます.
[root@master run]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE
tomcat-dddmp   1/1       Running   0          5m        172.17.40.3   node2-192.168.52.130
tomcat-h4qsb   1/1       Running   0          5m        172.17.40.4   node2-192.168.52.130


8)ノードのメンテナンスが完了した後、uncordonコマンドを使用してnode 1をロック解除し、再スケジュール可能にする.
[root@master run]# kubectl uncordon node1-192.168.52.132
node "node1-192.168.52.132" uncordoned

9)ノードの状態をチェックし,node 1がReady状態に戻ることを発見した.
[root@master run]# kubectl get nodes
NAME                   STATUS    AGE
node1-192.168.52.132   Ready     1d
node2-192.168.52.130   Ready     1d

ノードを削除するには、kubectl delete node ipだけが直接ノードを削除できます.
このノードを新しく追加するには、ノードのクbeletクbe-proxyを再起動するだけでいいです.