k8s join 集群报错之error execution phase kubelet-start: error uploading crisocket:

本文描述了在Kubernetes集群中误删关键文件后如何进行恢复,并详细记录了重新初始化控制平面以及加入工作节点的步骤。在修复过程中,执行了`kubeadm reset`、清空CNI配置、重启kubelet以及清理iptables规则等操作,最终成功加入新节点到集群。

【问题描述1】

主节点上误删了/etc/kubernetes下的文件,当做kubeadm init的时候,找不到对应的key文件

invalid or incomplete external CA: failure loading key for apiserver: couldn't load the private key file /etc/kubernetes/pki/apiserver.key: open /etc/kubernetes/pki/apiserver.key: no such file or directory

【解决方案1】

删除“$HOME/.kube/config”文件并执行kubeadm reset命令方可解除

然后提示还有没有清除的,没关系,在执行kubeadm init

kubeadm init \
--apiserver-advertise-address=10.1.1.2 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

执行结果如下

# kubeadm init \
> --apiserver-advertise-address=10.1.1.2 \
> --image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.23.4 \
> --service-cidr=10.96.0.0/12 \
> --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.23.4
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [host-10-19-83-151 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.1.1.2]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server s
<think>嗯,用户之前遇到了kubeadm初始化集群时的预检错误,现在又出现了kubelet-start阶段的CRI socket超时问题。我需要先理解这个错误的原因。 首先,用户可能在执行kubeadm init时遇到了“error uploading crisocket: timed out waiting for the condition”。这说明kubelet无法在预定时间内连接到容器运行时(比如Docker或containerd)。可能的原因包括容器运行时未正确运行、配置错误,或者网络问题导致通信受阻。 接下来,我需要回顾之前的解决方案,用户已经清理了残留文件并重启了kubelet,但现在的问题可能与容器运行时有关。可能的步骤包括检查容器运行时的状态,确认是否安装正确,查看日志,以及验证CRI socket的路径是否正确。 另外,用户可能在使用不同的容器运行时,比如从Docker切换到containerd,但未正确配置kubelet。这时候需要确认/etc/containerd/config.toml是否存在,并生成必要的配置。同时,可能需要重启containerd服务,并确保kubelet的配置指向正确的socket路径。 防火墙或SELinux设置也可能导致连接超时,需要检查防火墙规则是否允许相关端口的通信,或者暂时关闭防火墙和SELinux进行测试。 还有可能kubelet服务本身有问题,查看kubelet的日志可以帮助诊断问题,比如使用journalctl -u kubelet来查看日志中的错误信息。 最后,如果以上步骤都无效,可能需要彻底重置集群,重新初始化,并确保所有依赖服务正常运行。用户可能之前忽略了一些配置步骤,或者在多次尝试初始化后残留了一些未被清理的配置。 需要将这些可能的解决步骤以清晰的结构呈现,帮助用户逐步排查问题,同时提醒他们在操作前备份重要数据,避免进一步的问题。</think>--- ### **错误原因分析** 错误 `error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition` 通常发生在 Kubernetes 初始化或加入节点时,kubelet 无法与容器运行时(如 Docker 或 containerd)建立连接。以下是可能的原因: 1. **容器运行时未正确运行** - Docker 或 containerd 未启动,或配置错误。 2. **CRI(容器运行时接口)Socket 路径不匹配** - kubelet 找不到容器运行时的 Socket 文件(如 `/var/run/containerd/containerd.sock`)。 3. **网络或权限问题** - 防火墙、SELinux 或 AppArmor 阻止了 kubelet容器运行时的通信。 4. **资源不足** - 节点资源(CPU、内存)不足,导致容器运行时无法响应。 --- ### **逐步解决方案** #### **1. 检查容器运行时状态** 确保 Docker 或 containerd 已安装并运行: ```bash # 检查 Docker sudo systemctl status docker # 检查 containerd sudo systemctl status containerd # 如果未运行,启动服务 sudo systemctl start docker # 或 containerd sudo systemctl enable docker # 开机自启 ``` #### **2. 验证 CRI Socket 配置** 确认 kubelet 使用的 Socket 路径与容器运行时一致: - **Docker** 默认使用 `/var/run/dockershim.sock`(已弃用),建议切换到 containerd。 - **containerd** 默认使用 `/var/run/containerd/containerd.sock`。 编辑 kubelet 配置文件(通常位于 `/etc/systemd/system/kubelet.service.d/10-kubeadm.conf`),确保 `--container-runtime-endstone` 参数指向正确的 Socket: ```bash # 查看 kubelet 配置 cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep -i containerd ``` #### **3. 重新生成 containerd 配置** 如果使用 containerd,需生成默认配置文件并重启服务: ```bash sudo containerd config default | sudo tee /etc/containerd/config.toml sudo systemctl restart containerd ``` #### **4. 检查防火墙/SELinux** 临时关闭防火墙和 SELinux 进行测试: ```bash # 关闭防火墙(根据系统选择) sudo ufw disable # Ubuntu sudo systemctl stop firewalld # CentOS # 临时禁用 SELinux sudo setenforce 0 ``` #### **5. 查看 kubelet 日志** 通过日志定位具体错误: ```bash sudo journalctl -u kubelet -n 100 --no-pager ``` #### **6. 彻底重置集群并重试** 如果问题持续,重置集群并清理残留: ```bash sudo kubeadm reset -f sudo rm -rf /etc/kubernetes /var/lib/kubelet sudo systemctl restart containerd docker kubelet ``` #### **7. 重新初始化集群** 添加 `--v=5` 参数查看详细日志: ```bash sudo kubeadm init --v=5 ``` --- ### **常见修复场景** | **场景** | **操作** | |---------------------------|--------------------------------------------------------------------------| | containerd 未运行 | `sudo systemctl start containerd` | | Socket 路径不匹配 | 修改 kubelet 配置或 containerd 的 `config.toml` | | 证书或配置残留 | 执行 `kubeadm reset` 并清理 `/etc/kubernetes` 和 `/var/lib/kubelet` | | 资源不足 | 释放节点资源(如关闭其他进程)或扩容节点 | --- ### **验证是否成功** 1. 检查 kubelet 状态: ```bash sudo systemctl status kubelet ``` 2. 查看 Pod 状态: ```bash kubectl get pods -n kube-system ``` 如果仍超时,请提供 `--v=5` 的完整日志输出以便进一步分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值