GNU/Linux >> Linux の 問題 >  >> Linux

Kubernetesでノードをドレインする方法

この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クラウド

Linux
  1. Kubernetes内でPodmanを使用する方法

  2. Kubernetesでサービスを削除する方法

  3. Kubernetesのノードにラベルを追加または削除する方法

  1. Node.jsをFedora35/Fedora34にインストールする方法

  2. Ubuntu 18.04 に NodeJ をインストールする方法

  3. Kubernetes ノードで実行された Pod の履歴を取得するには?

  1. KubernetesにJenkinsをインストールする方法

  2. Kubernetesポッドを再起動する方法

  3. KubernetesでMongoDBを実行する方法