重学容器15: nerdctl创建容器时指定容器连接的网络
2021-06-13
通过上节内容的学习,nerdctl在启动容器时连接的网络默认是bridge,除此之外还可以使用--net
选项指定其他网络模式。
1--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
目录下配置的其他网络。
1ls /etc/cni/net.d
210-containerd-net.conflist
10-containerd-net.conflist
的内容如下:
1{
2 "cniVersion": "0.4.0",
3 "name": "containerd-net",
4 "plugins": [
5 {
6 "type": "bridge",
7 "bridge": "cni0",
8 "isGateway": true,
9 "ipMasq": true,
10 "promiscMode": true,
11 "ipam": {
12 "type": "host-local",
13 "ranges": [
14 [{
15 "subnet": "10.88.0.0/16"
16 }],
17 [{
18 "subnet": "2001:4860:4860::/64"
19 }]
20 ],
21 "routes": [
22 { "dst": "0.0.0.0/0" },
23 { "dst": "::/0" }
24 ]
25 }
26 },
27 {
28 "type": "portmap",
29 "capabilities": {"portMappings": true}
30 }
31 ]
32}
从上面的json配置文件中可以看出containerd-net
配置也是一个bridge网络,网桥的名称为cni0。
可以使用nerdctl启动容器并连接containerd-net:
1nerdctl 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地址。