鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

容器网络配置

在未使用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插件(https://github.com/containernetworking/plugins/releases),下载完成后将插件部署至containerd宿主机。
    • 低版本Containerd(1.4.x、1.5.x)推荐使用0.9.1版本cni插件,高版本Containerd(1.6.x及以上)推荐使用1.5.1版本cni插件。
    • 若使用包含插件的安装包(类似cri-containerd-cni-XXXXX.tar.gz)部署Containerd,则不需单独下载cni插件,请忽略此步骤。
  • 配置文件

    若使用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"
    }
    
  • 查看/开启宿主机的IP转发功能

    查看Containerd容器宿主机是否开启IP转发功能:

    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插件

若已准备上述文件并完成宿主机配置,可参考以下步骤完成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中保持一致。