注意:

使用 Oracle Cloud Infrastructure 上的 Open Virtualization 网络提供程序部署 Oracle Linux Virtualization Manager

简介

在本教程中,我们将介绍一个团队旨在通过将现有的本地部署 Oracle Linux Virtualization Manager 环境扩展到 Oracle Cloud Infrastructure (OCI) 来提高裸金属节点组的利用率的方案。通过将 Oracle Cloud 的网络功能与开放虚拟网络 (Open Virtual Network,OVN) 集成,您可以通过 FastConnect 在 OCI 中桥接内部部署资源与 Oracle Linux Virtualization Manager 部署的虚拟机 (Virtual Machine,VM) 之间的连接。

注:本教程仅用于测试和评估;Oracle Linux Virtualization Manager 对 OCI 的支持正在开发中,实际上不支持管理 OCI 系统。将 OVN 与 Oracle Linux Virtualization Manager 结合使用正在技术预览中,这表明某项功能仍在开发中。

解决方案概述和部署

解决方案概览

我们需要具有以下资源的新 VCN (10.0.0.0/16):

解决方案体系结构

解决方案部署

BM VNIC VLAN 1000

BM VNIC VLAN 1001

目标

先决条件

任务 1:设置 Oracle Linux Virtualization Manager 托管引擎

我们将从配置辅助接口开始。当前接口状态应如下所示(忽略主 VNIC 上的专用 IP 地址):

