在未使用Kubernates独立安装部署Containerd的场景下,可通过ctr命令启动容器或使用cni插件为Containerd容器配置网络,从而允许容器访问外部网络。
ctr启动容器命令时增加--net-host参数,使容器与宿主机共享网络,达到容器访问外部网络目的。
命令格式如下:
1 | ctr -n [NAMESPACE] run -d --net-host [IMAGE] [CONTAINER_NAME] |
通过cni插件借助bridge、veth peer技术使容器访问外部网络。此方式需提前准备cni插件和一些配置文件,并开启宿主机的IP转发功能。
若使用1.5.1版本cni插件,请将以下子插件配置文件中cniVersion字段的值替换为1.0.0。
准备三份“.conf”后缀的配置文件,分别作用于cni的bridge、portmap和firewall子插件,配置文件的内容需要符合json格式要求。
bridge.conf配置文件内容示例:
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 | { "cniVersion": "0.4.0", "name": "container-net-bridge", "type": "bridge", "bridge": "br0", "isGateway": true, "ipMasq": true, "hairpinMode": true, "ipam": { "type": "host-local", "routes": [ { "dst": "0.0.0.0/0" } ], "ranges": [ [ { "gateway": "x.x.0.1", "subnet": "x.x.0.0/24" } ] ] }, "dns": { "nameservers": ["8.8.8.8"] } } |
portmap.conf配置文件内容示例如下:
1 2 3 4 5 6 7 8 9 10 | { "cniVersion": "0.4.0", "name": "container-net-portmap", "type": "portmap", "prevResult": { }, "capabilities": { "portMappings": true } } |
firewall.conf配置文件内容示例如下:
1 2 3 4 5 6 7 8 | { "cniVersion": "0.4.0", "name": "container-net-firewall", "type": "firewall", "prevResult": { }, "ingressPolicy": "same-bridge" } |
1 | sysctl net.ipv4.conf.all.forwarding
|
返回信息为1表示已开启:
1 | net.ipv4.conf.all.forwarding = 1 |
返回信息为0表示未开启:
1 | net.ipv4.conf.all.forwarding = 0 |
开启宿主机IP转发功能:
1 | sysctl net.ipv4.conf.all.forwarding=1 |
若已准备上述文件并完成宿主机配置,可参考以下步骤完成cni插件的详细配置。
1 | ctr -n [NAMESPACE] task ls |
1 | CNI_COMMAND=ADD CNI_CONTAINERID=[容器ID] CNI_NETNS=/proc/[容器进程PID]/ns/net CNI_IFNAME=[虚拟网卡名称] CNI_PATH=[cni插件根目录] [bridge子插件绝对路径] < [预先准备的bridge配置文件绝对路径] |
命令使用示例:
1 | CNI_COMMAND=ADD CNI_CONTAINERID=container_cni_config_net CNI_NETNS=/proc/1234/ns/net CNI_IFNAME=eth0 CNI_PATH=/home/cni-plugins-v091 /home/cni-plugins-v091/bridge < /cni/net.d/containerd-net-bridge-040.conf |
返回信息如下:
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 33 34 35 36 | { "cniVersion": "0.4.0", "interfaces": [ { "name": "br0", "mac": "6a:42:22:2d:2a:5e" }, { "name": "veth9ccdc6d7", "mac": "0a:c2:80:43:99:33" }, { "name": "eth0", "mac": "c6:48:38:0d:52:34", "sandbox": "/proc/1234/ns/net" } ], "ips": [ { "version": "4", "interface": 2, "address": "x.x.0.2/24", "gateway": "x.x.0.1" } ], "routes": [ { "dst": "0.0.0.0/0" } ], "dns": { "nameservers": [ "8.8.8.8" ] } } |
将2中返回信息中的interfaces、ips、routes、dns内容拷贝至portmap配置文件和firewall配置文件中。
构造后的portmap配置文件示例:
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 33 34 35 36 37 38 39 40 41 42 43 | { "cniVersion": "0.4.0", "name": "containerd-net-portmap", "type": "portmap", "prevResult": { "interfaces": [ { "name": "br0", "mac": "6a:42:22:2d:2a:5e" }, { "name": "veth9ccdc6d7", "mac": "0a:c2:80:43:99:33" }, { "name": "eth0", "mac": "c6:48:38:0d:52:34", "sandbox": "/proc/1234/ns/net" } ], "ips": [ { "version": "4", "interface": 2, "address": "x.x.0.2/24", "gateway": "x.x.0.1" } ], "routes": [ { "dst": "0.0.0.0/0" } ], "dns": { "nameservers": [ "8.8.8.8" ] } }, "capabilities": { "portMappings": true } } |
构造后的firewall配置文件示例:
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 33 34 35 36 37 38 39 40 41 | { "cniVersion": "0.4.0", "name": "containerd-net-firewall", "type": "firewall", "prevResult": { "interfaces": [ { "name": "br0", "mac": "6a:42:22:2d:2a:5e" }, { "name": "veth9ccdc6d7", "mac": "0a:c2:80:43:99:33" }, { "name": "eth0", "mac": "c6:48:38:0d:52:34", "sandbox": "/proc/1234/ns/net" } ], "ips": [ { "version": "4", "interface": 2, "address": "x.x.0.2/24", "gateway": "x.x.0.1" } ], "routes": [ { "dst": "0.0.0.0/0" } ], "dns": { "nameservers": [ "8.8.8.8" ] } }, "ingressPolicy": "same-bridge" } |
1 | CNI_COMMAND=ADD CNI_CONTAINERID=[容器ID] CNI_NETNS= /proc/[容器进程PID]/ns/net CNI_IFNAME=[虚拟网卡名称] CNI_PATH=[cni插件根目录] [portmap子插件绝对路径] < [修改后新的portmap配置文件绝对路径] |
命令使用示例:
1 | CNI_COMMAND=ADD CNI_CONTAINERID=container_cni_config_net CNI_NETNS=/proc/1234/ns/net CNI_IFNAME=eth0 CNI_PATH=/home/cni-plugins-v091 /home/cni-plugins-v091/portmap < /cni/net.d/containerd-net-portmap-040.conf |
此步骤的CNI_CONTAINERID、CNI_NETNS、CNI_IFNAME、CNI_PATH参数值需要与2中保持一致。
1 | CNI_COMMAND=ADD CNI_CONTAINERID=[容器ID] /proc/[容器进程PID]/ns/net CNI_IFNAME=[虚拟网卡名称] CNI_PATH=[cni插件根目录] [firewall子插件绝对路径] < [修改后新的firewall配置文件绝对路径] |
命令使用示例:
1 | CNI_COMMAND=ADD CNI_CONTAINERID=container_cni_config_net CNI_NETNS=/proc/1234/ns/net CNI_IFNAME=eth0 CNI_PATH=/home/cni-plugins-v091 /home/cni-plugins-v091/firewall < /cni/net.d/containerd-net-firewall-040.conf |
此步骤的CNI_CONTAINERID、CNI_NETNS、CNI_IFNAME、CNI_PATH参数值需要与2中保持一致。