[ERROR CRI]: container runtime is not running
及相关 kubeadm 报错在用 kubeadm
初始化 Kubernetes 集群时,很多初学者会遇到一串报错,像这样:
[init] Using Kubernetes version: v1.28.2
[preflight] Running pre-flight checks
[WARNING FileExisting-tc]: tc not found in system path
[WARNING Hostname]: hostname "i1cglz" could not be reached
[WARNING Hostname]: hostname "i1cglz": lookup izhp3609x3evpm7nk41cglz on 100.100.2.136:53: no such host
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: ... CRI v1 runtime API is not implemented for endpoint "unix:///var/run/containerd/containerd.sock"
别着急,下面我们逐步解读和解决这些问题。
大家好,我是 猫头虎,猫头虎技术团队创始人,也被大家称为猫哥。我目前是COC北京城市开发者社区主理人、COC西安城市开发者社区主理人,以及云原生开发者社区主理人,在多个技术领域如云原生、前端、后端、运维和AI都具备丰富经验。
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用方法、前沿科技资讯、产品评测、产品使用体验,以及产品优缺点分析、横向对比、技术沙龙参会体验等。我的分享聚焦于云服务产品评测、AI产品对比、开发板性能测试和技术报告。
目前,我活跃在CSDN、51CTO、腾讯云、阿里云开发者社区、知乎、微信公众号、视频号、抖音、B站、小红书等平台,全网粉丝已超过30万。我所有平台的IP名称统一为猫头虎或猫头虎技术团队。
我希望通过我的分享,帮助大家更好地掌握和使用各种技术产品,提升开发效率与体验。
作者✍️ 大部分初学者都会觉得:Kubernetes 初始化就应该一帆风顺,怎么还会有这么多 [WARNING] 和 [ERROR]?其实,这类报错本质是环境依赖未就绪或配置错误。
我们来看重点报错:
[ERROR CRI]: container runtime is not running: ...
CRI v1 runtime API is not implemented for endpoint "unix:///var/run/containerd/containerd.sock"
含义: Kubernetes 需要一个容器运行时(CRI,常见有 Docker、containerd、cri-o 等)来启动 Pod。这个报错提示 kubeadm 连接 containerd 时,接口协议不匹配或 containerd 服务未启动。
作者✍️ 遇到 WARNING 不要慌,它只是警告你有些依赖或配置不太标准,通常不会致命。
[WARNING FileExisting-tc]: tc not found in system path
说明你的系统没装流量控制命令 tc
,可无视或自行安装 yum install -y iproute-tc
。[WARNING Hostname]: hostname ... could not be reached
说明你的主机名在 DNS 无法解析。可编辑 /etc/hosts
加一行,比如:127.0.0.1 你的主机名
作者✍️ 初学者最常遇到的误区: 以为装了 containerd 或 Docker 就一切搞定。 实际上,containerd 的 API 版本要与 kubeadm 兼容(v1.28+ 默认只支持 CRI v1 协议),而部分老系统或自建环境的 containerd 配置并不支持。
containerd 服务是否已安装且已启动?
systemctl status containerd
如果没启动:
systemctl start containerd
systemctl enable containerd
containerd 版本是否支持 CRI v1?
containerd --version
建议使用1.7.0 以上版本。
/etc/containerd/config.toml 中 disabled_plugins = ["cri"]
是否被误配置?
systemctl restart containerd
重启服务。查看日志
journalctl -u containerd -xe
作者✍️ 最简单粗暴的方法是重新安装最新版 containerd。 (以 CentOS/Ubuntu 为例)
sudo apt-get remove containerd
sudo apt-get update
sudo apt-get install -y containerd
sudo yum remove containerd
sudo yum install -y containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
作者✍️ 注意!不要混用 Docker 和 containerd 的 sock 路径
/var/run/containerd/containerd.sock
--cri-socket
选项比如:
kubeadm init --cri-socket /var/run/dockershim.sock ...
但强烈建议新集群直接用 containerd。