在...上配置 Open Virtual Network (OVN) 用户定义网络 (UDN) 的先决条件 Red Hat OpenShift on IBM Cloud

在 Red Hat OpenShift on IBM Cloud 上,为Localnet和第2层主网络配置OVN集群用户自定义网络(CUDN)的一次性先决条件。

本教程介绍了如何在 Red Hat® OpenShift® 上配置CUDN Localnets和Layer 2 Primaries的先决条件,详见 Kubernetes Service (网址:IBM Cloud )。 本教程中描述的所有任务均在每个集群上执行一次。

Localnet 概述

Red Hat OpenShift Kubernetes Service Localnet 网络需要进行额外的设置,而客户在使用 ROVS 时无需执行这些操作。 本教程介绍了所需的步骤。

准备 Red Hat OpenShift on IBM Cloud 集群

IBM Cloud 集群上的 Red Hat OpenShift 需要 NMState Operator。 NMState 为网桥和物理网络提供持久化的网络配置。 此步骤将安装操作员。

请牢记以下几点:

  • 应用清单后,安装过程需要 5 到 10 分钟才能完成。
  • 每个接口仅创建一个桥接。
  • 请勿尝试更改 eth0 上的桥接设置。

将以下代码块复制到文件中,并使用 oc apply -f step0a.yml 命令运行该文件,以安装NMState Operator。

---
apiVersion: v1
kind: Namespace
metadata:
  name: openshift-nmstate
spec:
  finalizers:
  - kubernetes
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: openshift-nmstate
  namespace: openshift-nmstate
spec:
  targetNamespaces:
  - openshift-nmstate
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: kubernetes-nmstate-operator
  namespace: openshift-nmstate
spec:
  channel: stable
  installPlanApproval: Automatic
  name: kubernetes-nmstate-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace

在创建 NMState 自定义资源之前,请等待操作员先注册 NMState 自定义资源定义(CRD)。 如果在建立 CRD 之前应用 NMState 资源,将会看到类似于“ no matches for kind "NMState" in version "nmstate.io/v1" ”的错误。

运行以下命令进行轮询,直到 CRD 出现,然后等待其达到“Established”状态。

until oc get crd nmstates.nmstate.io >/dev/null 2>&1; do echo "Waiting for NMState CRD..."; sleep 10; done
oc wait --for=condition=established crd/nmstates.nmstate.io --timeout=300s

请确认所有 NMState CRD 均已安装。

oc get crd | grep nmstate

示例输出:

nmstates.nmstate.io                                               ...
nodenetworkconfigurationenactments.nmstate.io                     ...
nodenetworkconfigurationpolicies.nmstate.io                       ...
nodenetworkstates.nmstate.io                                      ...

准备好 CRD 后,将以下代码块复制到文件中,并使用 oc apply -f step0b.yml 命令应用该代码,以创建名为 NMState 的自定义资源。

---
apiVersion: nmstate.io/v1
kind: NMState
metadata:
  name: nmstate
spec:
  probeConfiguration:
    dns:
      host: root-servers.net

应用桥接配置

应用基本桥接配置,以使用第二块外设组件互连-虚拟网络接口(PCI-VNI)网络接口卡(NIC)(eth1 )。

将以下代码块复制到文件中,并使用 oc apply -f step1.yml 命令将其应用。

---
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: "br-eth1"
spec:
  desiredState:
    interfaces:
    - name: "br-eth1"
      description: A dedicated OVS bridge with a NIC as a port
      type: ovs-bridge
      state: up
      bridge:
        allow-extra-patch-ports: true
        options:
          stp: false
        port:
        - name: "eth1"

请等待此配置在所有节点上生效后,再进行下一步操作。

% oc get NodeNetworkConfigurationPolicy br-eth1
NAME      STATUS      REASON
br-eth1   Available   SuccessfullyConfigured

应用桥接映射配置

应用基本的桥接映射配置。

将以下代码块复制到文件中,并使用 oc apply -f step2.yml 命令将其应用。

---
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: "vpc-vlans"
spec:
  desiredState:
    ovn:
      bridge-mappings:
      - localnet: "vpc-vlans" # <- use your desired network name
        bridge: "br-eth1"
        state: present

为您的 VPC 创建自定义的二级前缀和子网

Localnets 可以为每个网络使用二级 VPC 子网。 此示例使用了来自一个新 VPC 前缀的三个新子网。 您可以替换任何前缀或网络,也可以使用 VPC 的默认设置。

创建新的 VPC 前缀

