18.3. 二级网络


18.3.1. 在 OVN-Kubernetes 上创建二级网络

作为集群管理员,您可以使用 NetworkAttachmentDefinition (NAD)资源为集群配置额外的二级网络。

注意

以后的 OpenShift Container Platform 版本中将添加对用户定义的网络作为二级网络的支持。

18.3.1.1. 配置 OVN-Kubernetes 额外网络

Red Hat OpenShift Networking OVN-Kubernetes 网络插件允许为 pod 配置二级网络接口。要配置二级网络接口,您必须在 NetworkAttachmentDefinition 自定义资源定义 (CRD)中定义配置。

注意

Pod 和多网络策略创建可能会处于待处理状态,直到节点上的 OVN-Kubernetes control plane 代理处理关联的 network-attachment-definition CRD。

您可以在 第 2 层localnet 拓扑中配置 OVN-Kubernetes 额外网络。

  • 第 2 层拓扑支持 east-west 集群流量,但不允许访问底层物理网络。
  • localnet 拓扑允许连接到物理网络,但需要在集群节点上进行底层 Open vSwitch (OVS) 网桥的额外配置。

以下小节提供了 OVN-Kubernetes 当前允许从属网络的每个拓扑配置示例。

注意

网络名称必须是唯一的。例如,不支持使用多个带有不同配置的 NetworkAttachmentDefinition CRD。

18.3.1.1.1. OVN-Kubernetes 额外网络支持的平台

您可以使用以下支持的平台使用 OVN-Kubernetes 额外网络:

  • 裸机
  • IBM Power®
  • IBM Z®
  • IBM® LinuxONE
  • VMware vSphere
  • Red Hat OpenStack Platform(RHOSP)
18.3.1.1.2. OVN-Kubernetes 网络插件 JSON 配置表

下表描述了 OVN-Kubernetes CNI 网络插件的配置参数:

表 18.3. OVN-Kubernetes 网络插件 JSON 配置表
字段类型描述

cniVersion

string

CNI 规格版本。所需的值为 0.3.1

name

string

网络的名称。这些网络不是命名空间。例如,您可以有一个名为 l2-network 的网络,该网络由两个不同的命名空间中存在的两个不同 NetworkAttachmentDefinition CRD 引用。这样可确保 pod 在自己的不同命名空间中使用 NetworkAttachmentDefinition CRD,可以通过同一二级网络进行通信。但是,这两种不同的 NetworkAttachmentDefinition CRD 必须共享相同的网络特定参数,如 拓扑、subnet、mtu、和 excludeSubnets

type

string

用于配置的 CNI 插件的名称。这个值必须设置为 ovn-k8s-cni-overlay

topology

string

网络的拓扑配置。必须是 layer2localnet 之一。

subnets

string

用于集群间的网络的子网。

对于 "topology":"layer2" 部署,支持 IPv6 (2001:DBB::/64) 和双栈 (192.168.100.0/24,2001:DBB::/64) 子网。

在省略时,实现网络的逻辑交换机仅提供第 2 层通信,用户必须为 pod 配置 IP 地址。端口安全只阻止 MAC 欺骗。

mtu

string

最大传输单元 (MTU)。默认值 1300 由内核自动设置。

netAttachDefName

string

包含此配置的网络附加定义 CRD 的元数据 命名空间和名称 。例如,如果在名为 l2-network 的命名空间 ns1NetworkAttachmentDefinition CRD 中定义此配置,则这应设置为 ns1/l2-network

excludeSubnets

string

以逗号分隔的 CIDR 和 IP 地址列表。IP 地址从可分配的 IP 地址池中删除,永远不会传递给 pod。

vlanID

整数

如果拓扑设置为 localnet,则指定的 VLAN 标签将被分配给来自此额外网络的流量。默认为不分配 VLAN 标签。

18.3.1.1.3. 与多网络策略兼容

多网络策略 API 由 k8s.cni.cncf.io API 组中的 MultiNetworkPolicy 自定义资源定义(CRD) 提供,与 OVN-Kubernetes 二级网络兼容。在定义网络策略时,可以使用的网络策略规则取决于 OVN-Kubernetes 二级网络是否定义了 subnets 字段。详情请查看下表:

表 18.4. 支持基于 subnets CNI 配置的多网络策略选择器
指定的 subnets 字段允许多网络策略选择器

  • podSelectornamespaceSelector
  • ipBlock

  • ipBlock

例如,只有在名为 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

18.3.1.1.4. 配置 localnet 交换拓扑

切换的 localnet 拓扑通过集群范围的逻辑切换到物理网络来连接作为网络附加定义(NAD)创建的工作负载。

您必须将额外网络映射到 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

1
配置对象的名称。
2
节点选择器指定要将节点网络配置策略应用到的节点。
3
流量转发到 OVS 网桥的额外网络的名称。此额外网络必须与定义 OVN-Kubernetes 额外网络的 NetworkAttachmentDefinition CRD 的 spec.config.name 字段的名称匹配。
4
节点上的 OVS 网桥的名称。只有在指定 state: present 时,才需要这个值。
5
映射的状态。需要是 present(添加网桥)或 absent(删除网桥)。默认值 存在

在以下示例中,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 CRD 的 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"
}
18.3.1.1.4.1. 配置第 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"
}
18.3.1.1.5. 为额外网络配置 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
18.3.1.1.6. 使用静态 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
1
网络的名称。这个值在所有 NetworkAttachmentDefinition CRD 之间必须是唯一的。
2
为接口分配的 MAC 地址。
3
为 pod 创建的网络接口的名称。
4
要分配给网络接口的 IP 地址。

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

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

18.3.2.1. 配置桥接额外网络

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

表 18.5. 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
18.3.2.1.1. Bridge CNI 插件配置示例

以下示例配置了名为 bridge-net 的额外网络:

{
  "cniVersion": "0.3.1",
  "name": "bridge-net",
  "type": "bridge",
  "isGateway": true,
  "vlan": 2,
  "ipam": {
    "type": "dhcp"
    }
}

18.3.2.2. 主机设备额外网络配置

注意

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

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

表 18.6. 主机 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

18.3.2.2.1. host-device 配置示例

以下示例配置了名为 hostdev-net 的额外网络:

{
  "cniVersion": "0.3.1",
  "name": "hostdev-net",
  "type": "host-device",
  "device": "eth1"
}

18.3.2.3. 配置 VLAN 额外网络

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

表 18.7. 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 子接口。

18.3.2.3.1. VLAN 配置示例

以下示例演示了一个 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" ]
  }
}

18.3.2.4. 配置 IPVLAN 额外网络

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

表 18.8. 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 接口。
18.3.2.4.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"
       }
    ]
  }
}

18.3.2.5. 配置 macvlan 额外网络

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

表 18.9. 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

string

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

linkInContainer

布尔值

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

注意

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

18.3.2.5.1. MACVLAN CNI 插件配置示例

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

{
  "cniVersion": "0.3.1",
  "name": "macvlan-net",
  "type": "macvlan",
  "master": "eth1",
  "linkInContainer": false,
  "mode": "bridge",
  "ipam": {
    "type": "dhcp"
    }
}

18.3.2.6. 配置 TAP 额外网络

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

表 18.10. 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 设备设置为已存在的网桥的端口。

18.3.2.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"
}
18.3.2.6.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
  2. 运行以下命令来创建新的 MachineConfig 对象:

    $ oc apply -f setsebool-container-use-devices.yaml
    注意

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

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

    $ 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

    注意

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

其他资源

18.3.3. 将 pod 附加到额外网络

作为集群用户,您可以将 pod 附加到额外网络。

18.3.3.1. 将 pod 添加到额外网络

您可以将 pod 添加到额外网络。pod 继续通过默认网络发送与集群相关的普通网络流量。

创建 pod 时会附加额外网络。但是,如果 pod 已存在,您无法为其附加额外网络。

pod 必须与额外网络处于相同的命名空间。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 登录到集群。

流程

  1. Pod 对象添加注解。只能使用以下注解格式之一:

    1. 要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将 <network> 替换为要与 pod 关联的额外网络的名称:

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
      1
      要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
    2. 要通过自定义来附加额外网络,请添加具有以下格式的注解:

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>", 1
                "namespace": "<namespace>", 2
                "default-route": ["<default-route>"] 3
              }
            ]
      1
      指定 NetworkAttachmentDefinition 对象定义的额外网络的名称。
      2
      指定定义 NetworkAttachmentDefinition 对象的命名空间。
      3
      可选:为默认路由指定覆盖,如 192.168.17.1
  2. 运行以下命令来创建 pod。将 <name> 替换为 pod 的名称。

    $ oc create -f <name>.yaml
  3. 可选: 要确认 Pod CR 中是否存在注解,请输入以下命令将 <name> 替换为 pod 的名称。

    $ oc get pod <name> -o yaml

    在以下示例中,example-pod pod 附加到 net1 额外网络:

    $ oc get pod example-pod -o yaml
    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: macvlan-bridge
        k8s.v1.cni.cncf.io/network-status: |- 1
          [{
              "name": "ovn-kubernetes",
              "interface": "eth0",
              "ips": [
                  "10.128.2.14"
              ],
              "default": true,
              "dns": {}
          },{
              "name": "macvlan-bridge",
              "interface": "net1",
              "ips": [
                  "20.2.2.100"
              ],
              "mac": "22:2f:60:a5:f8:00",
              "dns": {}
          }]
      name: example-pod
      namespace: default
    spec:
      ...
    status:
      ...
    1
    k8s.v1.cni.cncf.io/network-status 参数是对象的 JSON 数组。每个对象描述附加到 pod 的额外网络的状态。注解值保存为纯文本值。
18.3.3.1.1. 指定特定于 pod 的地址和路由选项

将 pod 附加到额外网络时,您可能需要在特定 pod 中指定有关该网络的其他属性。这可让您更改路由的某些方面,并指定静态 IP 地址和 MAC 地址。要达到此目的,您可以使用 JSON 格式的注解。

先决条件

  • pod 必须与额外网络处于相同的命名空间。
  • 安装 OpenShift CLI(oc)。
  • 您必须登录集群。

流程

要在指定地址和/或路由选项的同时将 pod 添加到额外网络,请完成以下步骤:

  1. 编辑 Pod 资源定义。如果要编辑现有 Pod 资源,请运行以下命令在默认编辑器中编辑其定义。将 <name> 替换为要编辑的 Pod 资源的名称。

    $ oc edit pod <name>
  2. Pod 资源定义中,将 k8s.v1.cni.cncf.io/networks 参数添加到 pod metadata 映射中。k8s.v1.cni.cncf.io/networks 接受 JSON 字符串,该字符串除指定附加属性外,还引用 NetworkAttachmentDefinition 自定义资源(CR)名称的对象。

    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' 1
    1
    <network> 替换为 JSON 对象,如下例所示。单引号是必需的。
  3. 在以下示例中,通过 default-route 参数,注解指定了哪个网络附加将使用默认路由。

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
        {
          "name": "net1"
        },
        {
          "name": "net2", 1
          "default-route": ["192.0.2.1"] 2
        }]'
    spec:
      containers:
      - name: example-pod
        command: ["/bin/bash", "-c", "sleep 2000000000000"]
        image: centos/tools
    1
    name 是与 pod 关联的额外网络的名称。
    2
    default-route 指定了一个网关,当在路由表中没有其它路由条目时使用这个网关。如果指定了多个 default-route 键,这将导致 pod 无法成为活跃状态。

