Containerd 是为了 kubernetes 设计的 CRI Runtime,没有独立的网络模块;但 Docker 在设计时带有自己的网络功能的,因此 docker 在创建 Pause 容器时,会进行 Docker 特有的网络设置。该设置导致和 Containerd 最大的区别是在不使用 IPv6 的情况下,Docker 会将容器 Network Namespace 中内核参数net.ipv6.conf.all.disable_ipv6 设置为1,也即关闭容器内的 ipv6 选项。
同样的 Pod 在 Docker 的节点上只开启了 IPv4,而在 Containerd 的节点上会同时开启 IPv4 和 IPv6。
同时开启 IPv4 和 IPv6 的情况中,DNS 解析可能会同时发出v4、v6两个版本的包。在某些情况,业务如果需要频繁进行 DNS 解析,可能会触发 DNS 解析库的 Bug(取决于 Pod 业务的实现时的依赖)。在 Containerd 节点上,可以通过给 Pod 添加 init container 来针对 Pod 关闭 IPv6 设置。代码如下: