在本 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