通过上节内容的学习,nerdctl在启动容器时连接的网络默认是bridge,除此之外还可以使用--net选项指定其他网络模式。
--network value, --net value Connect a container to a network ("bridge"|"host"|"none") (default: "bridge")从nerdctl命令的帮助中给出了使用--net选项指定启动容器时连接的网络,默认是brdige,另外还可以选择none和host。
因为容器连接的网络是由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目录下配置的其他网络。
ls /etc/cni/net.d
10-containerd-net.conflist10-containerd-net.conflist的内容如下:
{
"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:
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地址。