默认路由将导致任何没有在其它路由中指定的流量被路由到网关。

重要

将 OpenShift Container Platform 的默认路由设置为默认网络接口以外的接口时,可能会导致应该是 pod 和 pod 间的网络流量被路由到其他接口。

要验证 pod 的路由属性,可使用 oc 命令在 pod 中执行 ip 命令。

$ oc exec -it <pod_name> -- ip route
注意

您还可以引用 pod 的 k8s.v1.cni.cncf.io/network-status 来查看哪个额外网络已被分配默认路由,这可以通过 JSON 格式的对象列表中的 default-route 键存在。

要为 pod 设置静态 IP 地址或 MAC 地址,您可以使用 JSON 格式的注解。这要求您创建允许此功能的网络。这可以在 CNO 的 rawCNIConfig 中指定。

  1. 运行以下命令来编辑 CNO CR:

    $ oc edit networks.operator.openshift.io cluster

以下 YAML 描述了 CNO 的配置参数:

Cluster Network Operator YAML 配置

name: <name> 1
namespace: <namespace> 2
rawCNIConfig: '{ 3
  ...
}'
type: Raw

1
为您要创建的额外网络附加指定名称。该名称在指定的 namespace 中需要是唯一的。
2
指定要在其中创建网络附加的命名空间。如果您未指定值,则使用 default 命名空间。
3
基于以下模板,以 JSON 格式指定 CNI 插件配置。

以下对象描述了使用 macvlan CNI 插件的静态 MAC 地址和 IP 地址的配置参数:

使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象

{
  "cniVersion": "0.3.1",
  "name": "<name>", 1
  "plugins": [{ 2
      "type": "macvlan",
      "capabilities": { "ips": true }, 3
      "master": "eth0", 4
      "mode": "bridge",
      "ipam": {
        "type": "static"
      }
    }, {
      "capabilities": { "mac": true }, 5
      "type": "tuning"
    }]
}

1
指定要创建的额外网络附加的名称。该名称在指定的 namespace 中需要是唯一的。
2
指定 CNI 插件配置的数组。第一个对象指定 macvlan 插件配置,第二个对象指定 tuning 插件配置。
3
指定一个请求启用 CNI 插件运行时配置功能的静态 IP 地址功能。
4
指定 macvlan 插件使用的接口。
5
指定一个请求启用 CNI 插件的静态 MAC 地址功能。

以上网络附加可能会以 JSON 格式的注解引用,同时使用相关的键来指定将哪些静态 IP 和 MAC 地址分配给指定 pod。

使用以下内容编辑 pod:

$ oc edit pod <name>

使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: '[
      {
        "name": "<name>", 1
        "ips": [ "192.0.2.205/24" ], 2
        "mac": "CA:FE:C0:FF:EE:00" 3
      }
    ]'

1
使用在创建 rawCNIConfig 时提供的 <name>
2
提供包括子网掩码的 IP 地址。
3
提供 MAC 地址。
注意

静态 IP 地址和 MAC 地址不需要同时使用,您可以单独使用,也可以一起使用。

要验证一个带有额外网络的 pod 的 IP 地址和 MAC 属性,请使用 oc 命令在 pod 中执行 ip 命令。

$ oc exec -it <pod_name> -- ip a

18.3.4. 配置多网络策略

管理员可以使用 MultiNetworkPolicy API 创建多个网络策略,以管理附加到二级网络的 pod 的流量。例如,您可以创建根据特定端口、IP/范围或标签来允许或拒绝流量的策略。

多网络策略可用于管理集群中次要网络上的流量。它们无法管理集群的默认网络或用户定义的网络的主网络。

作为集群管理员,您可以为以下任何网络类型配置多网络策略:

  • 单根 I/O 虚拟化(SR-IOV)
  • MAC 虚拟局域网(MacVLAN)
  • IP 虚拟局域网(IPVLAN)
  • 通过 SR-IOV 绑定 Container Network Interface (CNI)
  • OVN-Kubernetes 额外网络
注意

支持为 SR-IOV 额外网络配置多网络策略,仅支持内核网络接口控制器 (NIC)。SR-IOV 不支持 Data Plane Development Kit (DPDK)应用程序。

18.3.4.1. 多网络策略和网络策略之间的区别

虽然 MultiNetworkPolicy API 实现 NetworkPolicy API,但有几个重要的区别:

  • 您必须使用 MultiNetworkPolicy API:

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
  • 当使用 CLI 与多网络策略交互时,您必须使用 multi-networkpolicy 资源名称。例如,您可以使用 oc get multi-networkpolicy <name> 命令来查看多网络策略对象,其中 <name> 是多网络策略的名称。
  • 您必须使用定义 macvlan 或 SR-IOV 额外网络的网络附加定义名称指定一个注解:

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>

    其中:

    <network_name>
    指定网络附加定义的名称。

18.3.4.2. 为集群启用多网络策略

作为集群管理员,您可以在集群中启用多网络策略支持。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。

流程

  1. 使用以下 YAML 创建 multinetwork-enable-patch.yaml 文件:

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      useMultiNetworkPolicy: true
  2. 配置集群以启用多网络策略:

    $ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml

    输出示例

    network.operator.openshift.io/cluster patched

18.3.4.3. 在 IPv6 网络中支持多网络策略

