如何在 Kubernetes 中耗尽节点

在本 Kubernetes 教程中,您将学习使用 kubectl drain 命令排空节点以准备维护。

就像输入这个命令一样简单:

kubectl drain node_name

您可以使用获取节点详细信息 kubectl get nodes 命令。

但是还有更多要消耗的节点 Kubernetes 所以让我们来详细看看它。

为什么需要排空节点?

Kubernetes 被设计为对工作节点故障具有容错能力。

工作节点变得不可用可能有不同的原因,例如硬件问题、云提供商问题,或者工作节点和主节点之间存在网络问题,Kubernetes 主节点有效地处理它。

但这并不意味着它将永远如此。 这是您需要排空节点并移除所有 pod 的时候。

排水是从节点安全驱逐所有 pod 的过程。 这样,在 pod 上运行的容器就会优雅地终止。

如何正确排空 Kubernetes 中的节点

让我们从实际演示开始。

第 1 步:将节点标记为不可调度(警戒线)

要在节点上执行维护,您应该取消计划然后排空节点。

首先看一下当前运行的节点:

[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]:~#

查看在不同节点上运行的 pod:

[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。

在这一步之前,它不会驱逐在该节点上运行的 pod。 验证 pod 状态:

[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]:~#

您可以看到 pod“my-dep-557548758d-d2pmd”仍在 kworker-rj2 节点上运行。

第 2 步:排空节点以准备维护

现在排空节点以准备维护,通过运行以下命令删除节点上运行的 pod:

[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]:~#

笔记: kubectl drain 无法删除不受 ReplicationController、ReplicaSet、Job、DaemonSet 或 StatefulSet 管理的 Pod。 您需要使用 –force 来覆盖它,这样单个 pod 将被永久删除。

现在看看豆荚:

[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 节点上运行的 pod 从那里被逐出并作为 kworker-rj1 节点上的新 pod 启动。

节点状态保持不变:

[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 它可以继续将新的 Pod 调度到节点上。

[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 中耗尽节点的快速提示。

拉克什耆那教
DevOps 专业 | RHCA | 詹金斯 | 吉特 | 码头工人 | Kubernetes | 稳定 | 普罗米修斯 | 格拉法纳 | AWS Cloud