200字
Kubernetes Node 节点删除 & 重新加入集群
2025-10-20
2025-10-23

一、准备工作

集群节点信息

节点名称

IP地址

角色

k8s-master01

192.168.171.22

Master

k8s-node01

192.168.171.23

Node

k8s-node02

192.168.171.24

Node

目标:删除节点 k8s-node02 并重新加入集群。

二、删除节点(Master 节点操作)

1. 排空节点(安全驱逐 Pod)

 # kubectl drain 将节点从集群中安全驱逐
 kubectl drain k8s-node02 --delete-emptydir-data --force --ignore-daemonsets
 ​
 # --delete-emptydir-data 删除 Pod 中使用 emptyDir 存储卷的数据
 # --force 强制驱逐无法正常终止的 Pod
 # --ignore-daemonsets 忽略 DaemonSet 类型
 ​
 # 验证节点状态为 "SchedulingDisabled" 且无运行中 Pod
 kubectl get nodes -o wide
 ​
 # NAME         STATUS                     ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                 CONTAINER-RUNTIME
 # k8s-node01   Ready                      <none>          12d   v1.28.2   192.168.171.23   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4
 # k8s-node02   Ready,SchedulingDisabled   <none>          12d   v1.28.2   192.168.171.24   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4
 # node         Ready                      control-plane   12d   v1.28.2   192.168.171.22   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4

2. 从集群中删除节点记录

 kubectl delete node k8s-node02
 # 确认节点状态为 "Deleting" 直至消失
 kubectl get nodes 
 ​
 # NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                 CONTAINER-RUNTIME
 # k8s-node01   Ready    <none>          12d   v1.28.2   192.168.171.23   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4
 # node         Ready    control-plane   12d   v1.28.2   192.168.171.22   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4

三、清理节点数据(k8s-node02 节点操作)

1. 重置 Kubernetes 配置(清除集群关联数据)

 # 强制重置 kubeadm 配置(指定 CRI socket,此处为 cri-dockerd 示例)
 kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock
 ​
 # 清除 IPVS 规则(若使用 IPVS 模式)
 ipvsadm --clear
 ​
 # 清除 iptable 规则
 iptables -F && iptables -X && iptables -Z # && iptables -nvL

