kubeadm init执行时出现CRI容器运行时相关错误的解决办法求助
看起来你在执行kubeadm init的时候碰到了containerd相关的CRI兼容性问题,别慌,这是个挺常见的问题,我来帮你一步步解决它。
问题原因
这个错误的核心是:kubeadm现在默认要求使用CRI v1版本的API,但你的containerd要么没启用这个API接口,要么版本太低不支持该API,导致kubeadm无法和containerd正常通信。
具体解决步骤
检查并升级containerd版本
首先确认你的containerd版本,CRI v1是从containerd 1.6.x版本开始默认支持的,执行命令查看版本:containerd --version如果版本低于1.6.x,建议先升级到最新稳定版(比如1.7.x系列),不同系统的升级方式略有不同,比如Debian/Ubuntu可以通过官方源更新,CentOS/RHEL可以用yum/dnf安装最新包。
配置containerd的CRI接口
很多时候默认的containerd配置没有完全开启CRI相关服务,我们需要手动调整:- 先生成默认配置文件(如果没有的话):
containerd config default > /etc/containerd/config.toml - 编辑这个配置文件
/etc/containerd/config.toml:- 找到
disabled_plugins这一行,如果里面包含"cri",把它删掉(这是关键!很多人这里没改导致失败); - 找到
[plugins."io.containerd.grpc.v1.cri"]区块,确保enable_runtime_service = true(默认应该是true,但可以确认下); - 找到
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc],确保runtime_type = "io.containerd.runc.v2",这是推荐的运行时类型。
- 找到
- 先生成默认配置文件(如果没有的话):
重启containerd服务
配置修改后,必须重启containerd才能生效:systemctl restart containerd可以用下面的命令确认服务是否正常运行:
systemctl status containerd看到
active (running)就没问题了。重新执行kubeadm init
现在再尝试执行kubeadm init,如果还是识别不了CRI套接字,可以手动指定:kubeadm init --cri-socket unix:///var/run/containerd/containerd.sock
临时应急方案(不推荐优先使用)
如果你只是想快速跳过预检查(不建议生产环境这么做),可以使用--ignore-preflight-errors参数忽略CRI错误:
kubeadm init --ignore-preflight-errors=CRI
但这只是绕过检查,并没有解决根本问题,后续可能还会出现其他容器运行相关的故障,所以优先推荐前面的步骤。
备注:内容来源于stack exchange,提问作者MANISH DUBEY

