codecamp

Kubernetes CNI插件相关错误故障排除

CNI 插件相关错误故障排除

为避免与 CNI 插件相关的错误,请确认您正在使用或升级到经过测试可与您的 Kubernetes 版本一起正常工作的容器运行时。

例如,以下容器运行时正在或已经为 Kubernetes v1.24 准备好:

  • containerd v1.6.4 及更高版本,v1.5.11 及更高版本
  • CRI-O v1.24.0 及更高版本

关于“CNI 版本不兼容”和“无法为沙盒销毁网络”错误

当 CNI 插件尚未升级和/或 CNI 配置版本未在 CNI 配置文件中声明时,在 containerd v1.6.0-v1.6.3 中存在 pod CNI 网络设置和拆除的服务问题。 containerd 团队报告说,“这些问题在 containerd v1.6.4 中得到解决。”

使用 containerd v1.6.0-v1.6.3,如果您不升级 CNI 插件和/或声明 CNI 配置版本,您可能会遇到以下“不兼容的 CNI 版本”或“无法为沙盒销毁网络”的错误情况。

CNI 版本不兼容错误

如果您的 CNI 插件版本与配置中的插件版本不正确匹配,因为配置版本晚于插件版本,则容器日志可能会在 pod 启动时显示类似于以下内容的错误消息:

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\"]"

沙盒错误导致网络破坏失败

如果 CNI 插件配置中缺少插件的版本,则 pod 可能会运行。 但是,停止 pod 会产生类似于以下内容的错误:

ERRO[2022-04-26T00:43:24.518165483Z] StopPodSandbox for "b" failed
error="failed to destroy network for sandbox \"bbc85f891eaf060c5a879e27bba9b6b06450210161dfdecfbb2732959fb6500a\": invalid version \"\": the version is empty"

此错误使 pod 处于未就绪状态,但仍附加网络命名空间。 要从此问题中恢复,请编辑 CNI 配置文件以添加缺少的版本信息。 下一次停止 pod 的尝试应该会成功。

更新 CNI 插件和 CNI 配置文件

如果您使用 containerd v1.6.0-v1.6.3 并遇到“不兼容的 CNI 版本”或“无法为沙盒销毁网络”错误,请考虑更新您的 CNI 插件并编辑 CNI 配置文件。

以下是每个节点的典型步骤的概述:

  1. 安全地排空并封锁节点。
  2. 停止容器运行时和 kubelet 服务后,执行以下升级操作:
    • 如果您正在运行 CNI 插件,请将它们升级到最新版本。
    • 如果您使用的是非 CNI 插件,请将它们替换为 CNI 插件。 使用最新版本的插件。
    • 更新插件配置文件以指定或匹配插件支持的 CNI 规范版本,如以下“容器配置文件示例”部分所示。
    • 对于 ​containerd​,请确保您已安装 CNI 环回插件的最新版本(v1.0.0 或更高版本)。
    • 将节点组件(例如 kubelet)升级到 Kubernetes v1.24
    • 升级到或安装最新版本的容器运行时。
  3. 通过重新启动容器运行时和 kubelet 将节点带回集群。 取消封锁节点(​kubectl uncordon <nodename>​)。

一个示例容器配置文件

以下示例显示了 ​containerd ​运行时 v1.6.x 的配置,它支持最新版本的 CNI 规范 (v1.0.0)。

有关配置系统的更多说明,请参阅您的插件和网络提供商的文档。

在 Kubernetes 上,containerd 运行时将环回接口 ​lo ​作为默认行为添加到 pod。 containerd 运行时通过 CNI 插件 ​loopback ​配置环回接口。 ​loopback ​插件作为具有 cni 名称的 ​containerd ​发布包的一部分分发。 ​containerd ​v1.6.0 及更高版本包括与 CNI v1.0.0 兼容的环回插件以及其他默认 ​CNI ​插件。 loopback 插件的配置由 containerd 内部完成,并设置为使用 CNI v1.0.0。这也意味着当这个更新版本的 ​containerd ​启动时,​loopback ​插件的版本必须是 v1.0.0 或更高版本。

以下 bash 命令生成示例 CNI 配置。在这里,配置版本的 1.0.0 值分配给 ​cniVersion ​字段,以供 ​containerd ​调用 CNI 桥接插件时使用。

cat << EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
 "cniVersion": "1.0.0",
 "name": "containerd-net",
 "plugins": [
   {
     "type": "bridge",
     "bridge": "cni0",
     "isGateway": true,
     "ipMasq": true,
     "promiscMode": true,
     "ipam": {
       "type": "host-local",
       "ranges": [
         [{
           "subnet": "10.88.0.0/16"
         }],
         [{
           "subnet": "2001:db8:4860::/64"
         }]
       ],
       "routes": [
         { "dst": "0.0.0.0/0" },
         { "dst": "::/0" }
       ]
     }
   },
   {
     "type": "portmap",
     "capabilities": {"portMappings": true}
   }
 ]
}
EOF

使用基于您的用例和网络寻址计划的 IP 地址范围更新前面示例中的 IP 地址范围。


Kubernetes 将Docker Engine节点从dockershim迁移到cri-dockerd
Kubernetes 查明节点上所使用的容器运行时
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Kubernetes 管理集群

Kubernetes Service

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }