k8s + containerd下,容器启动时报错 failed to create shim task, incompatible CNI versions 问题解决

笔者手上有一个祖传的安装了containerd的服务器,这个服务器长期没有使用,近日由于需要部署一个nginx服务做一些流量转发,偶然想起手上还有这么个小宝贝就把他拿出来用。可是容器启动的时候报了failed to create shim task。错误原因是:incompatible CNI versions; config is “1.0.0”, plugin supports [“0.1.0” “0.2.0” “0.3.0” “0.3.1” “0.4.0”]。这个错误实在让人摸不着头脑,笔者对此也是一脸懵逼。等到笔者再次在这台服务器上成功拉起nginx容器,已经是第二天了。这可真是个不大不小的坑,谁掉进去都得脱层皮。所以把这个解决过程记录下来,以帮助其他遇到这个坑的同道尽快脱困。

1. 问题

在containerd环境中启动一个容器(如busybox,nginx等),报出incompatible CNI versions错误。如下:

$ sudo nerdctl run -d busybox
FATA[0000] failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: time="2023-06-10T11:13:54+08:00" level=fatal msg="failed to call cni.Setup: plugin type=\"bridge\" failed (add): incompatible CNI versions; config is \"1.0.0\", plugin supports [\"0.1.0\" \"0.2.0\" \"0.3.0\" \"0.3.1\" \"0.4.0\"]"
Failed to write to log, write /var/lib/nerdctl/1935db59/containers/default/4f806caefc70c47e41cd9f080f780946b680105ae0fc30cc0385fee5e68d9548/oci-hook.createRuntime.log: file already closed: unknown

2. 环境

发生错误的服务器长这样:

$ uname -a
Linux ubuntu-1 5.4.0-121-generic #137-Ubuntu SMP Wed Jun 15 13:33:07 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ sudo nerdctl version
Client:
 Version:       v0.20.0
 OS/Arch:       linux/amd64
 Git commit:    e77e05b5fd252274e3727e0439e9a2d45622ccb9

Server:
 containerd:
  Version:      1.6.6
  GitCommit:    10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1

#这台机器其实是一个k8s集群的节点,这个集群已经没什么用了,不过也没有关掉。
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:20:54Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}

3. 无效的解决方法

直接在网上搜索”incompatible CNI versions; config is “1.0.0”, plugin supports [“0.1.0” “0.2.0” “0.3.0” “0.3.1” “0.4.0”]“,可以找到一篇官方的针对这个错误的文章:这里。主要意思就是把所有的容器啊插件啊什么的都升级,然后根据他给的模板更新/etc/cni/net.d/下的配置文件。文章并未给出具体要升级的插件清单,只是一句话,就全给我更新到最新版本。
k8s + containerd下,容器启动时报错 failed to create shim task, incompatible CNI versions 问题解决_第1张图片
笔者看到这里也有点想骂娘,不过由于笔者的containerd是1.6.6,这里说是1.6.0-1.6.3,所以估计不是在说我吧。所以决定先跳过这一步先往下走,毕竟不会做的题就先跳过的优良传统不能丢。先把配置文件改一下看看。官方给的模板长这样:
k8s + containerd下,容器启动时报错 failed to create shim task, incompatible CNI versions 问题解决_第2张图片
笔者的containerd当时的网络插件是用的cni-flannel。所以文件名和例子给的有点不一样。

$ sudo ls /etc/cni/net.d
10-flannel.conflist

根据例子一顿爆改之后各种重启不提。再次尝试拉起busybox:

$ sudo nerdctl run busybox
FATA[0001] failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: time="2023-06-10T12:00:12+08:00" level=fatal msg="failed to call cni.Setup: plugin type=\"bridge\" failed (add): incompatible CNI versions; config is \"1.0.0\", plugin supports [\"0.1.0\" \"0.2.0\" \"0.3.0\" \"0.3.1\" \"0.4.0\"]"
Failed to write to log, write /var/lib/nerdctl/1935db59/containers/default/fb4f5fd84c5432f7e1448e948479b5694cddc6affc28091cfd0d3e2659671a2d/oci-hook.createRuntime.log: file already closed: unknown

一声叹息。。。
然后还尝试了包括升级flannel等各种折腾,也没用。如果有人看到这里,可以先别学笔者这么干。

4. 有用的解决方法

真正对笔者有用的方法来源于这篇文章。有多个相同内容的文章,真实出处笔者并未细考。在此鸣谢当初的那位作者了。说来也简单,就是服务器中的cni插件版本过于陈旧了。只要把新版本的cni插件部署进去就可以了。

# 下载包
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz

# 备份一下驱动
mv /opt/cni/bin /opt/cni/bin.bak

# 解压到指定目录
tar -zxvf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin 

搞定

$ sudo nerdctl run -it busybox
/ # 

你可能感兴趣的:(kubernetes,linux,运维,docker,cni,flannel)