如何在Kubernetes中排出一个节点
在此Kubernetes教程中,我们将学习使用kubectl disp命令拓节点以准备维护。
它与输入此命令一样简单:
kubectl drain node_name
我们可以使用"kubectl获取节点"命令获取节点详细信息。
但是有更多的是在Kubernetes中排出节点,所以让我们详细看看它。
你为什么需要删除节点?
Kubernetes旨在成为工人节点故障的容错。
可能有不同的原因,工人节点变得无法使用,例如硬件问题,云提供商问题,或者如果工作者和主节点之间存在网络问题,则Kubernetes主控器有效地处理。
但这并不意味着它将永远是这种情况。
而这就是当我们需要耗尽节点并删除所有POD时。
排水是安全地驱逐来自节点的所有Pods的过程。
这样,在Pods上运行的容器优雅地终止。
如何在Kubernetes中正确耗尽节点
让我们从实际演示开始。
步骤1:将节点标记为未划分的(Citon)
要在节点上执行维护,我们应该取消划分,然后漏节点。
首先查看当前运行的节点:
Hyman@theitroad:~# 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 Hyman@theitroad:~#
查看在不同节点上运行的Pods:
Hyman@theitroad:~# 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> Hyman@theitroad:~#
现在通过运行以下命令将节点标记为未划分的命令:
Hyman@theitroad:~# kubectl cordon kworker-rj2 node/kworker-rj2 cordoned Hyman@theitroad:~#
再次列出节点:
Hyman@theitroad:~# 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 Hyman@theitroad:~#
我们可以注意到节点kWorker-RJ2现在标记为SchedulingDisabled。
直到这一步,它不会逐步在该节点上运行的窗格。
验证POD状态:
Hyman@theitroad:~# 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> Hyman@theitroad:~#
我们可以看到Pod"My-Dep-557548758D-D2PMD"仍在Kworker-RJ2节点上运行。
第2步:排出节点以准备维护
现在将节点耗尽,以便通过运行以下命令来删除在节点上运行的PODS:
Hyman@theitroad:~# 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 Hyman@theitroad:~#
注意:kubectl漏极无法删除由ReplicationController,Replicaset,作业,Daemonset或者Syounfuls管理的未管理的POD。
我们需要使用--Force覆盖,并且通过这样做将永久删除各个窗格。
现在看看Pods:
Hyman@theitroad:~# 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> Hyman@theitroad:~#
在kWorker-RJ2节点上运行的POD从那里传播并启动为Kworder-RJ1节点上的新POD。
节点状态保持相同:
Hyman@theitroad:~# 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 Hyman@theitroad:~#
步骤3:维护完成后拒绝节点
之后,我们需要运行以下命令,告诉Kubernetes,它可以恢复在节点上调度新窗口。
Hyman@theitroad:~# kubectl uncordon kworker-rj2 node/kworker-rj2 uncordoned
验证节点状态:
Hyman@theitroad:~# 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再次准备好处理新的工作负载。