ICMPv6 Neighbor Discovery Protocol (NDP) 是一组消息和流程,使设备能够发现和维护有关邻居节点的信息。NDP 在 IPv6 网络中扮演着关键角色,用于处理同一链路上的设备间的交互。

useMultiNetworkPolicy 参数被设置为 true 时,Cluster Network Operator (CNO) 会部署多网络策略的 iptables 实现。

要在 IPv6 网络中支持多网络策略,Cluster Network Operator 会在受多网络策略影响的每个 pod 中部署以下规则集:

多网络策略自定义规则

kind: ConfigMap
apiVersion: v1
metadata:
  name: multi-networkpolicy-custom-rules
  namespace: openshift-multus
data:

  custom-v6-rules.txt: |
    # accept NDP
    -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT 1
    -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT 2
    # accept RA/RS
    -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT 3
    -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT 4

1
此规则允许传入的 ICMPv6 邻居请求消息,它们是邻居发现协议 (NDP) 的一部分。这些消息帮助确定邻居节点的链路层地址。
2
此规则允许传入 ICMPv6 邻居公告消息,它们是 NDP 的一部分,并提供有关发件人链路层地址的信息。
3
此规则允许传入的 ICMPv6 路由器请求消息。主机使用这些消息来请求路由器配置信息。
4
此规则允许传入的 ICMPv6 路由器广告消息,为主机提供配置信息。
注意

您不能编辑这些预定义规则。

这些规则共同启用基本的 ICMPv6 流量,以便正确实现网络功能,包括 IPv6 环境中的地址解析和路由器通信。使用这些规则以及多网络策略拒绝流量时,应用程序应不会遇到连接问题。

18.3.4.4. 使用多网络策略

作为集群管理员,您可以创建、编辑、查看和删除多网络策略。

18.3.4.4.1. 先决条件
  • 您已为集群启用了多网络策略支持。
18.3.4.4.2. 使用 CLI 创建多网络策略

要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个多网络策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在多网络策略应用到的命名空间中工作。

流程

  1. 创建策略规则:

    1. 创建一个 <policy_name>.yaml 文件:

      $ touch <policy_name>.yaml

      其中:

      <policy_name>
      指定多网络策略文件名。
    2. 在您刚才创建的文件中定义多网络策略,如下例所示:

      拒绝来自所有命名空间中的所有 pod 的入口流量

      这是一个基本的策略,阻止配置其他网络策略所允许的跨 pod 流量以外的所有跨 pod 网络。

      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      metadata:
        name: deny-by-default
        annotations:
          k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []

      其中:

      <network_name>
      指定网络附加定义的名称。

      允许来自所有命名空间中的所有 pod 的入口流量

      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      metadata:
        name: allow-same-namespace
        annotations:
          k8s.v1.cni.cncf.io/policy-for: <network_name>
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}

      其中:

      <network_name>
      指定网络附加定义的名称。

      允许从特定命名空间中到一个 pod 的入口流量

      此策略允许流量从在 namespace-y 中运行的容器集到标记 pod-a 的 pod。

      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      metadata:
        name: allow-traffic-pod
        annotations:
          k8s.v1.cni.cncf.io/policy-for: <network_name>
      spec:
        podSelector:
         matchLabels:
            pod: pod-a
        policyTypes:
        - Ingress
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                 kubernetes.io/metadata.name: namespace-y

      其中:

      <network_name>
      指定网络附加定义的名称。

      限制到服务的流量

      应用此策略可确保每个带有标签 app=bookstore 和标签 role=api 的 pod 只能被带有标签 app=bookstore 的 pod 访问。在本例中,应用可以是 REST API 服务器,标记为标签 app=bookstorerole=api

      这个示例可以解决了以下用例:

      • 将到一个服务的流量限制为仅使用需要它的其他微服务。
      • 将连接限制为只允许使用它的应用程序。

        apiVersion: k8s.cni.cncf.io/v1beta1
        kind: MultiNetworkPolicy
        metadata:
          name: api-allow
          annotations:
            k8s.v1.cni.cncf.io/policy-for: <network_name>
        spec:
          podSelector:
            matchLabels:
              app: bookstore
              role: api
          ingress:
          - from:
              - podSelector:
                  matchLabels:
                    app: bookstore

        其中:

        <network_name>
        指定网络附加定义的名称。
  2. 运行以下命令来创建多网络策略对象:

    $ oc apply -f <policy_name>.yaml -n <namespace>

    其中:

    <policy_name>
    指定多网络策略文件名。
    <namespace>
    可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。

    输出示例

    multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created

注意

如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式创建网络策略。

18.3.4.4.3. 编辑多网络策略

您可以编辑命名空间中的多网络策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在存在多网络策略的命名空间中工作。

流程

  1. 可选: 要列出命名空间中的多网络策略对象,请输入以下命令:

    $ oc get multi-networkpolicy

    其中:

    <namespace>
    可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
  2. 编辑多网络策略对象。

    • 如果您在文件中保存了多网络策略定义,请编辑该文件并进行必要的更改,然后输入以下命令。

      $ oc apply -n <namespace> -f <policy_file>.yaml

      其中:

      <namespace>
      可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
      <policy_file>
      指定包含网络策略的文件的名称。
    • 如果您需要直接更新多网络策略对象,请输入以下命令:

      $ oc edit multi-networkpolicy <policy_name> -n <namespace>

      其中:

      <policy_name>
      指定网络策略的名称。
      <namespace>
      可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
  3. 确认已更新多网络策略对象。

    $ oc describe multi-networkpolicy <policy_name> -n <namespace>

    其中:

    <policy_name>
    指定多网络策略的名称。
    <namespace>
    可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
