kubeadm初始化containerd/cri-dockerd失败的问题排查求助
kubeadm初始化containerd/cri-dockerd失败的问题排查求助
我来帮你分析这两个容器运行时的初始化失败问题,逐个拆解原因和对应的修复方案:
一、containerd初始化失败的原因与修复
错误原因
你遇到的unknown service runtime.v1.RuntimeService错误,核心问题是Kubernetes 1.24+版本要求容器运行时必须支持CRI v1 API,但默认安装的containerd大概率没有启用CRI v1配置,仅开启了旧版的v1alpha2 API,导致kubeadm无法正常调用。
修复步骤
- 编辑containerd的核心配置文件:
sudo nano /etc/containerd/config.toml - 定位到
[plugins."io.containerd.grpc.v1.cri"]区块,确保以下关键配置正确设置(如果没有就手动添加):
同时确保配置文件中没有注释掉CRI相关插件,保证v1 API通路正常。[plugins."io.containerd.grpc.v1.cri"] enable_selinux = false sandbox_image = "registry.k8s.io/pause:3.9" # 镜像版本需匹配K8S 1.28,3.9是兼容版本 [plugins."io.containerd.grpc.v1.cri".containerd] default_runtime_name = "runc" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true # 如果你用systemd管理cgroup,必须开启此项 - 保存配置后重启containerd服务:
sudo systemctl restart containerd - 验证CRI API可用性:
若输出包含完整的运行时信息,说明CRI v1 API已正常启用。crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock info
二、cri-dockerd初始化失败的原因与修复
错误原因
kubelet-check连接10248端口被拒绝,本质是kubelet没有正确配置使用cri-dockerd作为容器运行时。因为你同时安装了containerd和cri-dockerd,kubelet默认会指向containerd的socket,导致无法和cri-dockerd建立通信。
修复步骤
- 配置kubelet绑定cri-dockerd的socket:
编辑kubelet的默认配置文件:
添加以下内容:sudo nano /etc/default/kubeletKUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock" - 重载系统配置并重启kubelet:
sudo systemctl daemon-reload sudo systemctl restart kubelet - 彻底清理之前的初始化残留:
kubeadm reset -f sudo rm -rf /etc/cni/net.d sudo rm -rf /var/lib/etcd - 重新执行kubeadm初始化:
kubeadm init --v=5 --cri-socket=unix:///var/run/cri-dockerd.sock - 验证kubelet健康状态:
返回curl -sSL http://localhost:10248/healthzok则说明kubelet已正常运行。
额外建议
- 尽量只保留一个容器运行时:同时安装containerd和cri-dockerd容易引发配置冲突,建议卸载其中一个,避免后续出现选择混乱问题。
- 检查VPN与NAT配置:确保WireGuard VPN没有拦截kubelet、容器运行时之间的本地通信,NAT规则正确转发集群内部流量。
备注:内容来源于stack exchange,提问作者Hardware noob
相关产品推荐
相关产品推荐

