一、安全摘除节点的标准流程
- 确认节点名称及状态
首先通过以下命令获取节点列表:
kubectl get nodes -o wide
AI写代码
找到需摘除的节点名称,并确认其状态为 Ready。若节点已异常(如 NotReady),需先排查问题或强制操作。
- 标记节点为不可调度
使用 cordon 命令阻止新 Pod 调度到该节点:
kubectl cordon <node-name>
AI写代码
验证节点状态:
kubectl get nodes <node-name>
#输出中 "STATUS" 应为 "SchedulingDisabled"
AI写代码
- 排空(Drain)节点
在移除节点前,需确保该节点上的 Pod 被安全迁移到其他节点,避免服务中断。
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
AI写代码
--ignore-daemonsets:忽略 DaemonSet 管理的 Pod(如日志收集组件)。
--delete-emptydir-data:删除使用 emptyDir 卷的 Pod 数据。
注意:如果存在无法自动迁移的 Pod(如没有副本的裸 Pod),需手动处理或添加 --force 参数。
- 删除节点
驱逐完成后,执行以下命令从集群中移除节点:
kubectl delete node <node-name>
AI写代码
二、验证节点是否成功摘除
- 检查节点列表
使用 get nodes 确认节点已消失:
kubectl get nodes
AI写代码
如果节点已成功删除,列表中不再显示该节点。
如果节点仍在列表中但状态为 NotReady,可能需检查网络或手动清理。
- 检查节点详细信息
kubectl describe node <node-name>
AI写代码
若节点已删除,会返回错误
Error from server (NotFound): nodes "<node-name>" not found。
AI写代码
- 验证 Pod 状态
检查原节点上的 Pod 是否已重新调度到其他节点:
kubectl get pods -o wide | grep node1
应无输出,表示所有 Pod 已迁移
AI写代码
三、彻底清理节点(可选)
如果节点需要从物理/虚拟环境中永久移除,还需在节点本机执行以下操作:
- 停止并重置 kubelet
systemctl stop kubelet
kubeadm reset -f
AI写代码
- 清理残留文件
rm -rf /etc/kubernetes/*
rm -rf ~/.kube/config
AI写代码
- 删除证书(如果使用 kubeadm)
rm -rf /etc/kubernetes/pki/
AI写代码
四、常见问题
- 节点状态一直为 NotReady
检查节点网络是否正常。
检查节点上的 kubelet 是否在运行:
systemctl status kubelet
AI写代码
- 无法删除节点
确认已执行 kubectl drain。
强制删除节点(谨慎操作):
kubectl delete node <node-name> --force --grace-period=0
AI写代码
通过以上步骤,可以安全摘除 Kubernetes 集群中的节点并验证结果。