为每个区域创建一个新的前缀。 此示例使用超级网 198.18.0.0/16,并创建了三个 /18 前缀(子网),每个区域一个。

ic is vpc-addrc my-vpc-zone-1-vms my-vpc us-south-1 198.18.0.0/18 --default true
ic is vpc-addrc my-vpc-zone-2-vms my-vpc us-south-2 198.18.64.0/18
ic is vpc-addrc my-vpc-zone-3-vms my-vpc us-south-3 198.18.128.0/18

创建新的 VPC 子网

为第 1 区创建三个 VPC 子网(prod、db 和 app )。

ic is subnetc zone1-vm-prod my-vpc us-south-1 --ipv4-cidr-block 198.18.0.0/24
ic is subnetc zone1-vm-db my-vpc us-south-1 --ipv4-cidr-block 198.18.1.0/24
ic is subnetc zone1-vm-app my-vpc us-south-1 --ipv4-cidr-block 198.18.2.0/24

根据需要连接公共网关

确保每个区域都连接了一个公共网关。 否则,该子网仍为私有子网。

获取每个子网的ID。 在此示例中,选中了 zone1-vm-prod 子网。

ic is subnets | awk ' $8 ~ /yourVPC-NAME_GOES-HERE/'

示例输出:

0716-16da748a-5159-480c-b809-5f9e4750028b   zone1-vm-app    available   198.18.2.0/24   249/256   stone-likeness-bagging-headcount   pgw-0ec02020-2f74-11f1-b0c5-bfe21078e55b   potato-farm   us-south-1   Default
0716-74a2d06b-de5c-40c2-8311-38dbff74ce62   zone1-vm-db     available   198.18.1.0/24   249/256   stone-likeness-bagging-headcount   -                                          potato-farm   us-south-1   Default
0716-efd14367-eed3-429d-b390-ea17f0e8cfb1   zone1-vm-prod   available   198.18.0.0/24   249/256   stone-likeness-bagging-headcount   pgw-0ec02020-2f74-11f1-b0c5-bfe21078e55b   potato-farm   us-south-1   Default

将公共网关连接到子网

使用子网 ID 0716-efd14367-eed3-429d-b390-ea17f0e8cfb1,将一个公共网关连接到 zone1-vm-prod 子网。

ic is subnet-public-gateway-attach zone1-vm-prod --pgw r134-053cb8b1-d966-4b02-9f20-5fcbeda76048

对于每个新的子网和每个区域,您都必须重复此步骤。 公共网关是按 VPC 和按区域分配的。

第2层 主要给排水系统

第2层主网络需要进行一些初始配置,终端用户才能开始使用它们。

在使用第 2 层主网络之前,您必须完成一些初始配置。

安装 FRR OVN 路由器模块

对 IBM Cloud 集群上的 Red Hat OpenShift 进行补丁更新,以便在 Open Virtual Networking (OVN) Pod 中启用 Free Range Routing (FRR) 选项。 应用以下补丁,以将 FRR 作为额外的路由提供商启用,并在 OVN- Kubernetes 配置中路由广告。

oc patch Network.operator.openshift.io cluster --type=merge -p='{"spec":{"additionalRoutingCapabilities":{"providers":["FRR"]},"defaultNetwork":{"ovnKubernetesConfig":{"routeAdvertisements":"Enabled"}}}}'

启用命名空间间网络功能

应用基础网络配置,以允许通过边界网关协议(BGP)进行通告的集群用户定义网络(CUDN)在命名空间之间进行网络通信。 此配置放宽了默认的用户自定义网络(UDN)隔离行为。 将以下清单保存为文件,并使用 oc apply -f step0.yml 进行应用。

# Permit intra-CUDN-namespace traffic
---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: openshift-network-operator
  name: ovn-kubernetes-config-overrides
data:
  advertised-udn-isolation-mode: "loose"

启用路由通告选择器

添加路由广告,以配置 OVN 通过 BGP 与 OVN FRR Pod 一起发布 Pod 网络。 将以下清单保存为文件,并使用 oc apply -f step1.yml 进行应用。

网络必须带有 advertise: true 标签。

# Add the RouteAdvertisements
---
kind: RouteAdvertisements
apiVersion: k8s.ovn.org/v1
metadata:
  name: default
spec:
  nodeSelector: {}
  frrConfigurationSelector: {}
  networkSelectors:
    - networkSelectionType: ClusterUserDefinedNetworks
      clusterUserDefinedNetworkSelector:
        networkSelector:
          matchLabels:
            advertise: "true"
  advertisements:
    - "PodNetwork"
---