注意

如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或通过 Actions 菜单从 web 控制台中的策略编辑网络策略。

18.3.4.4.4. 使用 CLI 查看多网络策略

您可以检查命名空间中的多网络策略。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在存在多网络策略的命名空间中工作。

流程

  • 列出命名空间中的多网络策略:

    • 要查看命名空间中定义的多网络策略对象,请输入以下命令:

      $ oc get multi-networkpolicy
    • 可选: 要检查特定的多网络策略,请输入以下命令:

      $ oc describe multi-networkpolicy <policy_name> -n <namespace>

      其中:

      <policy_name>
      指定要检查的多网络策略的名称。
      <namespace>
      可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
注意

如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式查看网络策略。

18.3.4.4.5. 使用 CLI 删除多网络策略

您可以删除命名空间中的多网络策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在存在多网络策略的命名空间中工作。

流程

  • 要删除多网络策略对象,请输入以下命令:

    $ oc delete multi-networkpolicy <policy_name> -n <namespace>

    其中:

    <policy_name>
    指定多网络策略的名称。
    <namespace>
    可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。

    输出示例

    multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted

注意

如果使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群上以 YAML 或通过 Actions 菜单从 web 控制台中的策略删除网络策略。

18.3.4.4.6. 创建默认拒绝所有多网络策略

这是一个基本的策略,阻止其他部署网络策略允许的网络流量以外的所有跨 pod 网络。此流程强制使用默认 deny-by-default 策略。

注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在多网络策略应用到的命名空间中工作。

流程

  1. 创建以下 YAML,以定义 deny-by-default 策略,以拒绝所有命名空间中的所有 pod 的入口流量。将 YAML 保存到 deny-by-default.yaml 文件中:

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: deny-by-default
      namespace: default 1
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <namespace_name>/<network_name> 2
    spec:
      podSelector: {} 3
      policyTypes: 4
      - Ingress 5
      ingress: [] 6
    1
    namespace:default 将此策略部署到 default 命名空间。
    2
    network_name :指定一个网络附加定义的名称。
    3
    podSelector: 为空,这意味着它与所有 pod 匹配。因此,该策略适用于 default 命名空间中的所有 pod。
    4
    policyTypes : NetworkPolicy 相关的规则类型列表。
    5
    指定为 Ingress only policyType
    6
    没有指定 ingress 规则。这会导致传入的流量丢弃至所有 pod。
  2. 输入以下命令应用策略:

    $ oc apply -f deny-by-default.yaml

    输出示例

    multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created

18.3.4.4.7. 创建多网络策略以允许来自外部客户端的流量

使用 deny-by-default 策略,您可以继续配置策略,允许从外部客户端到带有标签 app=web 的 pod 的流量。

注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

按照以下步骤配置策略,以直接从公共互联网允许外部服务,或使用 Load Balancer 访问 pod。只有具有标签 app=web 的 pod 才允许流量。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在多网络策略应用到的命名空间中工作。

流程

  1. 创建策略,以直接从公共互联网的流量或使用负载均衡器访问 pod。将 YAML 保存到 web-allow-external.yaml 文件中:

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: web-allow-external
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: web
      ingress:
        - {}
  2. 输入以下命令应用策略:

    $ oc apply -f web-allow-external.yaml

    输出示例

    multinetworkpolicy.k8s.cni.cncf.io/web-allow-external created

    此策略允许来自所有资源的流量,包括下图所示的外部流量:

允许来自外部客户端的流量
18.3.4.4.8. 创建一个多网络策略,允许从所有命名空间中到应用程序的流量
注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

按照以下步骤配置允许从所有命名空间中的所有 pod 流量到特定应用程序的策略。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在多网络策略应用到的命名空间中工作。

流程

  1. 创建一个策略,允许从所有命名空间中的所有 pod 流量到特定应用。将 YAML 保存到 web-allow-all-namespaces.yaml 文件中:

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: web-allow-all-namespaces
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>
    spec:
      podSelector:
        matchLabels:
          app: web 1
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {} 2
    1
    仅将策略应用到 default 命名空间中的 app:web pod。
    2
    选择所有命名空间中的所有 pod。
    注意

    默认情况下,如果您省略了指定 namespaceSelector 而不是选择任何命名空间,这意味着策略只允许从网络策略部署到的命名空间的流量。

  2. 输入以下命令应用策略:

    $ oc apply -f web-allow-all-namespaces.yaml

    输出示例

    multinetworkpolicy.k8s.cni.cncf.io/web-allow-all-namespaces created

验证

  1. 输入以下命令在 default 命名空间中启动 web 服务:

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 运行以下命令在 secondary 命名空间中部署 alpine 镜像并启动 shell:

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
  3. 在 shell 中运行以下命令,并观察是否允许请求:

    # wget -qO- --timeout=2 http://web.default

    预期输出

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

18.3.4.4.9. 创建多网络策略允许从命名空间中到应用程序的流量
注意

如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。

按照以下步骤配置允许从特定命名空间中到带有 app=web 标签的 pod 的策略。您可能需要进行以下操作:

  • 将流量限制为部署生产工作负载的命名空间。
  • 启用部署到特定命名空间的监控工具,以从当前命名空间中提取指标。

先决条件

  • 集群使用支持 NetworkPolicy 对象的网络插件,如带有设置了 mode: NetworkPolicy 的 OpenShift SDN 网络插件。
  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您在多网络策略应用到的命名空间中工作。

