附註:

使用 Oracle Cloud Infrastructure 上的 Open Virtualization Network Provider 部署 Oracle Linux Virtualization Manager

簡介

在本教學課程中,我們將逐步介紹一個案例,讓團隊得以將現有的內部部署 Oracle Linux Virtualization Manager 環境擴展到 Oracle Cloud Infrastructure (OCI) 中,藉此提高裸機節點機組的使用率。藉由將 Oracle Cloud 的網路功能與 Open Virtual Network (OVN) 整合,您可以透過 FastConnect 橋接內部部署資源與 Oracle Linux Virtualization Manager 在 OCI 中部署虛擬機器 (VM) 之間的連線。

注意:本教學課程僅供測試和評估之用;OCI 的 Oracle Linux Virtualization Manager 支援正在開發中,且實際上不支援管理 OCI 系統。搭配 Oracle Linux Virtualization Manager 使用 OVN 正在進行技術預覽,表示功能仍在開發中。

解決方案概要與部署

解決方案總覽

我們需要具備以下資源的新 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 記錄至本機作業系統 (OS) 主機檔案 C:\Windows\System32\drivers\etc\hosts

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

您可以使用 admin@ovirt 使用者名稱和設定的密碼進行認證。

OLVM Web 主控台

作業 3:設定 Oracle Linux Kernel 型虛擬機器 (KVM) 主機

我們從第一個 KVM 主機開始。如果要設定第二個主機,您需要在第二個 BM 主機中執行 SSH,並執行相同的命令。設定 VLAN 1000 介面時,更新 MAC 和 IP 位址的注意事項。

  1. 確認 KVM 主機有兩個連線至 VLAN 1000 和 1001 的次要 VNIC。

    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. 啟用 Cockpit 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 區域。如需詳細資訊,請參閱建立專用 DNS 區域

    • 此區域的名稱可以是 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. 瀏覽至網路網路

    2. 選取 ovirtmgmt ,然後按一下編輯

    3. 選取啟用 VLAN 標記,輸入 1000 ,然後按一下確定

  3. 新增 KVM 主機。

    1. 瀏覽至運算主機

    2. 按一下新增,然後輸入下列資訊。

      • 名稱:輸入 kvm1.olvm.demo
      • 主機名稱:輸入 kvm1.olvm.demo.
      • 認證:選取 SSH 公開金鑰

      將公用 SSH 金鑰新增至 KVM 主機的 /root/.ssh/authorized_keys 檔案,並移除現有內容。

    3. 按一下確定

    KVM 主機

作業 6:將 Oracle Linux Virtualization Manager 憑證授權單位 (CA) 新增至瀏覽器信任的根憑證授權單位清單

  1. 從下列地址下載 CA 憑證:https://<OLVM-hosted-engine-FQDN>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA

  2. 瀏覽至瀏覽器設定值憑證,然後將 Oracle Linux Virtualization Manager CA 匯入信任的根憑證授權機構清單。

作業 7:建立新儲存網域

  1. 在與 KVM 主機相同的可用性網域內建立新的 OCI 區塊磁碟區。

    新區塊磁碟區

  2. 將區塊磁碟區連附至第一個 KVM 主機,然後選取讀取 / 寫入 - 可共用作為存取 (Access)

    設定區塊磁碟區讀取 / 寫入多個

  3. 將相同的區塊磁碟區連附至第二個 KVM 主機,然後選取讀取 / 寫入 - 可共用作為存取

  4. 在 Oracle Linux Virtualization Manager 中建立新的儲存體網域。

    1. 前往 Oracle Linux Virtualization Manager Web 主控台,瀏覽至儲存裝置網域

    2. 按一下新建網域,然後輸入下列資訊。

      • 名稱:輸入 iscsi-datavol
      • 儲存體類型 (Storage Type):選取 iSCSI
      • 主機:輸入 kvm1.private.zone
      • 地址:輸入 169.254.2.2
      • 連接埠:輸入 3260
    3. 按一下全部登入

    4. 展開找到的目標,然後按一下「Lun ID」的新增

    5. 按一下確定即可建立新網域。

作業 8:上傳新的作業系統映像檔

  1. 前往 Oracle Linux Virtualization Manager Web 主控台,瀏覽至儲存裝置磁碟

  2. 按一下上傳啟動

  3. 提供作業系統 ISO 映像檔。選取 iscsi-datavol 儲存體網域,然後按一下確定。如需詳細資訊,請參閱 Get Ubuntu Server

    上傳新的 ISO

作業 9:設定開啟的虛擬網路 (OVN) 網路

  1. 移至 Oracle Linux Virtualization Manager Web 主控台,瀏覽至網路網路,然後按一下新建

  2. 請輸入下列資訊。

    • 名稱:選取預設
    • 選取在外部提供者上建立
    • 外部提供者:輸入 ovirt-provider-ovn
    • 網路連接埠安全:選取停用

    新 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
    • 執行處理映像檔中,按一下建立,然後輸入 Size 作為 15GB
    • nic1:選取預設 / 預設
  3. 按一下顯示進階選項,輸入下列資訊,然後按一下確定

    • 啟動選項:附加 CD - ubuntu-24.04.1-live-server-amd64.iso

    新 VM

  4. 等待建立磁碟、選取建立的 VM、按一下執行,然後等待 VM 啟動。

  5. 若要連線至 VM 主控台,請瀏覽至主控台主控台選項,選取 NoVNC ,按一下確定,然後按一下主控台

    繼續安裝作業系統,請注意,目前無法使用網際網路。

作業 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 位址對應 (切換控制器功能需要) 更新開啟的虛擬網路 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:(路由 0.0.0.0/0 到 NAT 閘道)。

    VLAN RT

  2. 對於從網際網路返回 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 連線網際網路。

    偵測測試

認可

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center