2. 删除残留配置文件

 # 删除 Kubernetes 相关配置
 rm -rf /etc/kubernetes/*
 rm -f /opt/kubernetes/ssl/kubelet*  # 按需删除证书(若手动部署过)
 rm -rf ${HOME}/.kube  # 清除本地 kubeconfig

3. 重启 kubelet 服务

 systemctl restart kubelet

四、获取节点加入命令(Master 节点操作)

1. 生成临时有效令牌(默认 24 小时过期)

 kubeadm token create --print-join-command
 # 输出类似:kubeadm join 192.168.171.22:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

2. 生成永久有效令牌(生产环境推荐)

 kubeadm token create --print-join-command --ttl=0
 kubeadm join 192.168.171.22:6443 --token 2bsr7x.ehzebhm0u5z4ld47 --discovery-token-ca-cert-hash sha256:90830b09413570347a3b9e087de8567de86c1c3c4d99f564ae72372707d17953 

令牌有效期

  • 临时令牌默认 24 小时过期,生产环境建议使用 --ttl=0 生成永久令牌。

  • 若令牌过期,重新生成即可(旧令牌自动失效)。

五、重新加入集群(k8s-node02 节点操作)

1. 执行节点加入命令(使用 Master 生成的令牌)

 # 替换 <JOIN_COMMAND> 为实际生成的命令(需包含 CRI socket 配置)
 kubeadm join 192.168.171.22:6443 \
   --token 2bsr7x.ehzebhm0u5z4ld47 \
   --discovery-token-ca-cert-hash sha256:90830b09413570347a3b9e087de8567de86c1c3c4d99f564ae72372707d17953 \
   --cri-socket=unix:///var/run/cri-dockerd.sock

若使用非默认 CRI(如 cri-dockerd、containerd),需在 kubeadm resetkubeadm join 中指定 --cri-socket 路径。

2. (可选)配置本地 kubeconfig(非必要,仅用于节点本地调试)

 mkdir -p $HOME/.kube
 scp root@k8s-master01:/etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

六、验证与配置(Master 节点操作)

1. 标记节点角色(按需,如区分工作节点)

 kubectl label nodes k8s-node02 node-role.kubernetes.io/work=work
 kubectl get nodes -o wide  # 确认节点状态为 "Ready"

2. 验证节点功能(部署测试 Pod)

 # 创建 nginx 部署
 kubectl create deployment nginx1 --image=nginx:1.17.4
 ​
 # 检查 Pod 是否调度到新加入的节点
 kubectl get pod -o wide | grep nginx1

七、注意事项

  1. 网络与防火墙

    • 确保节点间网络互通(6443、2379、2380、10250 等端口开放)。

    • 清理节点后,防火墙规则需恢复到初始状态(或按集群网络插件要求配置)。

  2. 数据持久化

    • 若节点存储本地数据(如 EmptyDir、HostPath),kubectl drain 会删除 EmptyDir,但 HostPath 数据需手动备份。

Kubernetes 集群重建教程(失败后快速重置)

一、适用场景

当 Kubernetes 集群创建失败(如 kubeadm init/join 报错、组件版本冲突、配置残留等),需通过彻底清理集群残留数据后重新部署。

二、节点信息

节点名称

IP地址

k8s-master01

192.168.171.22

k8s-node01

192.168.171.23

k8s-node02

192.168.171.24

三、核心步骤:全节点彻底清理(Master/Node 均需执行)

1. 重置 Kubernetes 基础配置

 # 强制重置 kubeadm 配置(指定 CRI socket,此处为 cri-dockerd 示例)
 kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock
 ​
 # 清除 IPVS 虚拟服务器规则(若使用 IPVS 模式)
 ipvsadm --clear
 # 清除 iptable 规则
 iptables -F && iptables -X && iptables -Z # && iptables -nvL
 ​
 # 停止 kubelet 服务
 systemctl stop kubelet

2. 卸载 Kubernetes 相关组件

 # 列出已安装的 Kubernetes 包(确认版本)
 yum list installed | grep kubernetes
 ​
 # 卸载所有 Kubernetes 组件(包括 CRI 和网络插件)
 yum remove -y kubelet kubeadm kubectl kubernetes-cni cri-tools cri-dockerd

3. 清理 Docker 环境(若使用 Docker/cri-dockerd)

 # 停止并删除所有 Docker 容器
 docker container stop $(docker ps -a -q) && docker rm -f $(docker ps -a -q)
 ​
 # 删除所有 Docker 镜像(避免旧镜像冲突)
 docker rmi -f $(docker images -a -q)

4. 删除残留文件和目录

 # 移除 kubeconfig 配置(用户级和系统级)
 rm -rfv $HOME/.kube/
 rm -rf /etc/kubernetes/
 ​
 # 清除 kubelet 二进制文件和配置
 rm -rf /usr/bin/kube*
 ​
 # 删除 CNI 网络插件相关目录(避免网络配置残留)
 rm -rf /etc/cni/ /opt/cni/
 ​
 # 移除 etcd 数据(仅 Master 节点执行,清除集群元数据)
 rm -rf /var/lib/etcd/

5. 重置系统环境

 # 刷新系统包缓存并更新(确保安装最新依赖)
 yum clean all && yum -y update

6. 移除内核模块(可选,针对 IPIP 等隧道模块)

 # 卸载 IPIP 模块(若使用 Flannel 等Overlay网络)
 modprobe -r ipip
 lsmod | grep ipip  # 确认模块已卸载

四、重建前检查(所有节点)

  1. 验证组件已卸载

     kubeadm version  # 应提示命令未找到
     docker images    # 应无 Kubernetes 相关镜像
  2. 确认目录清空

     ls /etc/kubernetes/    # 应为空
     ls /var/lib/etcd/      # 仅 Master 节点应为空(若已删除)
  3. 网络畅通性

    • 确保节点间能互通以下端口(重建前需开放):

      • Master 节点:6443(API Server)、2379-2380(etcd)、10250(kubelet)

      • Node 节点:10250(kubelet)、30000-32767(NodePort 范围)

五、重建集群(后续步骤,需根据实际部署方案执行)

  1. 重新安装 Kubernetes 组件(所有节点):

     # 添加 Kubernetes YUM 源(示例,需根据版本调整)
     cat <<EOF > /etc/yum.repos.d/kubernetes.repo
     [kubernetes]
     name=Kubernetes
     baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
     enabled=1
     gpgcheck=1
     repo_gpgcheck=1
     gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
     EOF
     ​
     # 安装指定版本(如 1.27.3)
     yum install -y kubelet-1.27.3 kubeadm-1.27.3 kubectl-1.27.3 cri-dockerd-0.3.2-3.el7
     systemctl enable --now kubelet
  2. 初始化 Master 节点

     # 在 k8s-master01 执行(替换 IP 和网络插件)
     kubeadm init --control-plane-endpoint "192.168.171.22:6443" --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock
  3. 加入 Node 节点

     # 在 Master 节点生成加入命令
     kubeadm token create --print-join-command --ttl=0
     ​
     # 在 Node 节点执行(如 k8s-node01/k8s-node02)
     kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> --cri-socket=unix:///var/run/cri-dockerd.sock
  4. 部署网络插件(如 Flannel):

     kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

六、注意事项

  1. 数据备份

    • 清理前备份 etcd 数据(/var/lib/etcd/)和自定义配置(如 $HOME/.kube/),避免重要数据丢失。

  2. CRI 配置一致性

    • 确保所有节点的 CRI(如 cri-dockerd/containerd)版本和配置一致,避免初始化时因 CRI 不兼容报错。

  3. 版本匹配

    • kubeadmkubeletkubectl 需使用相同主版本(如 1.27.x),Minor 版本允许小差异(如 1.27.3 → 1.27.4)。

  4. 防火墙规则

    • 重建前关闭防火墙(systemctl stop firewalld)或按需开放端口,避免网络隔离导致节点无法通信。


评论