流程

  1. 创建一个策略,允许来自特定命名空间中所有 pod 的流量,其标签为 purpose=production。将 YAML 保存到 web-allow-prod.yaml 文件中:

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: web-allow-prod
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/policy-for: <network_name>
    spec:
      podSelector:
        matchLabels:
          app: web 1
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production 2
    1
    仅将策略应用到 default 命名空间中的 app:web pod。
    2
    将流量仅限制为具有标签 purpose=production 的命名空间中的 pod。
  2. 输入以下命令应用策略:

    $ oc apply -f web-allow-prod.yaml

    输出示例

    multinetworkpolicy.k8s.cni.cncf.io/web-allow-prod created

验证

  1. 输入以下命令在 default 命名空间中启动 web 服务:

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 运行以下命令来创建 prod 命名空间:

    $ oc create namespace prod
  3. 运行以下命令来标记 prod 命名空间:

    $ oc label namespace/prod purpose=production
  4. 运行以下命令来创建 dev 命名空间:

    $ oc create namespace dev
  5. 运行以下命令来标记 dev 命名空间:

    $ oc label namespace/dev purpose=testing
  6. 运行以下命令在 dev 命名空间中部署 alpine 镜像并启动 shell:

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
  7. 在 shell 中运行以下命令,并观察请求是否被阻止:

    # wget -qO- --timeout=2 http://web.default

    预期输出

    wget: download timed out

  8. 运行以下命令,在 prod 命名空间中部署 alpine 镜像并启动 shell:

    $ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
  9. 在 shell 中运行以下命令,并观察是否允许请求:

    # wget -qO- --timeout=2 http://web.default

    预期输出

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

18.3.4.5. 其他资源

18.3.5. 从额外网络中删除 pod

作为集群用户,您可以从额外网络中删除 pod。

18.3.5.1. 从额外网络中删除 pod

您只能通过删除 pod 来从额外网络中删除 pod。

先决条件

  • 一个额外网络被附加到 pod。
  • 安装 OpenShift CLI(oc)。
  • 登录到集群。

流程

  • 要删除 pod,输入以下命令:

    $ oc delete pod <name> -n <namespace>
    • <name> 是 pod 的名称。
    • <namespace> 是包含 pod 的命名空间。

18.3.6. 编辑额外网络

作为集群管理员,您可以修改现有额外网络的配置。

18.3.6.1. 修改额外网络附加定义

作为集群管理员,您可以对现有额外网络进行更改。任何附加到额外网络的现有 pod 都不会被更新。

先决条件

  • 已为集群配置了额外网络。
  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

要为集群编辑额外网络,请完成以下步骤:

  1. 运行以下命令,在默认文本编辑器中编辑 Cluster Network Operator (CNO) CR:

    $ oc edit networks.operator.openshift.io cluster
  2. additionalNetworks 集合中,用您的更改更新额外网络。
  3. 保存您的更改,再退出文本编辑器以提交更改。
  4. 可选:运行以下命令确认 CNO 更新了 NetworkAttachmentDefinition 对象。将 <network-name> 替换为要显示的额外网络名称。CNO 根据您的更改更新 NetworkAttachmentDefinition 对象前可能会有延迟。

    $ oc get network-attachment-definitions <network-name> -o yaml

    例如,以下控制台输出显示名为 net1NetworkAttachmentDefinition 对象:

    $ oc get network-attachment-definitions net1 -o go-template='{{printf "%s\n" .spec.config}}'
    { "cniVersion": "0.3.1", "type": "macvlan",
    "master": "ens5",
    "mode": "bridge",
    "ipam":       {"type":"static","routes":[{"dst":"0.0.0.0/0","gw":"10.128.2.1"}],"addresses":[{"address":"10.128.2.100/23","gateway":"10.128.2.1"}],"dns":{"nameservers":["172.30.0.10"],"domain":"us-west-2.compute.internal","search":["us-west-2.compute.internal"]}} }

18.3.7. 在二级网络中配置 IP 地址分配

以下小节提供了如何为二级网络配置 IP 地址分配的说明和信息。

18.3.7.1. 为额外网络配置 IP 地址分配

IP 地址管理 (IPAM) Container Network Interface (CNI) 插件为其他 CNI 插件提供 IP 地址。

您可以使用以下 IP 地址分配类型:

  • 静态分配。
  • 通过 DHCP 服务器进行动态分配。您指定的 DHCP 服务器必须可从额外网络访问。
  • 通过 Whereabouts IPAM CNI 插件进行动态分配。
18.3.7.1.1. 静态 IP 地址分配配置

下表描述了静态 IP 地址分配的配置:

表 18.11. ipam 静态配置对象
字段类型描述

type

string

IPAM 地址类型。值必须是 static

addresses

数组

指定分配给虚拟接口的 IP 地址的对象数组。支持 IPv4 和 IPv6 IP 地址。

Routes

数组

指定要在 pod 中配置的路由的一组对象。

dns

数组

可选:指定 DNS 配置的对象数组。

address 数组需要带有以下字段的对象:

表 18.12. ipam.addresses[] array
字段类型描述

address

string

您指定的 IP 地址和网络前缀。例如:如果您指定 10.10.21.10/24,那么会为额外网络分配 IP 地址 10.10.21.10,网掩码为 255.255.255.0

gateway

string

出口网络流量要路由到的默认网关。

表 18.13. ipam.routes[] array
字段类型描述

dst

string

CIDR 格式的 IP 地址范围,如 192.168.17.0/24 或默认路由 0.0.0.0/0

gw

string

网络流量路由的网关。

表 18.14. ipam.dns object
字段类型描述

nameservers

数组

用于发送 DNS 查询的一个或多个 IP 地址的数组。

domain

数组

要附加到主机名的默认域。例如,如果将域设置为 example.com,对 example-host 的 DNS 查找查询将被改写为 example-host.example.com

