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 配置文件。
以下是每个节点的典型步骤的概述:
- 安全地排空并封锁节点。
- 停止容器运行时和 kubelet 服务后,执行以下升级操作:
- 如果您正在运行 CNI 插件,请将它们升级到最新版本。
- 如果您使用的是非 CNI 插件,请将它们替换为 CNI 插件。 使用最新版本的插件。
- 更新插件配置文件以指定或匹配插件支持的 CNI 规范版本,如以下“容器配置文件示例”部分所示。
- 对于
containerd
,请确保您已安装 CNI 环回插件的最新版本(v1.0.0 或更高版本)。 - 将节点组件(例如 kubelet)升级到 Kubernetes v1.24
- 升级到或安装最新版本的容器运行时。
- 通过重新启动容器运行时和 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 地址范围。