3.2. 使用其他 CNI 插件创建二级网络


以下部分介绍了二级网络的具体配置字段。

3.2.1. 配置桥接二级网络

以下对象描述了 Bridge CNI 插件的配置参数:

Expand
表 3.3. bridge CNI 插件 JSON 配置对象
字段类型描述

cniVersion

string

CNI 规格版本。需要 0.3.1 值。

name

string

您之前为 CNO 配置提供的 name 参数的值。

type

string

用于配置的 CNI 插件的名称:bridge

ipam

object

IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。

bridge

string

可选:指定要使用的虚拟网桥名称。如果主机上不存在网桥接口,则进行创建。默认值为 cni0

ipMasq

布尔值

可选:设置为 true,为离开虚拟网络的流量启用 IP 伪装。所有流量的源 IP 地址都会改写为网桥 IP 地址。如果网桥没有 IP 地址,此设置无效。默认值为 false

isGateway

布尔值

可选:设置为 true,从而为网桥分配 IP 地址。默认值为 false

isDefaultGateway

布尔值

可选:设置为 true,将网桥配置为虚拟网络的默认网关。默认值为 false。如果 isDefaultGateway 设置为 true,则 isGateway 也会自动设置为 true

forceAddress

布尔值

可选:设置为 true,以允许将之前分配的 IP 地址分配给虚拟网桥。设置为 false 时,如果将来自于重叠子集的 IPv4 地址或者 IPv6 地址分配给虚拟网桥,则会发生错误。默认值为 false

hairpinMode

布尔值

可选:设置为 true,以允许虚拟网桥通过收到它的虚拟端口将其发回。这个模式也被称为反射中继。默认值为 false

promiscMode

布尔值

可选:设置为 true 以在网桥上启用混杂模式。默认值为 false

vlan

string

可选:指定一个虚拟 LAN (VLAN) 标签作为整数值。默认情况下不分配 VLAN 标签。

preserveDefaultVlan

string

可选:指示在连接到网桥的 veth 端是否保留默认 vlan。默认值为 true。

vlanTrunk

list

可选:分配 VLAN 中继标签。默认值为 none

mtu

整数

可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。

enabledad

布尔值

可选:为容器侧 veth 启用重复的地址检测。默认值为 false

macspoofchk

布尔值

可选:启用 mac spoof 检查,将来自容器的流量限制为接口的 mac 地址。默认值为 false

注意

VLAN 参数在 veth 的主机端配置 VLAN 标签,并在网桥接口上启用 vlan_filtering 功能。

注意

要为 L2 网络配置 uplink,您必须使用以下命令在 uplink 接口上允许 VLAN:

$  bridge vlan add vid VLAN_ID dev DEV
Copy to Clipboard Toggle word wrap

3.2.1.1. Bridge CNI 插件配置示例

以下示例配置了一个名为 bridge-net 的二级网络:

{
  "cniVersion": "0.3.1",
  "name": "bridge-net",
  "type": "bridge",
  "isGateway": true,
  "vlan": 2,
  "ipam": {
    "type": "dhcp"
    }
}
Copy to Clipboard Toggle word wrap

3.2.2. 配置 Bond CNI 二级网络

Bond Container Network Interface (Bond CNI)允许将多个网络接口聚合到一个逻辑"bonded"接口中,从而增强网络冗余和容错。只有 SR-IOV 虚拟功能(VF)支持使用此插件绑定。

下表描述了 Bond CNI 插件的配置参数:

Expand
表 3.4. bond CNI 插件 JSON 配置对象
字段类型描述

name

string

指定提供给此 CNI 网络附加定义的名称。此名称用于识别和引用容器内的接口。

cniVersion

string

CNI 规格版本。

type

string

指定要配置的 CNI 插件的名称: bond

miimon

string

以毫秒为单位指定地址解析协议(ARP)链路监控频率。此参数定义绑定接口发送 ARP 请求的频率,以检查其聚合接口的可用性。

mtu

整数

可选:指定绑定的最大传输单元(MTU)。默认值为 1500。

failOverMac

整数

可选:指定绑定的 failOverMac 设置。默认值为 0。

模式

string

指定绑定策略。

linksInContainer

布尔值

可选:指定是否应在绑定启动时直接在容器网络命名空间内创建用于绑定的网络接口。如果为 false (默认值),CNI 插件在尝试形成绑定前首先在主机系统上查找这些接口。

