一、准备工作
集群节点信息:
目标:删除节点 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.42. 从集群中删除节点记录
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 -nvL2. 删除残留配置文件
# 删除 Kubernetes 相关配置
rm -rf /etc/kubernetes/*
rm -f /opt/kubernetes/ssl/kubelet* # 按需删除证书(若手动部署过)
rm -rf ${HOME}/.kube # 清除本地 kubeconfig3. 重启 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:xxx2. 生成永久有效令牌(生产环境推荐)
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 reset 和 kubeadm 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七、注意事项
网络与防火墙:
确保节点间网络互通(6443、2379、2380、10250 等端口开放)。
清理节点后,防火墙规则需恢复到初始状态(或按集群网络插件要求配置)。
数据持久化:
若节点存储本地数据(如 EmptyDir、HostPath),
kubectl drain会删除 EmptyDir,但 HostPath 数据需手动备份。
Kubernetes 集群重建教程(失败后快速重置)
一、适用场景
当 Kubernetes 集群创建失败(如 kubeadm init/join 报错、组件版本冲突、配置残留等),需通过彻底清理集群残留数据后重新部署。
二、节点信息
三、核心步骤:全节点彻底清理(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 kubelet2. 卸载 Kubernetes 相关组件
# 列出已安装的 Kubernetes 包(确认版本)
yum list installed | grep kubernetes
# 卸载所有 Kubernetes 组件(包括 CRI 和网络插件)
yum remove -y kubelet kubeadm kubectl kubernetes-cni cri-tools cri-dockerd3. 清理 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 update6. 移除内核模块(可选,针对 IPIP 等隧道模块)
# 卸载 IPIP 模块(若使用 Flannel 等Overlay网络)
modprobe -r ipip
lsmod | grep ipip # 确认模块已卸载四、重建前检查(所有节点)
验证组件已卸载:
kubeadm version # 应提示命令未找到 docker images # 应无 Kubernetes 相关镜像确认目录清空:
ls /etc/kubernetes/ # 应为空 ls /var/lib/etcd/ # 仅 Master 节点应为空(若已删除)网络畅通性:
确保节点间能互通以下端口(重建前需开放):
Master 节点:6443(API Server)、2379-2380(etcd)、10250(kubelet)
Node 节点:10250(kubelet)、30000-32767(NodePort 范围)
五、重建集群(后续步骤,需根据实际部署方案执行)
重新安装 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初始化 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加入 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部署网络插件(如 Flannel):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
六、注意事项
数据备份:
清理前备份
etcd数据(/var/lib/etcd/)和自定义配置(如$HOME/.kube/),避免重要数据丢失。
CRI 配置一致性:
确保所有节点的 CRI(如 cri-dockerd/containerd)版本和配置一致,避免初始化时因 CRI 不兼容报错。
版本匹配:
kubeadm、kubelet、kubectl需使用相同主版本(如 1.27.x),Minor 版本允许小差异(如 1.27.3 → 1.27.4)。
防火墙规则:
重建前关闭防火墙(
systemctl stop firewalld)或按需开放端口,避免网络隔离导致节点无法通信。