search

数组

在 DNS 查找查询过程中,附加到非限定主机名(如 example-host)的域名的数组。

静态 IP 地址分配配置示例

{
  "ipam": {
    "type": "static",
      "addresses": [
        {
          "address": "191.168.1.7/24"
        }
      ]
  }
}

18.3.7.1.2. 动态 IP 地址(DHCP)分配配置

以下 JSON 描述了使用 DHCP 进行动态 IP 地址地址分配的配置。

DHCP 租期续订

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

表 18.15. ipam DHCP 配置对象
字段类型描述

type

string

IPAM 地址类型。需要值 dhcp

动态 IP 地址(DHCP)分配配置示例

{
  "ipam": {
    "type": "dhcp"
  }
}

18.3.7.1.3. 使用 Whereabouts 进行动态 IP 地址分配配置

Whereabouts CNI 插件允许在不使用 DHCP 服务器的情况下动态地将 IP 地址分配给额外网络。

Whereabouts CNI 插件还支持在单独的 NetworkAttachmentDefinition CRD 中多次出现同一 CIDR 范围的重叠 IP 地址范围和配置。这在多租户环境中提供了更大的灵活性和管理功能。

18.3.7.1.3.1. 动态 IP 地址配置对象

下表描述了使用 Whereabouts 进行动态 IP 地址分配的配置对象:

表 18.16. ipam whereabouts 配置对象
字段类型描述

type

string

IPAM 地址类型。需要 abouts 的值。

range

string

CIDR 表示法中的 IP 地址和范围。IP 地址是通过这个地址范围来分配的。

exclude

数组

可选: CIDR 标记中零个或更多 IP 地址和范围的列表。包含在排除地址范围中的 IP 地址。

network_name

string

可选:帮助确保每个 pod 的组或域都有自己的一组 IP 地址,即使它们共享相同的 IP 地址范围。设置此字段对于保持网络独立和组织非常重要,特别是在多租户环境中。

18.3.7.1.3.2. 使用 Whereabouts 的动态 IP 地址分配配置

以下示例显示了使用 Whereabouts 的动态地址分配配置:

Whereabouts 动态 IP 地址分配

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/27",
    "exclude": [
       "192.0.2.192/30",
       "192.0.2.196/32"
    ]
  }
}

18.3.7.1.3.3. 使用 Whereabouts 带有重叠 IP 地址范围的动态 IP 地址分配

以下示例显示了一个动态 IP 地址分配,它将重叠的 IP 地址范围用于多租户网络。

NetworkAttachmentDefinition 1

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/29",
    "network_name": "example_net_common", 1
  }
}

1
可选。如果设置,必须与 NetworkAttachmentDefinition 2network_name 匹配。

NetworkAttachmentDefinition 2

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/24",
    "network_name": "example_net_common", 1
  }
}

1
可选。如果设置,必须与 NetworkAttachmentDefinition 1network_name 匹配。
18.3.7.1.4. 创建abouts-reconciler 守护进程集的位置

Whereabouts 协调器负责管理集群中 pod 的动态 IP 地址分配,使用 Whereabouts IP 地址管理 (IPAM) 解决方案。它确保每个 pod 从指定的 IP 地址范围中获取唯一的 IP 地址。它还会在 pod 删除或缩减时处理 IP 地址发行版本。

注意

您还可以使用 NetworkAttachmentDefinition 自定义资源定义(CRD)进行动态 IP 地址分配。

当您通过 Cluster Network Operator 配置一个额外的网络时,会自动创建 whereabouts-reconciler 守护进程集。从 YAML 清单配置额外网络时,它不会自动创建。

要触发 whereabouts-reconciler 守护进程集的部署,您必须通过编辑 Cluster Network Operator 自定义资源文件来手动创建一个 whereabouts-shim 网络附加。

使用以下步骤部署 whereabouts-reconciler 守护进程集。

流程

  1. 运行以下命令来编辑 Network.operator.openshift.io 自定义资源(CR):

    $ oc edit network.operator.openshift.io cluster
  2. 在自定义资源 (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
    # ...
  3. 保存文件并退出文本编辑器。
  4. 运行以下命令,验证 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

18.3.7.1.5. 配置 Whereabouts IP 协调器调度

Whereabouts IPAM CNI 插件每天运行 IP 协调器。此过程会清理任何已搁置的 IP 分配,搁置的 IP 分配可能会耗尽 IP 资源,并使新的 pod 无法获取分配给它们的 IP。

使用这个流程更改 IP 协调器运行的频率。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您已部署了whereabouts-reconciler 守护进程集,whereabouts-reconciler pod 已启动并正在运行。

流程

  1. 运行以下命令,使用 IP 协调器的特定 cron 表达式在 openshift-multus 命名空间中创建一个名为 whereabouts-configConfigMap 对象:

    $ oc create configmap whereabouts-config -n openshift-multus --from-literal=reconciler_cron_expression="*/15 * * * *"

    此 cron 表达式表示 IP 协调器每 15 分钟运行一次。根据您的特定要求调整表达式。

    注意

    whereabouts-reconciler 守护进程集只能使用包含五个星号的 cron 表达式模式。目前才不支持带有用于表示秒的第 6 个星号。

  2. 运行以下命令,获取与 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

  3. 运行以下命令,以验证 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

18.3.7.1.6. 为动态分配双栈 IP 地址创建配置

双栈 IP 地址分配可使用 ipRanges 参数进行配置:

  • IPv4 地址
  • IPv6 地址
  • 多个 IP 地址分配

流程

  1. type 设置为 whereabouts
  2. 使用 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"}
                  ]
           }
          }
  3. 将网络附加到 pod。如需更多信息,请参阅"将 pod 添加到额外网络"。
  4. 验证是否分配了所有 IP 地址。
  5. 运行以下命令,以确保 IP 地址被分配为元数据。

    $ oc exec -it mypod -- ip a

