このKubernetesチュートリアルでは、kubectldrainコマンドを使用してノードをドレインしてメンテナンスの準備をする方法を学習します。
次のコマンドを入力するのと同じくらい簡単です:
kubectl drain node_name
kubectl get nodes
を使用してノードの詳細を取得できます コマンド。
ただし、Kubernetesにはノードのドレインがまだまだあるので、詳しく見ていきましょう。
ノードをドレインする必要があるのはなぜですか?
Kubernetesは、ワーカーノードの障害にフォールトトレラントになるように設計されています。
ハードウェアの問題、クラウドプロバイダーの問題、またはワーカーノードとマスターノードの間にネットワークの問題がある場合、Kubernetesマスターがそれを効果的に処理するなど、ワーカーノードが使用できなくなるさまざまな理由が考えられます。
しかし、それは常にそうなるという意味ではありません。そして、これは、ノードを排出してすべてのポッドを削除する必要がある場合です。
ドレインは、ノードからすべてのポッドを安全に削除するためのプロセスです。このようにして、ポッドで実行されているコンテナは正常に終了します。
Kubernetesでノードを適切にドレインする方法
実演から始めましょう。
ステップ1:ノードをスケジュール不能(cordon)としてマークします
ノードのメンテナンスを実行するには、スケジュールを解除してからノードをドレインする必要があります。
まず、現在実行中のノードを確認します。
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
[email protected]:~#
さまざまなノードで実行されているポッドを確認します:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
次に、次のコマンドを実行して、ノードをスケジュール不能としてマークします。
[email protected]:~# kubectl cordon kworker-rj2
node/kworker-rj2 cordoned
[email protected]:~#
ノードを再度リストします:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
ノードkworker-rj2にSchedulingDisabledというラベルが付けられていることがわかります。
このステップまで、そのノードで実行されているポッドは削除されません。ポッドのステータスを確認します:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
ポッド「my-dep-557548758d-d2pmd」がまだkworker-rj2ノードで実行されていることがわかります。
ステップ2:ノードを排水してメンテナンスの準備をします
次に、メンテナンスの準備としてノードをドレインし、次のコマンドを実行して、ノードで実行されているポッドを削除します。
[email protected]:~# kubectl drain kworker-rj2 --grace-period=300 --ignore-daemonsets=true
node/kworker-rj2 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-fl8dl, kube-system/kube-proxy-95vdf
evicting pod default/my-dep-557548758d-d2pmd
pod/my-dep-557548758d-d2pmd evicted
node/kworker-rj2 evicted
[email protected]:~#
注: kubectldrainは、ReplicationController、ReplicaSet、Job、DaemonSet、またはStatefulSetによって管理されていないポッドを削除できません。これをオーバーライドするには、-forceを使用する必要があります。これを行うと、個々のポッドが完全に削除されます。
次にポッドを見てください:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-dsanh 1/1 Running 0 27s 172.16.213.38 kworker-rj1 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
kworker-rj2ノードで実行されていたポッドがそこから削除され、kworker-rj1ノードで新しいポッドとして開始されました。
ノードのステータスは同じままです:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
ステップ3:メンテナンスの完了後にノードのコードを解除する
その後、次のコマンドを実行して、ノードへの新しいポッドのスケジュールを再開できることをKubernetesに通知する必要があります。
[email protected]:~# kubectl uncordon kworker-rj2
node/kworker-rj2 uncordoned
ノードのステータスを確認します:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
ノードkworker-rj2は、新しいワークロードを処理する準備ができています。
Kubernetesのノードのドレインに関するこの簡単なヒントを気に入っていただければ幸いです。
Rakesh Jain
DevOps Professional | RHCA |ジェンキンス| Git | Docker | Kubernetes | Ansible |プロメテウス| Grafana | AWSクラウド