links

object

指定要绑定的接口。

ipam

object

IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。

3.2.2.1. bond CNI 插件配置示例

以下示例配置了一个名为 bond-net1 的二级网络:

{
 "type": "bond",
 "cniVersion": "0.3.1",
 "name": "bond-net1",
 "mode": "active-backup",
 "failOverMac": 1,
 "linksInContainer": true,
 "miimon": "100",
 "mtu": 1500,
 "links": [
       {"name": "net1"},
       {"name": "net2"}
   ],
  "ipam": {
        "type": "host-local",
        "subnet": "10.56.217.0/24",
        "routes": [{
        "dst": "0.0.0.0/0"
        }],
        "gateway": "10.56.217.1"
    }
}
Copy to Clipboard Toggle word wrap

3.2.3. 主机设备二级网络配置

注意

仅设置以下参数之一来指定您的网络设备:devicehwaddrkernelpathpciBusID

以下对象描述了 host-device CNI 插件的配置参数:

Expand
表 3.5. 主机 device CNI 插件 JSON 配置对象
字段类型描述

cniVersion

string

CNI 规格版本。需要 0.3.1 值。

name

string

您之前为 CNO 配置提供的 name 参数的值。

type

string

用于配置的 CNI 插件的名称:host-device

device

string

可选:设备的名称,如 eth0

hwaddr

string

可选:设备硬件 MAC 地址。

kernelpath

string

可选:Linux 内核设备路径,如 /sys/devices/pci0000:00/0000:00:1f.6

pciBusID

string

可选:网络设备的 PCI 地址,如 0000:00:1f.6

3.2.3.1. host-device 配置示例

以下示例配置了一个名为 hostdev-net 的二级网络:

{
  "cniVersion": "0.3.1",
  "name": "hostdev-net",
  "type": "host-device",
  "device": "eth1"
}
Copy to Clipboard Toggle word wrap

3.2.4. 配置 VLAN 二级网络

以下对象描述了 VLAN, vlan, CNI 插件的配置参数:

Expand
表 3.6. VLAN CNI 插件 JSON 配置对象
字段类型描述

cniVersion

string

CNI 规格版本。需要 0.3.1 值。

name

string

您之前为 CNO 配置提供的 name 参数的值。

type

string

要配置的 CNI 插件的名称:vlan

master

string

与网络附加关联的以太网接口。如果没有指定 master,则使用默认网络路由的接口。

vlanId

整数

设置 vlan 的 ID。

ipam

object

IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。

mtu

整数

可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。

dns

整数

可选:要返回的 DNS 信息。例如,优先排序的 DNS 名称服务器列表。

linkInContainer

布尔值

可选:指定 master 接口是否在容器网络命名空间中或主网络命名空间。将值设为 true 以请求使用容器命名空间 master 接口。

重要

具有 vlan 配置的 NetworkAttachmentDefinition 自定义资源定义(CRD)只能在节点上的单个 pod 上使用,因为 CNI 插件无法在同一 接口上创建多个 vlanIdvlan 子接口。

3.2.4.1. VLAN 配置示例

以下示例演示了一个带有名为 vlan-net 的二级网络的 vlan 配置:

{
  "name": "vlan-net",
  "cniVersion": "0.3.1",
  "type": "vlan",
  "master": "eth0",
  "mtu": 1500,
  "vlanId": 5,
  "linkInContainer": false,
  "ipam": {
      "type": "host-local",
      "subnet": "10.1.1.0/24"
  },
  "dns": {
      "nameservers": [ "10.1.1.1", "8.8.8.8" ]
  }
}
Copy to Clipboard Toggle word wrap

3.2.5. 配置 IPVLAN 二级网络

以下对象描述了 IPVLAN, ipvlan, CNI 插件的配置参数:

Expand
表 3.7. IPVLAN CNI 插件 JSON 配置对象
字段类型描述

cniVersion

string

CNI 规格版本。需要 0.3.1 值。

name

string

您之前为 CNO 配置提供的 name 参数的值。

type

string

要配置的 CNI 插件的名称:ipvlan

ipam

object

IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。除非插件被串联,否则需要此项。

模式

string

可选:虚拟网络的操作模式。这个值必须是 l2l3l3s。默认值为 l2

