×

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

对用户定义网络作为次要网络的支持将在未来版本的 OpenShift Container Platform 中添加。

OVN-Kubernetes 附加网络配置

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

Pod 和多网络策略创建可能保持挂起状态,直到节点中的 OVN-Kubernetes 控制平面代理处理关联的network-attachment-definition CRD。

您可以以二层本地网拓扑配置 OVN-Kubernetes 附加网络。

  • 二层拓扑支持东西向集群流量,但不允许访问底层物理网络。

  • 本地网拓扑允许连接到物理网络,但需要对集群节点上的底层 Open vSwitch (OVS) 桥接进行额外配置。

以下部分提供了 OVN-Kubernetes 目前允许用于次要网络的每种拓扑的示例配置。

网络名称必须唯一。例如,创建引用相同网络的不同配置的多个NetworkAttachmentDefinition CRD 是不受支持的。

OVN-Kubernetes 附加网络支持的平台

您可以将 OVN-Kubernetes 附加网络与以下支持的平台一起使用

  • 裸机

  • IBM Power®

  • IBM Z®

  • IBM® LinuxONE

  • VMware vSphere

  • Red Hat OpenStack 平台 (RHOSP)

OVN-Kubernetes 网络插件 JSON 配置表

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

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

cniVersion

字符串

CNI 规范版本。所需值为0.3.1

name

字符串

网络名称。这些网络不是命名空间的。例如,您可以拥有一个名为l2-network的网络,它可以从存在于两个不同命名空间的两个不同的NetworkAttachmentDefinition CRD 引用。这确保了使用其自身不同命名空间中的NetworkAttachmentDefinition CRD 的 Pod 可以在同一辅助网络上通信。但是,这两个不同的NetworkAttachmentDefinition CRD 也必须共享相同的网络特定参数,例如topologysubnetsmtuexcludeSubnets

type

字符串

要配置的 CNI 插件的名称。此值必须设置为ovn-k8s-cni-overlay

topology

字符串

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

subnets

字符串

在集群中使用的网络子网。

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

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

mtu

字符串

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

netAttachDefName

字符串

包含此配置的网络附件定义 CRD 的元数据namespacename。例如,如果此配置在命名空间ns1中名为l2-networkNetworkAttachmentDefinition CRD 中定义,则应将其设置为ns1/l2-network

excludeSubnets

字符串

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

vlanID

整数

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

与多网络策略的兼容性

k8s.cni.cncf.io API组中提供的MultiNetworkPolicy自定义资源定义(CRD)提供的多网络策略API与OVN-Kubernetes辅助网络兼容。定义网络策略时,可使用的网络策略规则取决于OVN-Kubernetes辅助网络是否定义了subnets字段。详细信息请参考下表:

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

  • podSelectornamespaceSelector

  • ipBlock

  • ipBlock

例如,只有当名为blue2的辅助网络的辅助网络CNI配置中定义了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

本地网交换拓扑的配置

交换式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(移除桥接器)。默认值为present

在以下示例中,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(移除桥接器)。默认值为present

建议使用这种声明式方法,因为NMState Operator会自动且透明地将辅助网络配置应用于节点选择器指定的全部节点。

以下JSON示例配置了本地网辅助网络

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

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

为辅助网络配置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

配置具有静态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地址。