# 报错内容

1
Warning  FailedCreatePodSandBox  5m17s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "1ded5da71b38996763e74f28f609d8d8f26a4cc1e4fdd3272312bf3e168e4111": 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"]

# 部署的环境

1
2
centos 8
kubernetes 1.24.3

# 解决问题

这个问题的主要内容是: incompatible CNI versions . 当你去网上去搜索解决方案大都是 说 使用 containerd 的版本不对,也就是说,确实是 CNI 的版本是有问题的。

具体的解决方案在官方网站中是这样说的:

具体内容可以看这里:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/troubleshooting-cni-plugin-related-errors/#updating-your-cni-plugins-and-cni-config-files

首先可以查看 当前的 containerd 的版本.

1
2
[root@k8s-master-01 ~]# containerd -v
containerd github.com/containerd/containerd v1.6.4 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16

不在 v1.6.0-v1.6.3 中。 文档中说 在 v1.6.4 版本中已经修复了这个问题.

查看 /etc/cni/net.d/10-containerd-net.conflist 这个文件, cni 版本 "cniVersion": "1.0.0", , 也确实是 1.0.0

继续搜索

https://github.com/containerd/containerd/issues/6876 中,有一个人遇到了 v1.6.4 版本中出现了 incompatible CNI versions 这个问题。

仔细看他的这个问题,是我遇到的这个问题是一样的 plugins type='bridge' . 而这个 issure 中提到的问题,是当 plugins type = 'loooback' . 这也是上图中 hakman 提到的。

仔细看 mikebrow 所说的,需要安装一个 1.0.0 版本的 bridge .

那就在网络中搜索 : k8s 是安装 bridge , 在 https://blog.csdn.net/m0_48594855/article/details/107870839 看到 安装 bridge 的方法,他这里是使用 git 仓库 源码编译。其实直接打开 git 仓库 https://github.com/containernetworking/plugins/releases/tag/v1.1.1 下载对应版本即可, 今天是 2022722 日,我就下载了最新的一版本。

简单粗暴的 /opt/cni/bin/ 下的内容,全部替换掉,然后重启 kubelet 服务就可以了。

1
2
3
4
5
6
7
8
9
10
11
# 下载包
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

# 重启 kubelet
systemctl restart kubelet

然后再所有的节点上都执行一遍上面的内容,然后就可以了。

可以通过 kubectl describe pod 查看下是否开始下载镜像了。

# 问题解决思路

  • 先看下 contrainerd 版本是否 >=1.6.4
  • 如果 <=1.6.3 那么就需要升级 contrainerd 运行环境.
  • 如果还有这样的问题,那就是要看下对应的插件类型是否满足版本要求了。
  • 如果不满足,那就重新安装下对应的插件就行了,比如我的问题中的 bridge 插件。

# 举一反三

假设有一棵树,那个问题只是这棵树的一片叶子, 这里面还涉及到很多 k8s 的概念性的东西。比如 CNI 网络插件都有什么,每种插件的功能是什么,以及对应的网络驱动是什么,比如 Calico , fannel , bridgeCNIcontainerd , cri-o 都是什么关系。所以,要从根儿上去理解这些概念。 废话不多说,下篇文章见。

# 参考文档

1、https://github.com/containerd/containerd/issues/6876
2、https://blog.csdn.net/m0_48594855/article/details/107870839
3、https://github.com/containernetworking/plugins/releases/tag/v1.1.1
4、https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/troubleshooting-cni-plugin-related-errors/#updating-your-cni-plugins-and-cni-config-files