master

string

可选:与网络附加关联的以太网接口。如果没有指定 master,则使用默认网络路由的接口。

mtu

整数

可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。

linkInContainer

布尔值

可选:指定 master 接口是否在容器网络命名空间中或主网络命名空间。将值设为 true 以请求使用容器命名空间 master 接口。

重要
  • ipvlan 对象不允许虚拟接口与 master 接口通信。因此,容器无法使用 ipvlan 接口来访问主机。确保容器加入提供主机连接的网络,如支持 Precision Time Protocol (PTP) 的网络。
  • 单个 master 接口无法同时配置为使用 macvlanipvlan
  • 对于不能与接口无关的 IP 分配方案,可以使用处理此逻辑的较早插件来串联 ipvlan 插件。如果省略 master,则前面的结果必须包含一个接口名称,以便 ipvlan 插件进行 enslave。如果省略 ipam,则使用前面的结果来配置 ipvlan 接口。

3.2.5.1. IPVLAN CNI 插件配置示例

以下示例配置了名为 ipvlan-net 的二级网络:

{
  "cniVersion": "0.3.1",
  "name": "ipvlan-net",
  "type": "ipvlan",
  "master": "eth1",
  "linkInContainer": false,
  "mode": "l3",
  "ipam": {
    "type": "static",
    "addresses": [
       {
         "address": "192.168.10.10/24"
       }
    ]
  }
}
Copy to Clipboard Toggle word wrap

3.2.6. 配置 MACVLAN 二级网络

以下对象描述了 MAC Virtual LAN (MACVLAN) Container Network Interface (CNI) 插件的配置参数:

Expand
表 3.8. MACVLAN CNI 插件 JSON 配置对象
字段类型描述

cniVersion

string

CNI 规格版本。需要 0.3.1 值。

name

string

您之前为 CNO 配置提供的 name 参数的值。

type

string

用于配置的 CNI 插件的名称:macvlan

ipam

object

IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。

模式

string

可选:配置虚拟网络上的流量可见性。必须是 bridgepassthruprivateVepa。如果没有提供值,则默认值为 bridge

master

string

可选:与新创建的 macvlan 接口关联的主机网络接口。如果没有指定值,则使用默认路由接口。

mtu

整数

可选:将最大传输单元 (MTU) 到指定的值。默认值由内核自动设置。

linkInContainer

布尔值

可选:指定 master 接口是否在容器网络命名空间中或主网络命名空间。将值设为 true 以请求使用容器命名空间 master 接口。

注意

如果您为插件配置指定 master key,请使用与主网络插件关联的物理网络接口,以避免可能冲突。

3.2.6.1. MACVLAN CNI 插件配置示例

以下示例配置了名为 macvlan-net 的二级网络:

{
  "cniVersion": "0.3.1",
  "name": "macvlan-net",
  "type": "macvlan",
  "master": "eth1",
  "linkInContainer": false,
  "mode": "bridge",
  "ipam": {
    "type": "dhcp"
    }
}
Copy to Clipboard Toggle word wrap

3.2.7. 配置 TAP 二级网络

以下对象描述了TAP CNI 插件的配置参数:

Expand
表 3.9. TAP CNI 插件 JSON 配置对象
字段类型描述

cniVersion

string

CNI 规格版本。需要 0.3.1 值。

name

string

您之前为 CNO 配置提供的 name 参数的值。

type

string

要配置的 CNI 插件的名称:tap

mac

string

可选:为接口请求指定的 MAC 地址。

mtu

整数

可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。

selinuxcontext

string

可选:与 tap 设备关联的 SELinux 上下文。

注意

OpenShift Container Platform 需要 system_u:system_r:container_t:s0 的值。

multiQueue

布尔值

可选:设置为 true 以启用多队列。

owner

整数

可选:拥有 tap 设备的用户。

group

整数

可选:拥有 tap 设备的组。

bridge

string

可选:将 tap 设备设置为已存在的网桥的端口。

3.2.7.1. tap 配置示例

以下示例配置了一个名为 mynet 的二级网络:

{
 "name": "mynet",
 "cniVersion": "0.3.1",
 "type": "tap",
 "mac": "00:11:22:33:44:55",
 "mtu": 1500,
 "selinuxcontext": "system_u:system_r:container_t:s0",
 "multiQueue": true,
 "owner": 0,
 "group": 0
 "bridge": "br1"
}
Copy to Clipboard Toggle word wrap

