容器网络配置

在未使用Kubernates独立安装部署Containerd的场景下,可通过ctr命令启动容器或使用cni插件为Containerd容器配置网络,从而允许容器访问外部网络。

ctr命令启动容器

ctr启动容器命令时增加--net-host参数,使容器与宿主机共享网络,达到容器访问外部网络目的。

命令格式如下:

1
ctr -n [NAMESPACE] run -d --net-host [IMAGE] [CONTAINER_NAME]

使用cni插件前准备

通过cni插件借助bridge、veth peer技术使容器访问外部网络。此方式需提前准备cni插件和一些配置文件,并开启宿主机的IP转发功能。

配置cni插件

若已准备上述文件并完成宿主机配置,可参考以下步骤完成cni插件的详细配置。

  1. 查看容器进程PID。

    1
    ctr -n [NAMESPACE] task ls
    

  2. 配置bridge子插件。

    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"
            ]
    }
    }
    

  3. 构造portmap配置文件和firewall配置文件。

    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"
    }
    

  4. 配置portmap子插件。

    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中保持一致。

  5. 配置firewall子插件。

    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中保持一致。