Kubernetes 节点摘除指南

目录

一、安全摘除节点的标准流程

[1. 确认节点名称及状态](#1. 确认节点名称及状态)

[2. 标记节点为不可调度](#2. 标记节点为不可调度)

[3. 排空(Drain)节点](#3. 排空(Drain)节点)

[4. 删除节点](#4. 删除节点)

二、验证节点是否成功摘除

[1. 检查节点列表](#1. 检查节点列表)

[2. 检查节点详细信息](#2. 检查节点详细信息)

[3. 验证 Pod 状态](#3. 验证 Pod 状态)

三、彻底清理节点(可选)

[1. 停止并重置 kubelet](#1. 停止并重置 kubelet)

[2. 清理残留文件](#2. 清理残留文件)

[3. 删除证书(如果使用 kubeadm)](#3. 删除证书(如果使用 kubeadm))

四、常见问题

[1. 节点状态一直为 NotReady](#1. 节点状态一直为 NotReady)

[2. 无法删除节点](#2. 无法删除节点)


一、安全摘除节点的标准流程

1. 确认节点名称及状态

首先通过以下命令获取节点列表:

复制代码
kubectl get nodes -o wide

找到需摘除的节点名称,并确认其状态为 Ready 。若节点已异常(如 NotReady),需先排查问题或强制操作。

2. 标记节点为不可调度

使用 cordon 命令阻止新 Pod 调度到该节点:

复制代码
kubectl cordon <node-name>

验证节点状态:

复制代码
kubectl get nodes <node-name>
#输出中 "STATUS" 应为 "SchedulingDisabled"
3. 排空(Drain)节点

在移除节点前,需确保该节点上的 Pod 被安全迁移到其他节点,避免服务中断。

复制代码
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
  • --ignore-daemonsets:忽略 DaemonSet 管理的 Pod(如日志收集组件)。

  • --delete-emptydir-data :删除使用 emptyDir 卷的 Pod 数据。

  • 注意 :如果存在无法自动迁移的 Pod(如没有副本的裸 Pod),需手动处理或添加 --force 参数。

4. 删除节点

驱逐完成后,执行以下命令从集群中移除节点:

复制代码
kubectl delete node <node-name>

二、验证节点是否成功摘除

1. 检查节点列表

使用 get nodes 确认节点已消失:

复制代码
kubectl get nodes
  • 如果节点已成功删除,列表中不再显示该节点。

  • 如果节点仍在列表中但状态为 NotReady,可能需检查网络或手动清理。

2. 检查节点详细信息
复制代码
kubectl describe node <node-name>
  • 若节点已删除,会返回错误

复制代码
  Error from server (NotFound): nodes "<node-name>" not found。
3. 验证 Pod 状态

检查原节点上的 Pod 是否已重新调度到其他节点:

复制代码
kubectl get pods -o wide | grep node1
# 应无输出,表示所有 Pod 已迁移

三、彻底清理节点(可选)

如果节点需要从物理/虚拟环境中永久移除,还需在节点本机执行以下操作:

1. 停止并重置 kubelet
复制代码
systemctl stop kubelet
kubeadm reset -f
2. 清理残留文件
复制代码
rm -rf /etc/kubernetes/*
rm -rf ~/.kube/config
3. 删除证书(如果使用 kubeadm)
复制代码
rm -rf /etc/kubernetes/pki/

四、常见问题

1. 节点状态一直为 NotReady
  • 检查节点网络是否正常。

  • 检查节点上的 kubelet 是否在运行:

    复制代码
    systemctl status kubelet
2. 无法删除节点
  • 确认已执行 kubectl drain

  • 强制删除节点(谨慎操作):

    复制代码
    kubectl delete node <node-name> --force --grace-period=0

    通过以上步骤,可以安全摘除 Kubernetes 集群中的节点并验证结果。

相关推荐
小章UPUP25 分钟前
Kubernetes (K8s) 与 Podman 的比较
容器·kubernetes·podman
忆~遂愿29 分钟前
CANN metadef 核心解析:计算图原型定义、算子元数据抽象与异构系统互操作机制
docker·容器
说实话起个名字真难啊1 小时前
用docker来安装openclaw
docker·ai·容器
恬静的小魔龙2 小时前
【群晖Nas】群晖Nas中实现SVN Server功能、Docker/ContainerManager等
docker·svn·容器
Zfox_2 小时前
CANN Catlass 算子模板库深度解析:高性能 GEMM 融合计算、Cube Unit Tiling 机制与编程范式实践
docker·云原生·容器·eureka
农民工老王3 小时前
K8s 1.31 私有化部署实战:从 Calico 崩溃到 NFS 挂载失败的排坑全记录
云原生·kubernetes
灰子学技术3 小时前
istio从0到1:如何解决分布式配置同步问题
分布式·云原生·istio
广州中轴线3 小时前
OpenStack on Kubernetes 生产部署实战(十四)
kubernetes·智能路由器·openstack
春日见3 小时前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
DARLING Zero two♡3 小时前
告别 Docker 命令行!Portainer+cpolar 让容器管理从局域网走向公网
运维·docker·容器