22.2. 配置额外网络
作为集群管理员,您可以为集群配置额外网络。支持以下网络类型:
22.2.1. 管理额外网络的方法
您可以通过两种方法来管理额外网络的生命周期。每种方法都是相互排斥的,您一次只能使用一种方法来管理额外网络。对于任一方法,额外网络由您配置的 Container Network Interface(CNI)插件管理。
对于额外网络,IP 地址通过您配置为额外网络一部分的 IP 地址管理 (IPAM) CNI 插件来置备。IPAM 插件支持多种 IP 地址分配方法,包括 DHCP 和静态分配。
-
修改 Cluster Network Operator(CNO)配置:CNO 会自动创建和管理
NetworkAttachmentDefinition
对象。除了管理对象生命周期外,CNO 可以确保 DHCP 可用于使用 DHCP 分配的 IP 地址的额外网络。 -
应用 YAML 清单:您可以通过创建
NetworkAttachmentDefinition
对象直接管理额外网络。这个方法可以串联 CNI 插件。
当使用 OVN SDN 在 Red Hat OpenStack Platform (RHOSP) 中使用多个网络接口部署 OpenShift Container Platform 节点时,二级接口的 DNS 配置可能会优先于主接口的 DNS 配置。在这种情况下,删除附加到二级接口的子网 ID 的 DNS 名称服务器:
$ openstack subnet set --dns-nameserver 0.0.0.0 <subnet_id>
22.2.2. 配置额外网络附加
额外网络通过使用 k8s.cni.cncf.io
API 组中的 NetworkAttachmentDefinition
API 来配置。
请勿将任何敏感信息或机密存储在 NetworkAttachmentDefinition
对象中,因为此类信息可由项目管理用户访问。
下表中描述了 API 的配置:
字段 | 类型 | 描述 |
---|---|---|
|
| 额外网络的名称。 |
|
| 与对象关联的命名空间。 |
|
| JSON 格式的 CNI 插件配置。 |
22.2.2.1. 通过 Cluster Network Operator 配置额外网络
额外网络附加的配置作为 Cluster Network Operator(CNO)配置的一部分被指定。
以下 YAML 描述了使用 CNO 管理额外网络的配置参数:
Cluster Network Operator 配置
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: # ... additionalNetworks: 1 - name: <name> 2 namespace: <namespace> 3 rawCNIConfig: |- 4 { ... } type: Raw
22.2.2.2. 从 YAML 清单配置额外网络
从 YAML 配置文件指定额外网络的配置,如下例所示:
apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: <name> 1 spec: config: |- 2 { ... }
22.2.3. 额外网络类型的配置
以下部分介绍了额外网络的具体配置字段。
22.2.3.1. 配置桥接额外网络
以下对象描述了 bridge CNI 插件的配置参数:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNI 规格版本。需要 |
|
|
您之前为 CNO 配置提供的 |
|
|
用于配置的 CNI 插件的名称: |
|
| IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。 |
|
|
可选:指定要使用的虚拟网桥名称。如果主机上不存在网桥接口,则进行创建。默认值为 |
|
|
可选:设置为 |
|
|
可选:设置为 |
|
|
可选:设置为 |
|
|
可选:设置为 |
|
|
可选:设置为 |
|
|
可选:设置为 |
|
| 可选:指定一个虚拟 LAN (VLAN) 标签作为整数值。默认情况下不分配 VLAN 标签。 |
|
|
可选:指示在连接到网桥的 |
|
|
可选:分配 VLAN 中继标签。默认值为 |
|
| 可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。 |
|
|
可选:为容器侧 |
|
|
可选:启用 mac spoof 检查,将来自容器的流量限制为接口的 mac 地址。默认值为 |
VLAN 参数在 veth
的主机端配置 VLAN 标签,并在网桥接口上启用 vlan_filtering
功能。
要为 L2 网络配置 uplink,您需要使用以下命令在 uplink 接口上允许 vlan :
$ bridge vlan add vid VLAN_ID dev DEV
22.2.3.1.1. 网桥配置示例
以下示例配置了名为 bridge-net
的额外网络:
{ "cniVersion": "0.3.1", "name": "bridge-net", "type": "bridge", "isGateway": true, "vlan": 2, "ipam": { "type": "dhcp" } }
22.2.3.2. 主机设备额外网络配置
仅设置以下参数之一来指定您的网络设备:device
、hwaddr
、kernelpath
或 pciBusID
。
以下对象描述了 host-device CNI 插件的配置参数:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNI 规格版本。需要 |
|
|
您之前为 CNO 配置提供的 |
|
|
用于配置的 CNI 插件的名称: |
|
|
可选:设备的名称,如 |
|
| 可选:设备硬件 MAC 地址。 |
|
|
可选:Linux 内核设备路径,如 |
|
|
可选:网络设备的 PCI 地址,如 |
22.2.3.2.1. host-device 配置示例
以下示例配置了名为 hostdev-net
的额外网络:
{ "cniVersion": "0.3.1", "name": "hostdev-net", "type": "host-device", "device": "eth1" }
22.2.3.3. 配置 VLAN 额外网络
以下对象描述了 VLAN CNI 插件的配置参数:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNI 规格版本。需要 |
|
|
您之前为 CNO 配置提供的 |
|
|
要配置的 CNI 插件的名称: |
|
|
与网络附加关联的以太网接口。如果没有指定 |
|
| 设置 vlan 的 id。 |
|
| IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。 |
|
| 可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。 |
|
| 可选:返回的 DNS 信息,例如,用于优先级排序的 DNS 名称服务器列表。 |
|
|
可选:指定 master 接口是否在容器网络命名空间或主网络命名空间中。将值设为 |
22.2.3.3.1. VLAN 配置示例
以下示例配置了一个名为 vlan-net
的额外网络:
{ "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" ] } }
22.2.3.4. 配置 IPVLAN 额外网络
以下对象描述了 IPVLAN CNI 插件的配置参数:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNI 规格版本。需要 |
|
|
您之前为 CNO 配置提供的 |
|
|
要配置的 CNI 插件的名称: |
|
| IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。除非插件被串联,否则需要此项。 |
|
|
可选:虚拟网络的操作模式。这个值必须是 |
|
|
可选:与网络附加关联的以太网接口。如果没有指定 |
|
| 可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。 |
|
|
可选:指定 master 接口是否在容器网络命名空间或主网络命名空间中。将值设为 |
-
ipvlan
对象不允许虚拟接口与master
接口通信。因此,容器无法使用ipvlan
接口访问主机。确保容器加入提供主机连接的网络,如支持 Precision Time Protocol (PTP
) 的网络。 -
单个
master
接口无法同时配置为使用macvlan
和ipvlan
。 -
对于不能与接口无关的 IP 分配方案,可以使用处理此逻辑的较早插件来串联
ipvlan
插件。如果省略master
,则前面的结果必须包含一个接口名称,以便ipvlan
插件进行 enslave。如果省略ipam
,则使用前面的结果来配置ipvlan
接口。
22.2.3.4.1. ipvlan 配置示例
以下示例配置了名为 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" } ] } }
22.2.3.5. 配置 MACVLAN 额外网络
以下对象描述了 macvlan CNI 插件的配置参数:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNI 规格版本。需要 |
|
|
您之前为 CNO 配置提供的 |
|
|
用于配置的 CNI 插件的名称: |
|
| IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。 |
|
|
可选:配置虚拟网络上的流量可见性。必须是 |
|
| 可选:与新创建的 macvlan 接口关联的主机网络接口。如果没有指定值,则使用默认路由接口。 |
|
| 可选:将最大传输单元 (MTU) 到指定的值。默认值由内核自动设置。 |
|
|
可选:指定 master 接口是否在容器网络命名空间或主网络命名空间中。将值设为 |
如果您为插件配置指定 master
key,请使用与主网络插件关联的物理网络接口,以避免可能冲突。
22.2.3.5.1. macvlan 配置示例
以下示例配置了名为 macvlan-net
的额外网络:
{ "cniVersion": "0.3.1", "name": "macvlan-net", "type": "macvlan", "master": "eth1", "linkInContainer": false, "mode": "bridge", "ipam": { "type": "dhcp" } }
22.2.3.6. 配置 TAP 额外网络
以下对象描述了TAP CNI 插件的配置参数:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNI 规格版本。需要 |
|
|
您之前为 CNO 配置提供的 |
|
|
要配置的 CNI 插件的名称: |
|
| 可选:为接口请求指定的 MAC 地址。 |
|
| 可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。 |
|
| 可选:与 tap 设备关联的 SELinux 上下文。 注意
OpenShift Container Platform 需要 |
|
|
可选:设置为 |
|
| 可选:拥有 tap 设备的用户。 |
|
| 可选:拥有 tap 设备的组。 |
|
| 可选:将 tap 设备设置为已存在的网桥的端口。 |
22.2.3.6.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" }
22.2.3.6.2. 为TAP CNI 插件设置 SELinux 布尔值
要使用 container_t
SELinux 上下文创建 tap 设备,请使用 Machine Config Operator (MCO) 在主机上启用 container_use_devices
布尔值。
先决条件
-
已安装 OpenShift CLI(
oc
)。
流程
创建一个新的 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
运行以下命令来创建新的
MachineConfig
对象:$ oc apply -f setsebool-container-use-devices.yaml
注意对
MachineConfig
对象应用任何更改将导致所有受影响的节点在应用更改后安全重启。此更新可能需要一些时间才能应用。运行以下命令验证是否应用了更改:
$ oc get machineconfigpools
预期输出
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
注意所有节点都应处于更新和就绪状态。
其他资源
- 有关在节点上启用 SELinux 布尔值的更多信息,请参阅设置 SELinux 布尔值
22.2.3.7. 配置 OVN-Kubernetes 额外网络
Red Hat OpenShift Networking OVN-Kubernetes 网络插件允许为 pod 配置二级网络接口。要配置二级网络接口,您必须在 NetworkAttachmentDefinition
自定义资源(CR)中定义配置。
Pod 和多网络策略创建可能会处于待处理状态,直到节点的 OVN-Kubernetes control plane 代理处理了关联的 network-attachment-definition
CR。
您可以在 第 2 层 或 localnet 拓扑中配置 OVN-Kubernetes 额外网络。
- 第 2 层拓扑支持 east-west 集群流量,但不允许访问底层物理网络。
- localnet 拓扑允许连接到物理网络,但需要在集群节点上进行底层 Open vSwitch (OVS) 网桥的额外配置。
以下小节提供了 OVN-Kubernetes 当前允许从属网络的每个拓扑配置示例。
网络名称必须是唯一的。例如,不支持使用多个带有不同配置的 NetworkAttachmentDefinition
CR。
22.2.3.7.1. OVN-Kubernetes 额外网络支持的平台
您可以使用以下支持的平台使用 OVN-Kubernetes 额外网络:
- 裸机
- IBM Power®
- IBM Z®
- IBM® LinuxONE
- VMware vSphere
- Red Hat OpenStack Platform(RHOSP)
22.2.3.7.2. OVN-Kubernetes 网络插件 JSON 配置表
下表描述了 OVN-Kubernetes CNI 网络插件的配置参数:
字段 | 类型 | 描述 |
---|---|---|
|
|
CNI 规格版本。所需的值为 |
|
|
网络的名称。这些网络不是命名空间。例如,您可以有一个名为 |
|
|
用于配置的 CNI 插件的名称。这个值必须设置为 |
|
|
网络的拓扑配置。必须是 |
|
| 用于集群间的网络的子网。
对于 在省略时,实现网络的逻辑交换机仅提供第 2 层通信,用户必须为 pod 配置 IP 地址。端口安全只阻止 MAC 欺骗。 |
|
|
最大传输单元 (MTU)。默认值 |
|
|
包含此配置的网络附加定义对象的元数据 |
|
| 以逗号分隔的 CIDR 和 IP 地址列表。IP 地址从可分配的 IP 地址池中删除,永远不会传递给 pod。 |
|
|
如果拓扑设置为 |
22.2.3.7.3. 与多网络策略兼容
多网络策略 API 由 k8s.cni.cncf.io
API 组中的 MultiNetworkPolicy
自定义资源定义(CRD) 提供,与 OVN-Kubernetes 二级网络兼容。在定义网络策略时,可以使用的网络策略规则取决于 OVN-Kubernetes 二级网络是否定义了 subnets
字段。详情请查看下表:
指定的 subnets 字段 | 允许多网络策略选择器 |
---|---|
是 |
|
否 |
|
例如,只有在名为 blue2
的额外网络的额外网络中定义 subnets
字段时,以下多网络策略才有效:
使用 pod 选择器的多网络策略示例
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-same-namespace annotations: k8s.v1.cni.cncf.io/policy-for: blue2 spec: podSelector: ingress: - from: - podSelector: {}
以下示例使用 ipBlock
网络策略选择器,它始终对 OVN-Kubernetes 额外网络有效:
使用 IP 块选择器的多网络策略示例
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: ingress-ipblock annotations: k8s.v1.cni.cncf.io/policy-for: default/flatl2net spec: podSelector: matchLabels: name: access-control policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.200.0.0/30
22.2.3.7.4. 配置第 2 层切换拓扑
交换机(层 2)拓扑网络通过集群范围的逻辑交换机互连工作负载。此配置可用于 IPv6 和双栈部署。
第 2 层切换拓扑网络只允许在集群中的 pod 间传输数据数据包。
以下 JSON 示例配置交换的二级网络:
{ "cniVersion": "0.3.1", "name": "l2-network", "type": "ovn-k8s-cni-overlay", "topology":"layer2", "subnets": "10.100.200.0/24", "mtu": 1300, "netAttachDefName": "ns1/l2-network", "excludeSubnets": "10.100.200.0/29" }
22.2.3.7.5. 配置 localnet 拓扑
交换机 (localnet) 拓扑通过集群范围的逻辑交换机将工作负载互连到物理网络。
22.2.3.7.5.1. 配置 OVN-Kubernetes 额外网络的先决条件
- 已安装 NMState Operator。如需更多信息,请参阅关于 Kubernetes NMState Operator。
22.2.3.7.5.2. 配置 OVN-Kubernetes 额外网络映射
您必须将额外网络映射到 OVN 网桥,以将其用作 OVN-Kubernetes 额外网络。网桥映射允许网络流量访问物理网络。网桥映射将物理网络名称(也称为接口标签)与通过 Open vSwitch (OVS)创建的网桥相关联。
您可以创建一个 NodeNetworkConfigurationPolicy
对象( nmstate.io/v1
API 组的一部分),以声明性方式创建映射。此 API 由 NMState Operator 提供。通过使用此 API,您可以将网桥映射应用到与指定 nodeSelector
表达式匹配的节点,如 node-role.kubernetes.io/worker: ''
。
在附加额外网络时,您可以使用现有的 br-ex
网桥或创建新网桥。使用哪种方法取决于您的特定网络基础架构。
-
如果您的节点只包含一个网络接口,则必须使用现有的网桥。这个网络接口由 OVN-Kubernetes 拥有和管理,不得从
br-ex
网桥中删除它,或更改接口配置。如果您删除或更改网络接口,您的集群网络将停止工作。 - 如果您的节点包含多个网络接口,您可以将不同的网络接口附加到新网桥,并将该网络接口用于额外网络。这种方法可用于从主集群网络进行流量隔离。
localnet1
网络在以下示例中映射到 br-ex
网桥:
共享网桥的映射示例
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: mapping 1 spec: nodeSelector: node-role.kubernetes.io/worker: '' 2 desiredState: ovn: bridge-mappings: - localnet: localnet1 3 bridge: br-ex 4 state: present 5
在以下示例中,localnet2
网络接口连接到 ovs-br1
网桥。通过此附件,网络接口可作为额外网络提供给 OVN-Kubernetes 网络插件。
具有多个接口的节点映射示例
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: ovs-br1-multiple-networks 1 spec: nodeSelector: node-role.kubernetes.io/worker: '' 2 desiredState: interfaces: - name: ovs-br1 3 description: |- A dedicated OVS bridge with eth1 as a port allowing all VLANs and untagged traffic type: ovs-bridge state: up bridge: allow-extra-patch-ports: true options: stp: false port: - name: eth1 4 ovn: bridge-mappings: - localnet: localnet2 5 bridge: ovs-br1 6 state: present 7
- 1
- 配置对象的名称。
- 2
- 节点选择器指定要将节点网络配置策略应用到的节点。
- 3
- 新的 OVS 网桥,与 OVN-Kubernetes 用于所有集群流量的默认网桥分开。
- 4
- 主机系统上与这个新 OVS 网桥关联的网络设备。
- 5
- 流量转发到 OVS 网桥的额外网络的名称。此额外网络必须与定义 OVN-Kubernetes 额外网络的
NetworkAttachmentDefinition
对象的spec.config.name
字段的名称匹配。 - 6
- 节点上的 OVS 网桥的名称。只有在指定
state: present
时,才需要这个值。 - 7
- 映射的状态。需要是
present
(添加网桥)或absent
(删除网桥)。默认值存在
。
建议使用这个声明方法,因为 NMState Operator 将额外的网络配置应用到节点选择器指定的所有节点,并透明。
以下 JSON 示例配置 localnet 二级网络:
{ "cniVersion": "0.3.1", "name": "ns1-localnet-network", "type": "ovn-k8s-cni-overlay", "topology":"localnet", "subnets": "202.10.130.112/28", "vlanID": 33, "mtu": 1500, "netAttachDefName": "ns1/localnet-network" "excludeSubnets": "10.100.200.0/29" }
22.2.3.7.6. 为额外网络配置 pod
您必须通过 k8s.v1.cni.cncf.io/networks
注解来指定二级网络附加。
以下示例置备有两个二级附件的 pod,一个用于本指南中提供的每个附加配置。
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: l2-network name: tinypod namespace: ns1 spec: containers: - args: - pause image: k8s.gcr.io/e2e-test-images/agnhost:2.36 imagePullPolicy: IfNotPresent name: agnhost-container
22.2.3.7.7. 使用静态 IP 地址配置 pod
以下示例使用静态 IP 地址置备一个 pod。
- 您只能为第 2 层附加指定 pod 的从属网络附加的 IP 地址。
- 只有在附加配置没有功能子网时,才能为 pod 指定静态 IP 地址。
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "l2-network", 1 "mac": "02:03:04:05:06:07", 2 "interface": "myiface1", 3 "ips": [ "192.0.2.20/24" ] 4 } ]' name: tinypod namespace: ns1 spec: containers: - args: - pause image: k8s.gcr.io/e2e-test-images/agnhost:2.36 imagePullPolicy: IfNotPresent name: agnhost-container
22.2.4. 为额外网络配置 IP 地址分配
IP 地址管理 (IPAM) Container Network Interface (CNI) 插件为其他 CNI 插件提供 IP 地址。
您可以使用以下 IP 地址分配类型:
- 静态分配。
- 通过 DHCP 服务器进行动态分配。您指定的 DHCP 服务器必须可从额外网络访问。
- 通过 Whereabouts IPAM CNI 插件进行动态分配。
22.2.4.1. 静态 IP 地址分配配置
下表描述了静态 IP 地址分配的配置:
字段 | 类型 | 描述 |
---|---|---|
|
|
IPAM 地址类型。值必须是 |
|
| 指定分配给虚拟接口的 IP 地址的对象数组。支持 IPv4 和 IPv6 IP 地址。 |
|
| 指定要在 pod 中配置的路由的一组对象。 |
|
| 可选:指定 DNS 配置的对象数组。 |
address
数组需要带有以下字段的对象:
字段 | 类型 | 描述 |
---|---|---|
|
|
您指定的 IP 地址和网络前缀。例如:如果您指定 |
|
| 出口网络流量要路由到的默认网关。 |
字段 | 类型 | 描述 |
---|---|---|
|
|
CIDR 格式的 IP 地址范围,如 |
|
| 网络流量路由的网关。 |
字段 | 类型 | 描述 |
---|---|---|
|
| 用于发送 DNS 查询的一个或多个 IP 地址的数组。 |
|
|
要附加到主机名的默认域。例如,如果将域设置为 |
|
|
在 DNS 查找查询过程中,附加到非限定主机名(如 |
静态 IP 地址分配配置示例
{ "ipam": { "type": "static", "addresses": [ { "address": "191.168.1.7/24" } ] } }
22.2.4.2. 动态 IP 地址(DHCP)分配配置
以下 JSON 描述了使用 DHCP 进行动态 IP 地址地址分配的配置。
pod 在创建时获取其原始 DHCP 租期。该租期必须由集群中运行的一个小型的 DHCP 服务器部署定期续订。
要触发 DHCP 服务器的部署,您必须编辑 Cluster Network Operator 配置来创建 shim 网络附加,如下例所示:
shim 网络附加定义示例
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: additionalNetworks: - name: dhcp-shim namespace: default type: Raw rawCNIConfig: |- { "name": "dhcp-shim", "cniVersion": "0.3.1", "type": "bridge", "ipam": { "type": "dhcp" } } # ...
字段 | 类型 | 描述 |
---|---|---|
|
|
IPAM 地址类型。需要值 |
动态 IP 地址(DHCP)分配配置示例
{ "ipam": { "type": "dhcp" } }
22.2.4.3. 使用 Whereabouts 进行动态 IP 地址分配配置
Whereabouts CNI 插件允许在不使用 DHCP 服务器的情况下动态地将 IP 地址分配给额外网络。
下表描述了使用 Whereabouts 进行动态 IP 地址分配的配置:
字段 | 类型 | 描述 |
---|---|---|
|
|
IPAM 地址类型。需要 |
|
| CIDR 表示法中的 IP 地址和范围。IP 地址是通过这个地址范围来分配的。 |
|
| 可选: CIDR 标记中零个或更多 IP 地址和范围的列表。包含在排除地址范围中的 IP 地址。 |
使用 Whereabouts 的动态 IP 地址分配配置示例
{ "ipam": { "type": "whereabouts", "range": "192.0.2.192/27", "exclude": [ "192.0.2.192/30", "192.0.2.196/32" ] } }
22.2.4.4. 创建abouts-reconciler 守护进程集的位置
Whereabouts 协调器负责管理集群中 pod 的动态 IP 地址分配,使用 Whereabouts IP 地址管理 (IPAM) 解决方案。它确保每个 pod 从指定的 IP 地址范围中获取唯一的 IP 地址。它还会在 pod 删除或缩减时处理 IP 地址发行版本。
您还可以使用 NetworkAttachmentDefinition
自定义资源 (CR) 进行动态 IP 地址分配。
当您通过 Cluster Network Operator 配置一个额外的网络时,会自动创建 whereabouts-reconciler
守护进程集。从 YAML 清单配置额外网络时,它不会自动创建。
要触发 whereabouts-reconciler
守护进程集的部署,您必须通过编辑 Cluster Network Operator 自定义资源文件来手动创建一个 whereabouts-shim
网络附加。
使用以下步骤部署 whereabouts-reconciler
守护进程集。
流程
运行以下命令来编辑
Network.operator.openshift.io
自定义资源(CR):$ oc edit network.operator.openshift.io cluster
在自定义资源 (CR) 的
spec
定义中包含此示例 YAML extract 中显示的additionalNetworks
部分:apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster # ... spec: additionalNetworks: - name: whereabouts-shim namespace: default rawCNIConfig: |- { "name": "whereabouts-shim", "cniVersion": "0.3.1", "type": "bridge", "ipam": { "type": "whereabouts" } } type: Raw # ...
- 保存文件并退出文本编辑器。
运行以下命令,验证
whereabouts-reconciler
守护进程集是否已成功部署:$ oc get all -n openshift-multus | grep whereabouts-reconciler
输出示例
pod/whereabouts-reconciler-jnp6g 1/1 Running 0 6s pod/whereabouts-reconciler-k76gg 1/1 Running 0 6s pod/whereabouts-reconciler-k86t9 1/1 Running 0 6s pod/whereabouts-reconciler-p4sxw 1/1 Running 0 6s pod/whereabouts-reconciler-rvfdv 1/1 Running 0 6s pod/whereabouts-reconciler-svzw9 1/1 Running 0 6s daemonset.apps/whereabouts-reconciler 6 6 6 6 6 kubernetes.io/os=linux 6s
22.2.4.5. 配置 Whereabouts IP 协调器调度
Whereabouts IPAM CNI 插件每天运行 IP 协调器。此过程会清理任何已搁置的 IP 分配,搁置的 IP 分配可能会耗尽 IP 资源,并使新的 pod 无法获取分配给它们的 IP。
使用这个流程更改 IP 协调器运行的频率。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您已部署了
whereabouts-reconciler
守护进程集,whereabouts-reconciler
pod 已启动并正在运行。
流程
运行以下命令,使用 IP 协调器的特定 cron 表达式在
openshift-multus
命名空间中创建一个名为whereabouts-config
的ConfigMap
对象:$ oc create configmap whereabouts-config -n openshift-multus --from-literal=reconciler_cron_expression="*/15 * * * *"
此 cron 表达式表示 IP 协调器每 15 分钟运行一次。根据您的特定要求调整表达式。
注意whereabouts-reconciler
守护进程集只能使用包含五个星号的 cron 表达式模式。目前才不支持带有用于表示秒的第 6 个星号。运行以下命令,获取与
openshift-multus
命名空间中的whereabouts-reconciler
守护进程集和 pod 相关的资源信息。$ oc get all -n openshift-multus | grep whereabouts-reconciler
输出示例
pod/whereabouts-reconciler-2p7hw 1/1 Running 0 4m14s pod/whereabouts-reconciler-76jk7 1/1 Running 0 4m14s pod/whereabouts-reconciler-94zw6 1/1 Running 0 4m14s pod/whereabouts-reconciler-mfh68 1/1 Running 0 4m14s pod/whereabouts-reconciler-pgshz 1/1 Running 0 4m14s pod/whereabouts-reconciler-xn5xz 1/1 Running 0 4m14s daemonset.apps/whereabouts-reconciler 6 6 6 6 6 kubernetes.io/os=linux 4m16s
运行以下命令,以验证
whereabouts-reconciler
pod 是否运行带有配置的时间间隔的 IP 协调器:$ oc -n openshift-multus logs whereabouts-reconciler-2p7hw
输出示例
2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_33_54.1375928161": CREATE 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_33_54.1375928161": CHMOD 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..data_tmp": RENAME 2024-02-02T16:33:54Z [verbose] using expression: */15 * * * * 2024-02-02T16:33:54Z [verbose] configuration updated to file "/cron-schedule/..data". New cron expression: */15 * * * * 2024-02-02T16:33:54Z [verbose] successfully updated CRON configuration id "00c2d1c9-631d-403f-bb86-73ad104a6817" - new cron expression: */15 * * * * 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/config": CREATE 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_26_17.3874177937": REMOVE 2024-02-02T16:45:00Z [verbose] starting reconciler run 2024-02-02T16:45:00Z [debug] NewReconcileLooper - inferred connection data 2024-02-02T16:45:00Z [debug] listing IP pools 2024-02-02T16:45:00Z [debug] no IP addresses to cleanup 2024-02-02T16:45:00Z [verbose] reconciler success
22.2.4.6. 为动态分配双栈 IP 地址创建配置
双栈 IP 地址分配可使用 ipRanges
参数进行配置:
- IPv4 地址
- IPv6 地址
- 多个 IP 地址分配
流程
-
将
type
设置为whereabouts
。 使用
ipRanges
来分配 IP 地址,如下例所示:cniVersion: operator.openshift.io/v1 kind: Network =metadata: name: cluster spec: additionalNetworks: - name: whereabouts-shim namespace: default type: Raw rawCNIConfig: |- { "name": "whereabouts-dual-stack", "cniVersion": "0.3.1, "type": "bridge", "ipam": { "type": "whereabouts", "ipRanges": [ {"range": "192.168.10.0/24"}, {"range": "2001:db8::/64"} ] } }
- 将网络附加到 pod。如需更多信息,请参阅"将 pod 添加到额外网络"。
- 验证是否分配了所有 IP 地址。
运行以下命令,以确保 IP 地址被分配为元数据。
$ oc exec -it mypod -- ip a
其他资源
22.2.5. 使用 Cluster Network Operator 创建额外网络附加
Cluster Network Operator (CNO) 管理额外网络定义。当您指定要创建的额外网络时,CNO 会自动创建 NetworkAttachmentDefinition
对象。
不要编辑 Cluster Network Operator 所管理的 NetworkAttachmentDefinition
对象。这样做可能会破坏额外网络上的网络流量。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
可选:为额外网络创建命名空间:
$ oc create namespace <namespace_name>
要编辑 CNO 配置,请输入以下命令:
$ oc edit networks.operator.openshift.io cluster
通过为您要创建的额外网络添加配置来修改您要创建的 CR,如下例所示。
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: # ... additionalNetworks: - name: tertiary-net namespace: namespace2 type: Raw rawCNIConfig: |- { "cniVersion": "0.3.1", "name": "tertiary-net", "type": "ipvlan", "master": "eth1", "mode": "l2", "ipam": { "type": "static", "addresses": [ { "address": "192.168.1.23/24" } ] } }
- 保存您的更改,再退出文本编辑器以提交更改。
验证
通过运行以下命令确认 CNO 创建了
NetworkAttachmentDefinition
对象。CNO 创建对象之前可能会有延迟。$ oc get network-attachment-definitions -n <namespace>
其中:
<namespace>
- 指定添加到 CNO 配置中的网络附加的命名空间。
输出示例
NAME AGE test-network-1 14m
22.2.6. 通过应用 YAML 清单来创建额外网络附加
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
使用额外网络配置创建 YAML 文件,如下例所示:
apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: next-net spec: config: |- { "cniVersion": "0.3.1", "name": "work-network", "type": "host-device", "device": "eth1", "ipam": { "type": "dhcp" } }
运行以下命令来创建额外网络:
$ oc apply -f <file>.yaml
其中:
<file>
- 指定包含 YAML 清单的文件名。
22.2.7. 关于在容器网络命名空间中配置 master 接口
在 OpenShift Container Platform 4.14 及更高版本中,允许用户根据容器命名空间中的 master 接口创建 MAC-VLAN、IP-VLAN 和 VLAN 子接口。
通过此功能,您可以在单独的网络附加定义中作为 pod 网络配置的一部分创建 master 接口。然后,您可以在这个接口上基于 VLAN、MACVLAN 或 IPVLAN,而无需了解节点的网络配置。
要确保容器命名空间 master 接口使用 linkInContainer
,并根据额外网络的特定类型的在 VLAN、MACVLAN 或 IPVLAN 插件配置中将值设置为 true
。
22.2.7.1. 在 SR-IOV VF 上创建多个 VLAN
使用此功能的一个用例是基于 SR-IOV VF 的多个 VLAN。要做到这一点,首先创建 SR-IOV 网络,然后为 VLAN 接口定义网络附加。
以下示例演示了如何配置此图中所示的设置。
图 22.1. 创建 VLAN
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 SR-IOV Network Operator。
流程
使用以下命令,创建您要部署 pod 的专用容器命名空间:
$ oc new-project test-namespace
创建 SR-IOV 节点策略:
创建一个
SriovNetworkNodePolicy
对象,然后在sriov-node-network-policy.yaml
文件中保存 YAML:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriovnic namespace: openshift-sriov-network-operator spec: deviceType: netdevice isRdma: false needVhostNet: true nicSelector: vendor: "15b3" 1 deviceID: "101b" 2 rootDevices: ["00:05.0"] numVfs: 10 priority: 99 resourceName: sriovnic nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true"
注意SR-IOV 网络节点策略配置示例,使用设置
deviceType: netdevice
,专为 Mellanox 网络接口卡(NIC)量身定制。运行以下命令来应用 YAML:
$ oc apply -f sriov-node-network-policy.yaml
注意应用这可能需要一些时间,因为需要重新引导的节点。
创建 SR-IOV 网络:
为额外 SR-IOV 网络附加创建
SriovNetwork
自定义资源(CR),如下例所示。将 YAML 保存为文件sriov-network-attachment.yaml
:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriov-network namespace: openshift-sriov-network-operator spec: networkNamespace: test-namespace resourceName: sriovnic spoofChk: "off" trust: "on"
运行以下命令来应用 YAML:
$ oc apply -f sriov-network-attachment.yaml
创建 VLAN 额外网络:
使用以下 YAML 示例,创建一个名为
ipvlan100-additional-network-configuration.yaml
的文件:apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: vlan-100 namespace: test-namespace spec: config: | { "cniVersion": "0.4.0", "name": "vlan-100", "plugins": [ { "type": "vlan", "master": "ext0", 1 "mtu": 1500, "vlanId": 100, "linkInContainer": true, 2 "ipam": {"type": "whereabouts", "ipRanges": [{"range": "1.1.1.0/24"}]} } ] }
运行以下命令来应用 YAML 文件:
$ oc apply -f vlan100-additional-network-configuration.yaml
使用之前指定的网络创建 pod 定义:
使用以下 YAML 示例,创建一个名为
pod-a.yaml
文件的文件:注意以下清单包括 2 个资源:
- 带有安全标签的命名空间
- 带有适当的网络注解的 Pod 定义
apiVersion: v1 kind: Namespace metadata: name: test-namespace labels: pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/audit: privileged pod-security.kubernetes.io/warn: privileged security.openshift.io/scc.podSecurityLabelSync: "false" --- apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: test-namespace annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "sriov-network", "namespace": "test-namespace", "interface": "ext0" 1 }, { "name": "vlan-100", "namespace": "test-namespace", "interface": "ext0.100" } ]' spec: securityContext: runAsNonRoot: true containers: - name: nginx-container image: nginxinc/nginx-unprivileged:latest securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] ports: - containerPort: 80 seccompProfile: type: "RuntimeDefault"
- 1
- 用作 VLAN 接口主接口的名称。
运行以下命令来应用 YAML 文件:
$ oc apply -f pod-a.yaml
运行以下命令,在
test-namespace
中获取nginx-pod
的详细信息:$ oc describe pods nginx-pod -n test-namespace
输出示例
Name: nginx-pod Namespace: test-namespace Priority: 0 Node: worker-1/10.46.186.105 Start Time: Mon, 14 Aug 2023 16:23:13 -0400 Labels: <none> Annotations: k8s.ovn.org/pod-networks: {"default":{"ip_addresses":["10.131.0.26/23"],"mac_address":"0a:58:0a:83:00:1a","gateway_ips":["10.131.0.1"],"routes":[{"dest":"10.128.0.0... k8s.v1.cni.cncf.io/network-status: [{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.131.0.26" ], "mac": "0a:58:0a:83:00:1a", "default": true, "dns": {} },{ "name": "test-namespace/sriov-network", "interface": "ext0", "mac": "6e:a7:5e:3f:49:1b", "dns": {}, "device-info": { "type": "pci", "version": "1.0.0", "pci": { "pci-address": "0000:d8:00.2" } } },{ "name": "test-namespace/vlan-100", "interface": "ext0.100", "ips": [ "1.1.1.1" ], "mac": "6e:a7:5e:3f:49:1b", "dns": {} }] k8s.v1.cni.cncf.io/networks: [ { "name": "sriov-network", "namespace": "test-namespace", "interface": "ext0" }, { "name": "vlan-100", "namespace": "test-namespace", "i... openshift.io/scc: privileged Status: Running IP: 10.131.0.26 IPs: IP: 10.131.0.26
22.2.7.2. 基于容器命名空间中的网桥主接口创建子接口
创建子接口可应用到其他类型的接口。按照以下步骤,基于容器命名空间中的网桥 master 接口创建子接口。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
权限的用户身份登录 OpenShift Container Platform 集群。
流程
运行以下命令,创建您要部署 pod 的专用容器命名空间:
$ oc new-project test-namespace
使用以下 YAML 示例,创建一个名为
bridge-nad.yaml
的桥接NetworkAttachmentDefinition
自定义资源 (CR) 文件:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: bridge-network spec: config: '{ "cniVersion": "0.4.0", "name": "bridge-network", "type": "bridge", "bridge": "br-001", "isGateway": true, "ipMasq": true, "hairpinMode": true, "ipam": { "type": "host-local", "subnet": "10.0.0.0/24", "routes": [{"dst": "0.0.0.0/0"}] } }'
运行以下命令,将
NetworkAttachmentDefinition
CR 应用到 OpenShift Container Platform 集群:$ oc apply -f bridge-nad.yaml
运行以下命令验证
NetworkAttachmentDefinition
CR 是否已成功创建:$ oc get network-attachment-definitions
输出示例
NAME AGE bridge-network 15s
使用以下 YAML 示例,为 IPVLAN 额外网络配置创建一个名为
ipvlan-additional-network-configuration.yaml
的文件:apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: ipvlan-net namespace: test-namespace spec: config: '{ "cniVersion": "0.3.1", "name": "ipvlan-net", "type": "ipvlan", "master": "ext0", 1 "mode": "l3", "linkInContainer": true, 2 "ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]} }'
运行以下命令来应用 YAML 文件:
$ oc apply -f ipvlan-additional-network-configuration.yaml
运行以下命令验证
NetworkAttachmentDefinition
CR 是否已成功创建:$ oc get network-attachment-definitions
输出示例
NAME AGE bridge-network 87s ipvlan-net 9s
使用以下 YAML 示例,为 pod 定义创建一个名为
pod-a.yaml
的文件:apiVersion: v1 kind: Pod metadata: name: pod-a namespace: test-namespace annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "bridge-network", "interface": "ext0" 1 }, { "name": "ipvlan-net", "interface": "ext1" } ]' spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-pod image: quay.io/openshifttest/hello-sdn@sha256:c89445416459e7adea9a5a416b3365ed3d74f2491beb904d61dc8d1eb89a72a4 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
- 1
- 指定用作 IPVLAN 接口的 master 的名称。
运行以下命令来应用 YAML 文件:
$ oc apply -f pod-a.yaml
使用以下命令验证 pod 是否正在运行:
$ oc get pod -n test-namespace
输出示例
NAME READY STATUS RESTARTS AGE pod-a 1/1 Running 0 2m36s
运行以下命令,显示
test-namespace
中pod-a
资源的网络接口信息:$ oc exec -n test-namespace pod-a -- ip a
输出示例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 3: eth0@if105: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default link/ether 0a:58:0a:d9:00:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.217.0.93/23 brd 10.217.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::488b:91ff:fe84:a94b/64 scope link valid_lft forever preferred_lft forever 4: ext0@if107: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.0.0.2/24 brd 10.0.0.255 scope global ext0 valid_lft forever preferred_lft forever inet6 fe80::bcda:bdff:fe7e:f437/64 scope link valid_lft forever preferred_lft forever 5: ext1@ext0: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/24 brd 10.0.0.255 scope global ext1 valid_lft forever preferred_lft forever inet6 fe80::beda:bd00:17e:f437/64 scope link valid_lft forever preferred_lft forever
此输出显示,网络接口
ext1
与物理接口ext0
关联。