[root@olvm-he opc]# ifconfig
    enp0s5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
            inet 10.0.11.189  netmask 255.255.255.0  broadcast 10.0.11.255
            inet6 fe80::17ff:fe10:3ae0  prefixlen 64  scopeid 0x20<link>
            ether 02:00:17:10:3a:e0  txqueuelen 1000  (Ethernet)
            RX packets 10199  bytes 176890375 (168.6 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 6954  bytes 1777090 (1.6 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            ether 02:00:17:11:02:0c  txqueuelen 1000  (Ethernet)
            RX packets 19  bytes 6498 (6.3 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 166  bytes 28164 (27.5 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 80  bytes 6320 (6.1 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 80  bytes 6320 (6.1 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在 VLAN 1000 中配置第二个接口 enp1s0

[root@olvm-he opc]# nmcli connection add type ethernet con-name enp1s0 ifname enp1s0 ipv4.method manual ipv4.address '10.0.10.5/24' ipv4.gateway '10.0.10.1'

现在,安装 Oracle Linux Virtualization Manager 发行版 4.5。

  1. 启用 ol8_baseos_latest 系统信息库。

    [root@olvm-he opc]# dnf config-manager --enable ol8_baseos_latest
    
  2. 安装 Oracle Linux Virtualization Manager 发行版 4.5 软件包,该软件包会自动启用或禁用所需的系统信息库。

    [root@olvm-he opc]# dnf install -y oracle-ovirt-release-45-el8
    
  3. 运行 dnf 命令以验证是否已启用所需的系统信息库。

    [root@olvm-he opc]# dnf clean all
    [root@olvm-he opc]# dnf repolist
    

    必须启用以下系统信息库:

    • ol8_baseos_latest
    • ol8_appstream
    • ol8_kvm_appstream
    • ovirt-4.5
    • ovirt-4.5-extra
    • ol8_gluster_appstream
    • (对于 VDSM)ol8_UEKR7
  4. 运行以下命令以启用任何缺少的系统信息库。

    [root@olvm-he opc]# dnf config-manager --enable <repository-name> 
    
  5. 如果主机运行的是 UEK R7,请运行以下命令。

    dnf install -y kernel-uek-modules-extra
    
  6. 运行 ovirt-engine 命令以安装管理器。

    dnf install -y ovirt-engine --allowerasing
    
  7. 请执行以下命令来配置引擎。

    engine-setup
    

对于每个配置步骤,您可以查看官方安装文档中的建议。有关详细信息,请参阅引擎配置选项

任务 2:访问 Oracle Linux Virtualization Manager Web 控制台

如果成功安装了 Oracle Linux Virtualization Manager,您应该会在控制台中看到 Web 访问信息。

http://olvm-he.olvm.defaultvcn.oraclevcn.com:80/ovirt-engine
https://olvm-he.olvm.defaultvcn.oraclevcn.com:443/ovirt-engine.

注:

要访问 Oracle Linux Virtualization Manager 托管引擎 Web 控制台,可以将 DNS 记录添加到本地操作系统 (Operating System,OS) 主机文件 C:\Windows\System32\drivers\etc\hosts

<VM-public-IP> olvm-he.olvm.defaultvcn.oraclevcn.com

可以使用 admin@ovirt 用户名和配置的密码进行验证。

OLVM Web 控制台

任务 3:设置基于 Oracle Linux 内核的虚拟机 (KVM) 主机

我们从第一个 KVM 主机开始。要配置第二个主机,需要通过 SSH 连接到第二个 BM 主机并运行相同的命令。请注意,在设置 VLAN 1000 接口时更新 MAC 和 IP 地址。

  1. 确认 KVM 主机具有两个辅助 VNIC,它们连接到 VLAN 1000 和 1001。

    VNIC 汇总

  2. 在 VLAN 1000 中设置辅助 VNIC。

    [root@kvm-1 opc]# nmcli connection add type vlan con-name ens340np0.1000 ifname ens340np0.1000 vlan.parent ens340np0 vlan.id 1000
    [root@kvm-1 opc]# nmcli connection modify ens340np0.1000 ethernet.cloned-mac-address 02:00:17:14:AA:20 ipv4.addresses '10.0.10.11/24' ipv4.gateway '10.0.10.1' ipv4.method manual
    

    注:

    • 02:00:17:14:AA:20 是第一个 KVM 主机的 VLAN 1000 VNIC 的 MAC 地址(在第二个 KVM 主机上设置接口 ens340np0.1000 时,请确保使用正确的 MAC 地址)。
    • 10.0.10.11/24 是我们将用于 VLAN 1000 中的第一个 KVM 主机的 IP 地址。
    • 10.0.10.12/24 是我们将用于 VLAN 1000 中的第二个 KVM 主机的 IP 地址。
  3. 启用 ol8_baseos_latest 系统信息库。

    [root@kvm-1 opc]# dnf config-manager --enable ol8_baseos_latest
    
  4. 安装 Oracle Linux Virtualization Manager 发行版 4.5 软件包,该软件包会自动启用或禁用所需的系统信息库。

    [root@kvm-1 opc]# dnf install -y oracle-ovirt-release-45-el8
    
  5. 运行 dnf 命令以验证是否已启用所需的系统信息库。

    [root@kvm-1 opc]# dnf clean all
    [root@kvm-1 opc]# dnf repolist
    

    必须启用以下系统信息库:

    • ol8_baseos_latest
    • ol8_appstream
    • ol8_kvm_appstream
    • ovirt-4.5
    • ovirt-4.5-extra
    • ol8_gluster_appstream
    • (对于 VDSM)ol8_UEKR7
  6. 运行以下命令以启用任何缺少的系统信息库。

    [root@kvm-1 opc]# dnf config-manager --enable <repository-name>
    
  7. 如果主机运行的是 UEK R7,请运行以下命令。

    [root@kvm-1 opc]# dnf install -y kernel-uek-modules-extra
    
  8. 激活驾驶舱 Web 控制台并打开防火墙端口。

    [root@kvm-1 opc]# systemctl enable --now cockpit.socket
    [root@kvm-1 opc]# firewall-cmd --permanent --zone=public --add-service=cockpit
    [root@kvm-1 opc]# firewall-cmd --reload
    

任务 4:设置 DNS 专用区域

  1. 在 OCI 中创建新的专用 DNS 区域。有关更多信息,请参见 Creating a Private DNS Zone

    • 该区域可以命名为 olvm.demo
    • 将区域连接到 VCN 的 DNS 专用视图。
  2. 为两个 KVM 主机创建两个 DNS 记录并发布更改。

    A 10.0.10.11 kvm1.olvm.demo
    A 10.0.10.12 kvm2.olvm.demo
    

    DNS 记录

任务 5:将 KVM 主机添加到 Oracle Linux Virtualization Manager

  1. 连接到 Oracle Linux Virtualization Manager Web 控制台。

  2. ovirtmgmt 网络更新为使用 VLAN 1000

    1. 导航到 NetworkNetworks

    2. 选择 ovirtmgmt ,然后单击编辑

    3. 选择 Enable VLAN tagging(启用 VLAN 标记),输入 1000 ,然后单击 Ok(确定)

  3. 添加 KVM 主机。

    1. 导航到计算主机

    2. 单击新建并输入以下信息。

      • 名称:输入 kvm1.olvm.demo
      • 主机名:输入 kvm1.olvm.demo.
      • 验证:选择 SSH 公钥

      将公共 SSH 密钥添加到 KVM 主机上的 /root/.ssh/authorized_keys 文件并删除现有内容。

    3. 单击确定

    KVM 主机

任务 6:将 Oracle Linux Virtualization Manager 证书颁发机构 (Certificate Authorities,CA) 添加到浏览器可信根证书颁发机构列表

  1. 从以下地址下载 CA 证书:https://<OLVM-hosted-engine-FQDN>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA

  2. 导航到浏览器的 Settings(设置)Certificates(证书),并将 Oracle Linux Virtualization Manager CA 导入到可信根证书颁发机构列表。

任务 7:创建新存储域

  1. 在与 KVM 主机相同的可用性域中创建新的 OCI 块存储卷。

    新块存储卷

  2. 将块存储卷连接到第一个 KVM 主机,然后选择读/写 - 可共享作为访问

    设置块存储卷读取/写入多个

  3. 将同一块存储卷连接到第二个 KVM 主机,然后选择读/写 - 可共享作为访问

  4. 在 Oracle Linux Virtualization Manager 中创建新存储域。

    1. 转到 Oracle Linux Virtualization Manager Web 控制台,导航到存储

    2. 单击新建域并输入以下信息。

      • 名称:输入 iscsi-datavol
      • 存储类型:选择 iSCSI
      • 主机:输入 kvm1.private.zone
      • 地址:输入 169.254.2.2
      • 端口:输入 3260
    3. 单击全部登录

    4. 展开搜索到的目标,然后单击 "Lun ID" 的 Add

    5. 单击确定创建新域。

任务 8:上载新的操作系统映像

  1. 转到 Oracle Linux Virtualization Manager Web 控制台,导航到 StorageDisks

  2. 依次单击上载开始

  3. 提供 OS ISO 映像。选择 iscsi-datavol 存储域,然后单击 Ok 。有关详细信息,请参见获取 Ubuntu 服务器

    上载新 ISO

任务 9:设置开放虚拟网络 (Open Virtual Network,OVN) 网络

  1. 转到 Oracle Linux Virtualization Manager Web 控制台,导航到 NetworkNetworks 并单击 New

  2. 输入以下信息。

    • 名称:选择默认
    • 选择在外部提供程序上创建
    • 外部提供程序:输入 ovirt-provider-ovn
    • 网络端口安全:选择 Disabled

    新的 OVN 网络

  3. 选择子网,并使用以下信息创建新子网。

    • 名称:选择默认值
    • CIDR:输入 10.0.150.0/24
    • 网关:输入 10.0.150.1

    ovn 子网设置

  4. 单击确定

任务 10:在 Oracle Linux Virtualization Manager 中预配新虚拟机

  1. 转到 Oracle Linux Virtualization Manager Web 控制台,导航到计算虚拟机,然后单击新建

  2. 输入以下信息。

    • 名称:输入 vm1
    • 实例映像中,单击创建,然后输入大小15GB
    • nic1:选择默认值
  3. 单击显示高级选项,输入以下信息,然后单击确定

    • 引导选项:附加 CD-ubuntu-24.04.1-live-server-amd64.iso

    新 VM

  4. 等待要创建的磁盘,选择已创建的 VM,单击运行并等待 VM 启动。

  5. 要连接到 VM 控制台,请导航到控制台控制台选项,选择 NoVNC ,单击确定,然后单击控制台

    继续安装 OS,请注意,在阶段,Internet 不可用。

任务 11:将开放虚拟网络连接到 OCI VCN

在下图中,您可以看到需要在 Oracle Linux Virtualization Manager 中定义的逻辑网络的图示。

OVN 网络图

通过分布式网关端口提供对 OCI VLAN 1001 的访问。有关更多信息,请参见 How to create an Open Virtual Network Distributed Gateway Router

  1. 在 KVM 主机上配置第三个 VNIC。

    nmcli connection add type vlan con-name ens340np0.1001 ifname ens340np0.1001 vlan.parent ens340np0 vlan.id 1001
       
    nmcli connection modify ens340np0.1001 ethernet.cloned-mac-address <VNIC-MAC> ipv4.method disabled ipv6.method disabled
       
    # replace the <VNIC-MAC> with the MAC address associated with the VNIC connected to VLAN 1001.
    
  2. 从 Oracle Linux Virtualization Manager 引擎运行以下命令以显示当前设置。

    [root@olvm-he opc]# ovn-nbctl show
    switch 9364e7ce-87a9-4bc4-b044-b973e3288bcd (ovirt-Default-72198b26-61c3-4448-b13e-b72bb29f57ea)
        port 35bfefc5-8a7e-4f17-b508-587d764875ba
            addresses: ["56:6f:4b:b2:00:01 dynamic"]
    [root@olvm-he opc]# ovn-sbctl show
    Chassis kvm2.olvm.demo
        hostname: kvm-2.kvmhosts.defaultvcn.oraclevcn.com
        Encap geneve
            ip: "10.0.10.12"
            options: {csum="true"}
    Chassis kvm1.olvm.demo
        hostname: kvm-1.kvmhosts.defaultvcn.oraclevcn.com
        Encap geneve
            ip: "10.0.10.11"
            options: {csum="true"}
        Port_Binding "35bfefc5-8a7e-4f17-b508-587d764875ba"
    
  3. 创建名为 router 的逻辑路由器。

    [root@olvm-he opc]# ovn-nbctl lr-add router
    
  4. 创建用于连接到 Oracle Linux Virtualization Manager Default 网桥的路由器端口。

    [root@olvm-he opc]# ovn-nbctl lrp-add router router-ovirt-default 40:44:00:00:00:03 10.0.150.1/24
    
  5. Default 桥连接到路由器。

    [root@olvm-he opc]# ovn-nbctl lsp-add ovirt-Default-72198b26-61c3-4448-b13e-b72bb29f57ea ovirt-default-router
    [root@olvm-he opc]# ovn-nbctl lsp-set-type ovirt-default-router router
    [root@olvm-he opc]# ovn-nbctl lsp-set-addresses ovirt-default-router router
    [root@olvm-he opc]# ovn-nbctl lsp-set-options ovirt-default-router router-port=router-ovirt-default
    
  6. 运行以下命令以显示逻辑网络。

    [root@olvm-he opc]# ovn-nbctl show
    switch 9364e7ce-87a9-4bc4-b044-b973e3288bcd (ovirt-Default-72198b26-61c3-4448-b13e-b72bb29f57ea)
        port ovirt-default-router
            type: router
            router-port: router-ovirt-default
        port 35bfefc5-8a7e-4f17-b508-587d764875ba
            addresses: ["56:6f:4b:b2:00:01 dynamic"]
    router b4bd08bc-d8c0-43c8-b27e-83e6e1f3b940 (router)
        port router-ovirt-default
            mac: "40:44:00:00:00:03"
            networks: ["10.0.150.1/24"]
    
  7. 创建名为 public 的逻辑桥。

    [root@olvm-he opc]# ovn-nbctl ls-add public
    
  8. 准备通过 provider 网络将本地 KVM 主机端口连接到逻辑桥 public

    [root@olvm-he opc]# ovn-nbctl lsp-add public ln-public
    [root@olvm-he opc]# ovn-nbctl lsp-set-type ln-public localnet
    [root@olvm-he opc]# ovn-nbctl lsp-set-addresses ln-public unknown
    [root@olvm-he opc]# ovn-nbctl lsp-set-options ln-public network_name=provider
    
  9. 使用分布式路由器端口将 router 连接到 public 逻辑桥。

    [root@olvm-he opc]# ovn-nbctl lrp-add router router-public 02:00:17:0F:D1:16 10.0.20.10/24
    [root@olvm-he opc]# ovn-nbctl lsp-add public public-router
    [root@olvm-he opc]# ovn-nbctl lsp-set-type public-router router
    [root@olvm-he opc]# ovn-nbctl lsp-set-addresses public-router router
    [root@olvm-he opc]# ovn-nbctl lsp-set-options public-router router-port=router-public
    
  10. 调度路由器端口(第一个 KVM 主机的优先级更高)。

    [root@olvm-he opc]# ovn-nbctl lrp-set-gateway-chassis router-public kvm1.olvm.demo 20
    [root@olvm-he opc]# ovn-nbctl lrp-set-gateway-chassis router-public kvm2.olvm.demo 15
    
  11. 检查路由器端口的配置。

    [root@olvm-he opc]# ovn-nbctl lrp-get-gateway-chassis router-public
    router-public-kvm1.olvm.demo    20
    router-public-kvm2.olvm.demo    15
    
  12. 通过 OCI VLAN 网关定义 0.0.0.0/0 的下一个跃点。

    [root@olvm-he opc]# ovn-nbctl lr-route-add router "0.0.0.0/0" 10.0.20.1
    
  13. 运行以下命令以查看配置摘要。

    [root@olvm-he opc]# ovn-nbctl show
    switch a7ce3f64-44e2-4a60-993b-b2d230a13212 (public)
        port public-router
            type: router
            router-port: router-public
        port ln-public
            type: localnet
            addresses: ["unknown"]
    switch 9364e7ce-87a9-4bc4-b044-b973e3288bcd (ovirt-Default-72198b26-61c3-4448-b13e-b72bb29f57ea)
        port ovirt-default-router
            type: router
            router-port: router-ovirt-default
        port 35bfefc5-8a7e-4f17-b508-587d764875ba
            addresses: ["56:6f:4b:b2:00:01 dynamic"]
    router b4bd08bc-d8c0-43c8-b27e-83e6e1f3b940 (router)
        port router-ovirt-default
            mac: "40:44:00:00:00:03"
            networks: ["10.0.150.1/24"]
        port router-public
            mac: "02:00:17:0F:D1:16"
            networks: ["10.0.20.10/24"]
            gateway chassis: [kvm1.olvm.demo kvm2.olvm.demo]
    [root@olvm-he opc]# ovn-sbctl show
    Chassis kvm2.olvm.demo
        hostname: kvm-2.kvmhosts.defaultvcn.oraclevcn.com
        Encap geneve
            ip: "10.0.10.12"
            options: {csum="true"}
    Chassis kvm1.olvm.demo
        hostname: kvm-1.kvmhosts.defaultvcn.oraclevcn.com
        Encap geneve
            ip: "10.0.10.11"
            options: {csum="true"}
        Port_Binding cr-router-public
        Port_Binding "35bfefc5-8a7e-4f17-b508-587d764875ba"
    

    通过在 kvm1.olvm.demo 部分下看到 Port_Binding cr-router-public,我们可以确认路由器端口与第一个 KVM 主机关联。

  14. 将连接到 VLAN 1001 的 KVM 主机的本地接口映射到 provider 网络。

    [root@kvm-1 opc]# ovs-vsctl set open . external-ids:ovn-cms-options="enable-chassis-as-gw=true"
    [root@kvm-1 opc]# ovs-vsctl set open . external-ids:ovn-bridge-mappings=provider:br-provider
    [root@kvm-1 opc]# ovs-vsctl --may-exist add-br br-provider
    [root@kvm-1 opc]# ovs-vsctl --may-exist add-port br-provider ens340np0.1001
    [root@kvm-1 opc]# ovs-vsctl set open . external-ids:ovn-chassis-mac-mappings=br-provider:02:00:17:0F:D1:16
        
    [root@kvm-2 opc]# ovs-vsctl set open . external-ids:ovn-cms-options="enable-chassis-as-gw=true"
    [root@kvm-2 opc]# ovs-vsctl set open . external-ids:ovn-bridge-mappings=provider:br-provider
    [root@kvm-2 opc]# ovs-vsctl --may-exist add-br br-provider
    [root@kvm-2 opc]# ovs-vsctl --may-exist add-port br-provider ens340np0.1001
    [root@kvm-2 opc]# ovs-vsctl set open . external-ids:ovn-chassis-mac-mappings=br-provider:02:00:17:08:08:A5
    
  15. OCI VLAN 仅向与 VLAN 连接的设备关联的 MAC 地址提供帧。

    如果不使用 NAT,当逻辑路由器端口的所有者发生更改时,我们需要更新逻辑路由器端口 MAC 地址以匹配活动机箱的 MAC 地址。

    以下服务负责此操作。使用机箱 MAC 地址映射更新 Open Virtual Network SB 数据库(切换控制器功能所需)。

    [root@olvm-he opc]# ovn-sbctl set chassis kvm1.olvm.demo external_ids:ovn-chassis-mac-mappings=br-provider:02:00:17:0F:D1:16 #replace with the MAC address of the VLAN1001 VNIC on KVM1 host
    [root@olvm-he opc]# ovn-sbctl set chassis kvm2.olvm.demo external_ids:ovn-chassis-mac-mappings=br-provider:02:00:17:08:08:A5 #replace with the MAC address of the the VLAN1001 VNIC on KVM2 host
    
  16. 使用以下内容创建名为 /usr/share/ovirt-provider-ovn/ovn_ha_gw_controller.py 的文件。

    import logging
    import os
    import sys
    import traceback
        
    from ovsdbapp.backend.ovs_idl import connection
    from ovsdbapp.backend.ovs_idl import idlutils
    from ovsdbapp.schema.ovn_southbound import impl_idl as impl_sbidl
    from ovsdbapp.schema.ovn_northbound import impl_idl as impl_nbidl
    from ovsdbapp.backend.ovs_idl import event as row_event
    from threading import Event
        
        
    stdout_handler = logging.StreamHandler(stream=sys.stdout)
        
    logging.basicConfig(
        level=logging.INFO, 
        format='%(processName)s %(threadName)s:	%(asctime)s - %(name)s - %(module)s - %(levelname)s - %(message)s',
        handlers = [stdout_handler]
    )
        
    logger = logging.getLogger('main')
        
        
    OVN_MONITORED_LOGICAL_PORT = os.environ.get('OVN_MONITORED_LOGICAL_PORT', '')
        
    if not OVN_MONITORED_LOGICAL_PORT:
        logger.info("No distributed router port name found. Check if the `OVN_MONITORED_LOGICAL_PORT` is defined.")
        sys.exit(1)
        
    conn_sb = "unix:/var/run/ovn/ovnsb_db.sock"
    conn_nb = "unix:/var/run/ovn/ovnnb_db.sock"
        
    class PortBindingEvent(row_event.RowEvent):
        """
        Port_Binding event
        """
        
        def __init__(self, monitored_logical_port):
            table = 'Port_Binding'
            self.monitored_logical_port = monitored_logical_port
            events = (self.ROW_UPDATE)
            super().__init__(events, table, None)
            self.event_name = self.__class__.__name__
        
        def match_fn(self, event, row, old):
            try:
                # Check if the event is for the distributed gateway port.
                if row.logical_port != self.monitored_logical_port:
                    return False
        
                # Check if chassis data is present and the chassis field was modified.
                logger.debug(f"Event match_fn with row: {row.__repr__} | old: {old.__dict__}")
                if len(row.chassis) and old._data.get("chassis", None):
                    logger.info(f"The monitored router port has been allocated to a new chassis: {row.chassis[0].name}")
                    return True
        
            except Exception as e:
                logger.error(traceback.format_exc())
            return False
        
        def run(self, event, row, old):
            # Determine the MAC address that should be used in the new chassis
            chassis_config = api_sb.db_get("Chassis", row.chassis[0].name, "other_config").execute()
            logger.debug(f"current chassis_config: {chassis_config}")
        
            # Fetching the new chassis MAC address
            new_chassis_mac = chassis_config.get("ovn-chassis-mac-mappings", "")[-17:]
            logger.debug(f"New chassis MAC: {new_chassis_mac}")
            if not new_chassis_mac:
                logger.error('The chassis MAC mappings has not been defined in the OVN SB database.')
                logger.error('Please update the chassis MAP mappings using the command:')
                logger.error('ovn-sbctl set chassis <chassis-name> external_ids:ovn-chassis-mac-mappings="<ext-br>:02:00:17:04:C2:99"')
                logger.error('Could not update the distributed routed port MAC address.')
                return
        
            # Fetching the distributed port name
            port_name = row.options.get('distributed-port')
            logger.debug(f"Port Name: {port_name}")
        
            # Updating the router port MAC Address
            api_nb.db_set("Logical_Router_Port", port_name, ("mac", new_chassis_mac)).execute()
            logger.info(f"MAC address for the router port {port_name} has been updated to: {new_chassis_mac}")
        
    class BaseOvnSbIdl(connection.OvsdbIdl):
        def __init__(self, remote, schema, **kwargs):
        
            event = PortBindingEvent(OVN_MONITORED_LOGICAL_PORT)
            self.notify_handler = row_event.RowEventHandler()
            self.notify_handler.watch_event(event)
        
            super(BaseOvnSbIdl, self).__init__(remote, schema, **kwargs)
        
        def notify(self, event, row, updates=None):
            self.notify_handler.notify(event, row, updates)
        
        
    i_sb = BaseOvnSbIdl.from_server(conn_sb, 'OVN_Southbound')
    i_nb = connection.OvsdbIdl.from_server(conn_nb, 'OVN_Northbound')
        
    # The ovsdbapp Connection object
    try:
        c_sb = connection.Connection(idl=i_sb, timeout=3)
        c_nb = connection.Connection(idl=i_nb, timeout=3)
    except Exception as e:
        logger.error(f'Unable to connect to the OVN databases: {traceback.format_exc()}')
        sys.exit(1)
        
    # The OVN_Northbound API implementation object
        
    api_sb = impl_sbidl.OvnSbApiIdlImpl(c_sb)
    api_nb = impl_nbidl.OvnNbApiIdlImpl(c_nb)
        
    logger.info(f'Started monitoring the distributed logical port: {OVN_MONITORED_LOGICAL_PORT}')
        
    Event().wait()
    
  17. 使用以下内容创建名为 /etc/systemd/system/ovn-ha-gateway-controller.service 的文件。

    [Unit]
    Description=oVirt HA Gateway port controller
    Requires=ovsdb-server.service
    After=ovsdb-server.service
        
    [Service]
    Environment="OVN_MONITORED_LOGICAL_PORT=cr-router-port"
    Type=simple
    ExecStart=/usr/libexec/platform-python /usr/share/ovirt-provider-ovn/ovn_ha_gw_controller.py
    ExecStop=
    Restart=always
    RestartSec=10
        
    [Install]
    WantedBy=multi-user.target
    Enable and start the service.
    
  18. 启动服务。

    systemctl enable ovn-ha-gateway-controller.service
    systemctl start ovn-ha-gateway-controller.service
    

任务 12:完成 OCI 网络配置。

VM1 中的包应能够到达 OCI VLAN 1001。我们的计划是使这些数据包能够到达互联网。

  1. 您应使用以下规则将路由表连接到 VLAN:(通过 NAT 网关将路由 0.0.0.0/0)。

    VLAN RT

  2. 对于从 Internet 返回到 VM1 的通信,我们需要处理 CIDR 10.0.150.0/24 的路由。我们需要为 VLAN 1001 定义外部 IP。这是与逻辑路由器端口 10.0.20.10 关联的 IP 地址。

    外部访问

    定义此 IP 地址后,我们将使用以下规则创建新的路由表:(路由 10.0.150.0/2410.0.20.10

    OLVM RT

  3. 现在,我们可以将此新路由与 NAT 网关关联并转发包以访问 VM1。

    NAT GW 路由关联

    在此阶段,我们应该能够从 VM1 访问 Internet。

    试通

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心