18.3.8. 在容器网络命名空间中配置 master 接口

下面的部分提供了有关如何根据主接口创建和管理 MAC-VLAN、IP-VLAN 和 VLAN 子接口的说明和信息。

18.3.8.1. 关于在容器网络命名空间中配置 master 接口

您可以创建一个基于容器命名空间中的 master 接口的 MAC-VLAN、IP-VLAN 或 VLAN 子接口。您还可以在单独的网络附加定义 CRD 中作为 pod 网络配置的一部分创建 master 接口。

要使用容器命名空间 master 接口,您必须为 NetworkAttachmentDefinition CRD 的子接口配置中存在的 linkInContainer 参数指定 true

18.3.8.1.1. 在 SR-IOV VF 上创建多个 VLAN

使用此功能的一个用例是基于 SR-IOV VF 的多个 VLAN。要做到这一点,首先创建 SR-IOV 网络,然后为 VLAN 接口定义网络附加。

以下示例演示了如何配置此图中所示的设置。

图 18.1. 创建 VLAN

创建 VLAN

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 SR-IOV Network Operator。

流程

  1. 使用以下命令,创建您要部署 pod 的专用容器命名空间:

    $ oc new-project test-namespace
  2. 创建 SR-IOV 节点策略:

    1. 创建一个 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)量身定制。

      1
      SR-IOV 网络设备厂商的十六进制代码。值 15b3 代表与 Mellanox NIC 关联。
      2
      SR-IOV 网络设备的设备十六进制代码。
    2. 运行以下命令来应用 YAML:

      $ oc apply -f sriov-node-network-policy.yaml
      注意

      应用这可能需要一些时间,因为需要重新引导的节点。

  3. 创建 SR-IOV 网络:

    1. 为额外 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"
    2. 运行以下命令来应用 YAML:

      $ oc apply -f sriov-network-attachment.yaml
  4. 创建 VLAN 额外网络:

    1. 使用以下 YAML 示例,创建一个名为 vlan100-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"}]}
              }
            ]
          }
      1
      VLAN 配置需要指定 master 名称。这可以在 pod 网络注解中配置。
      2
      必须指定 linkInContainer 参数。
    2. 运行以下命令来应用 YAML 文件:

      $ oc apply -f vlan100-additional-network-configuration.yaml
  5. 使用之前指定的网络创建 pod 定义:

    1. 使用以下 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 接口的 master 的名称。
    2. 运行以下命令来应用 YAML 文件:

      $ oc apply -f pod-a.yaml
  6. 运行以下命令,在 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

18.3.8.1.2. 基于容器命名空间中的网桥主接口创建子接口

您可以根据容器命名空间中的桥接 master 接口创建子接口。创建子接口可应用到其他类型的接口。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform 集群。

流程

  1. 输入以下命令,创建一个要部署 pod 的专用容器命名空间:

    $ oc new-project test-namespace
  2. 使用以下 YAML 示例,创建一个名为 bridge-nad.yaml 的桥接 NetworkAttachmentDefinition 自定义资源定义(CRD)文件:

    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"}]
        }
      }'
  3. 运行以下命令,将 NetworkAttachmentDefinition CRD 应用到 OpenShift Container Platform 集群:

    $ oc apply -f bridge-nad.yaml
  4. 输入以下命令验证您是否已成功创建了 NetworkAttachmentDefinition CRD:

    $ oc get network-attachment-definitions

    输出示例

    NAME             AGE
    bridge-network   15s

  5. 使用以下 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"}]}
      }'
    1
    指定要与网络附加关联的以太网接口。这会随后在 pod 网络注解中配置。
    2
    指定 master 接口位于容器网络命名空间中。
  6. 运行以下命令来应用 YAML 文件:

    $ oc apply -f ipvlan-additional-network-configuration.yaml
  7. 运行以下命令验证 NetworkAttachmentDefinition CRD 是否已成功创建:

    $ oc get network-attachment-definitions

    输出示例

    NAME             AGE
    bridge-network   87s
    ipvlan-net       9s

  8. 使用以下 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 的名称。
  9. 运行以下命令来应用 YAML 文件:

    $ oc apply -f pod-a.yaml
  10. 使用以下命令验证 pod 是否正在运行:

    $ oc get pod -n test-namespace

    输出示例

    NAME    READY   STATUS    RESTARTS   AGE
    pod-a   1/1     Running   0          2m36s

  11. 运行以下命令,显示 test-namespacepod-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 关联。

18.3.9. 删除额外网络

作为集群管理员,您可以删除额外网络附加。

18.3.9.1. 删除额外网络附加定义

作为集群管理员,您可以从 OpenShift Container Platform 集群中删除额外网络。额外网络不会从它所附加的任何 pod 中删除。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

要从集群中删除额外网络,请完成以下步骤:

  1. 运行以下命令,在默认文本编辑器中编辑 Cluster Network Operator (CNO):

    $ oc edit networks.operator.openshift.io cluster
  2. 从您要删除的网络附加定义的 additionalNetworks 集合中删除配置,以此修改 CR。

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      additionalNetworks: [] 1
    1
    如果要删除 additionalNetworks 集合中唯一额外网络附加定义的配置映射,您必须指定一个空集合。
  3. 保存您的更改,再退出文本编辑器以提交更改。
  4. 可选:通过运行以下命令确认删除了额外网络 CR:

    $ oc get network-attachment-definition --all-namespaces
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.