Kubernetes 生产集群节点重置与重新加入
一、适用范围
需硬件维护/系统升级的节点
发生不可恢复故障的节点(如内核崩溃、磁盘损坏)
Kubernetes 组件异常且无法修复的节点
二、前置准备
1. 集群状态检查
kubectl get nodes -o wide # 确认其他节点状态
kubectl get pods -A -o wide # 查看Pod分布
kubectl get leases -n kube-node-lease # 检查节点租约
2. 关键数据备份
# 备份证书目录
tar -czvf /backup/k8s-pki-$(date +%s).tar.gz /etc/kubernetes/pki
# 备份etcd数据(控制平面节点)
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-snapshot-$(date +%s).db
3. 负载迁移准备
标记节点为不可调度
kubectl cordon
驱逐工作负载(保持15分钟优雅终止期)
kubectl drain --ignore-daemonsets --delete-emptydir-data --force --timeout=900s
删除节点
kubectl delete node
三、节点重置操作流程
1. 停止Kubernetes服务
systemctl stop kubelet docker
或
systemctl stop kubelet containerd
2. 执行深度清理
kubeadm reset --force \
--cert-dir=/etc/kubernetes/pki \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--cleanup-tmp-dir
# 清理残留网络配置
ipvsadm --clear
iptables -F && iptables -t nat -F && iptables -t mangle -F
rm -rf /var/lib/cni/ /var/lib/kubelet/* /var/lib/etcd/
3. 容器运行时清理
### Docker 运行时 ###
docker ps -aq | xargs docker rm -f
docker volume prune -f
docker system prune -a -f
### Containerd 运行时 ###
crictl rm -f $(crictl ps -aq)
crictl rmp -f $(crictl pods -q)
4. 操作系统级清理
Calico插件
rm -rf /etc/cni/net.d/* /var/lib/calico/* /run/calico/*
ip link delete vxlan.calico
ip link delete kube-ipvs0
Flannal插件
ip link delete cni0
ip link delete flannel.1
ip link delete kube-ipvs0
rm -f /etc/cni/net.d/10-flannel.conflist /run/flannel/subnet.env
rm -rf /etc/cni/net.d/* /var/run/flannel/
四、节点重新加入集群
1. 初始化基础环境
# 安装依赖(以 containerd 为例)
apt-get install -y containerd kubelet=1.32.3-1.1 kubeadm=1.32.3-1.1 kubectl=1.32.3-1.1
# 配置容器运行时
containerd config default > /etc/containerd/config.toml
systemctl restart containerd
2. 加入集群操作
# 获取加入命令(在控制平面节点执行)
kubeadm token create --ttl=30m --print-join-command
# 在新节点执行加入命令(示例)
kubeadm join 192.168.1.100:6443 \
--token 9a08jv.2gz1k9r4qj7c5s3d \
--discovery-token-ca-cert-hash sha256:4c0d72d14c2ba4c6c9b7e5a3e8f9b1c4d5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c
3. 验证加入状态
kubectl get nodes -w # 观察节点状态转为Ready
kubectl describe node <node-name> | grep -i 'kubelet version' # 验证版本一致性
五、后置配置恢复
网络插件修复
# Calico 网络恢复
kubectl delete pod -n calico-system -l k8s-app=calico-node
calicoctl node status # 验证BGP连接
# Flannel 网络恢复
systemctl restart flanneld
工作负载重新调度
kubectl uncordon <node-name>
kubectl rollout restart deploy -n <namespace> # 触发Pod重新分布
六、监控与告警验证
节点心跳 kubectl get leases -n kube-node-lease 存在该节点租约记录
资源指标 kubectl top node CPU/MEM使用率正常
网络连通 kubectl exec -it – ping 延迟 < 5ms
存储挂载 kubectl exec -it – df -h 挂载点容量正常