通过上节内容的学习,nerdctl在启动容器时连接的网络默认是bridge,除此之外还可以使用--net选项指定其他网络模式。

1
--network value, --net value  Connect a container to a network ("bridge"|"host"|"none") (default: "bridge")

从nerdctl命令的帮助中给出了使用--net选项指定启动容器时连接的网络,默认是brdige,另外还可以选择nonehost。 因为容器连接的网络是由CNI插件实现的,所以除了bridge, host, none这3个选项外,还可以指定手动添加的CNI配置。 下面分别看一下这几种不同的网络。

bridge网络

bridge网络上一节已经学习过,这里做个复习。 此网络下nerdctl创建的容器会连接到nerdctl0网桥,所有的容器处于同一个子网内,网桥还连接宿主机的network namespace,这样容器的子网可以与宿主机之间通信。

none网络

none网络很好理解,就是容器只有自己的network namespace,而不会配置连接其他网络,容器除了自身network namespace自带的lo网卡(127.0.0.1)外不会配置其他网卡。nerdctl run --network none ...相当于直接使用ctr run而不指定--with-ns选项不会连接其他网络。

host网络

host网络就是容器和宿主机都在宿主机的network namespace内,和宿主机使用相同的网络协议栈,共享网卡、ip、端口。这种模式的缺点是容器没有进行网络隔离。

手动添加的CNI配置

nerdctl在启动容器时还可以使用--net选项指定/etc/cni/net.d目录下配置的其他网络。

1
2
ls /etc/cni/net.d
10-containerd-net.conflist

10-containerd-net.conflist的内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
  "cniVersion": "0.4.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:4860:4860::/64"
          }]
        ],
        "routes": [
          { "dst": "0.0.0.0/0" },
          { "dst": "::/0" }
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    }
  ]
}

从上面的json配置文件中可以看出containerd-net配置也是一个bridge网络,网桥的名称为cni0。

可以使用nerdctl启动容器并连接containerd-net:

1
nerdctl run -d --name redis --network containerd-net redis:alpine3.13

再次印证了containerd容器的网络都是由cni插件提供的,只是nerdctl内置了一种bridge网络配置,我们也可以自己配置。

跨主机通信的网络

使用bridge网络的容器无法跨多个宿主机进行通信,跨主机通信需要借助其他的cni插件,例如k8s pod网络的一些常用的网络组件calico、flannel等等。 这些网络组件大多使用了多种网络工作模式,在学习这些网络组件之前,还需要理解以下的网络模式:

  • overlay: Overlay网络需要建立在已有网络之上的虚拟网络,用于创建一个大型的跨主机的分布式网络,一般在overlay网络中,每个主机节点都有一个子网,用于在内部分配ip。
  • vxlan: vxlan即虚拟扩展本地局域网,VXLAN是一种封装和覆盖协议,可在现有网络上运行.它是一种overlay技术,通过三层的网络来搭建虚拟的二层网络。
  • bgp: bgp是边界网关协议,用于管理边缘路由器之间数据包的路由方式。BGP可以通过可用路径、路由规则以及特定网络策略,确定如何将数据包从一个网络发送到另一个网络。一些CNI插件会将bgp用作路由机制
  • macvlan: macvlan是linux内核的一个模块,提供网卡虚拟化功能,通过macvlan可以在一个物理网卡中虚拟出多个网卡,通过使用不同的mac地址在数据链路层进行数据转发,一块网卡配置了多个Mac地址。