3.2.7.2. 为TAP CNI 插件设置 SELinux 布尔值

要使用 container_t SELinux 上下文创建 tap 设备,请使用 Machine Config Operator (MCO) 在主机上启用 container_use_devices 布尔值。

先决条件

  • 已安装 OpenShift CLI(oc)。

流程

  1. 创建一个新的 YAML 文件,如 setsebool-container-use-devices.yaml,详情如下:

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 99-worker-setsebool
    spec:
      config:
        ignition:
          version: 3.2.0
        systemd:
          units:
          - enabled: true
            name: setsebool.service
            contents: |
              [Unit]
              Description=Set SELinux boolean for the TAP CNI plugin
              Before=kubelet.service
    
              [Service]
              Type=oneshot
              ExecStart=/usr/sbin/setsebool container_use_devices=on
              RemainAfterExit=true
    
              [Install]
              WantedBy=multi-user.target graphical.target
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建新的 MachineConfig 对象:

    $ oc apply -f setsebool-container-use-devices.yaml
    Copy to Clipboard Toggle word wrap
    注意

    MachineConfig 对象应用任何更改将导致所有受影响的节点在应用更改后安全重启。此更新可能需要一些时间才能应用。

  3. 运行以下命令验证是否应用了更改:

    $ oc get machineconfigpools
    Copy to Clipboard Toggle word wrap

    预期输出

    NAME        CONFIG                                                UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
    master      rendered-master-e5e0c8e8be9194e7c5a882e047379cfa      True      False      False      3              3                   3                     0                      7d2h
    worker      rendered-worker-d6c9ca107fba6cd76cdcbfcedcafa0f2      True      False      False      3              3                   3                     0                      7d
    Copy to Clipboard Toggle word wrap

    注意

    所有节点都应处于更新和就绪状态。

以下对象描述了 route-override CNI 插件的配置参数:

Expand
表 3.10. Route override CNI 插件 JSON 配置对象
字段类型描述

type

string

要配置的 CNI 插件的名称:route-override

flushroutes

布尔值

可选:设置为 true 以清除任何现有路由。

flushgateway

布尔值

可选:设置为 true 以清除网关路由名称。

delroutes

object

可选:指定要从容器命名空间中删除的路由列表。

addroutes

object

可选:指定要添加到容器命名空间的路由列表。每个路由都是带有 dst 和可选的 gw 字段的字典。如果省略 gw,则插件将使用默认网关值。

skipcheck

布尔值

可选:将其设置为 true 以跳过 check 命令。默认情况下,CNI 插件会在容器生命周期内验证网络设置。当使用 route-override 动态修改路由时,跳过此检查可确保最终配置反映了更新的路由。

3.2.8.1. route-override 插件配置示例

route-override CNI 是一个 CNI 类型,它旨在与父 CNI 串联时使用。它不能独立操作,依赖于父 CNI 来首先创建网络接口并分配 IP 地址,然后才能修改路由规则。

以下示例配置了一个名为 mymacvlan 的二级网络。父 CNI 创建一个附加到 eth1 的网络接口,并使用 host-local IPAM 在 192.168.1.0/24 范围内分配一个 IP 地址。然后,route-override CNI 链接到父 CNI,并通过清除现有路由来修改路由规则,删除到 192.168.0.0/24 的路由,并使用自定义网关为 192.168.0.0/24 添加新路由。

{
    "cniVersion": "0.3.0",
    "name": "mymacvlan",
    "plugins": [
        {
            "type": "macvlan",         
1

            "master": "eth1",
            "mode": "bridge",
            "ipam": {
                "type": "host-local",
                "subnet": "192.168.1.0/24"
            }
        },
        {
            "type": "route-override",    
2

            "flushroutes": true,
            "delroutes": [
                {
                    "dst": "192.168.0.0/24"
                }
            ],
            "addroutes": [
                {
                    "dst": "192.168.0.0/24",
                    "gw": "10.1.254.254"
                }
            ]
        }
    ]
}
Copy to Clipboard Toggle word wrap
1
父 CNI 创建一个附加到 eth1 的网络接口。
2
串联的 route-override CNI 会修改路由规则。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat