附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱 Oracle Cloud Infrastructure Free Tier 入門。
- 它使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特定的值。
使用 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
):
- 一個公用子網路 (
10.0.11.0/24
) 用於代管引擎的主要 VNIC。 - 一個專用子網路 (
10.0.12.0/24
),用於 Oracle Linux Kernel-based Virtual Machine (KVM) 主機的主要 VNIC。 - 虛擬區域網路 (VLAN) 1000 (
10.0.10.0/24
),用於 Oracle Linux Virtualization Manager 代管引擎與 KVM 主機之間的通訊。 - 用來將 OVN 虛擬網路擴展至 OCI 的 VLAN 1001 (
10.0.20.0/24
)。 - 一個 NAT 閘道。
- 一個網際網路閘道。
- 一個專用路由表 (
0.0.0.0/0
透過 NAT 閘道),並將其與專用子網路和 VLAN 1001 建立關聯。 - 一個公用路由表 (
0.0.0.0/0
透過網際網路閘道) 並將其與公用子網路建立關聯。 - 安全清單應允許:
- 所有傳出連線 (
0.0.0.0/0
) 協定。 - VCN CIDR (
10.0.0.0/16
) 的所有傳入連線。 - 從屬端 PC 之所有協定的傳入連線。
- 所有傳出連線 (
解決方案部署
-
建立一個 VM 執行處理 (建議的組態:VM.Standard.E5)。彈性搭配 2 個 OCPU/24GB RAM,為代管的引擎執行 Oracle Linux 8。將次要 VNIC 連附至 VM 執行處理,並將其連線至 VLAN 1000。
-
建立兩個 BM 執行處理 (建議的組態: BM.Standard.E5.192),執行將作為 KVM 主機的 Oracle Linux 8。將兩個次要 VNIC 附加至每個 BM 主機,然後將其連接至 VLAN 1000 和 1001。
目標
- 在 OCI 中執行 Oracle Linux Virtualization Manager 版本 4.5,讓 VM 可以透過 OCI NAT 閘道存取網際網路。
必要條件
-
Oracle Linux Virtualization Manager hosted engine can run on a VM (VM.Standard.E5.Flex with 2 OCPUs/24GB RAM - tested).
-
Oracle Linux Kernel-based Virtual Machine (KVM) 主機可以在裸機 (BM) 主機 ( BM.Standard.E5.192 - 已測試) 上執行。
-
所有 BM 資源都必須在相同的可用性網域 (AD) 中建立。
-
所有主機均可執行 Oracle Linux 8 (Oracle-Linux-8.10-2024.09.30-0 - 已測試)。
作業 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。
-
啟用
ol8_baseos_latest
儲存區域。[root@olvm-he opc]# dnf config-manager --enable ol8_baseos_latest
-
安裝會自動啟用或停用必要儲存區域的 Oracle Linux Virtualization Manager 版本 4.5 套裝程式。
[root@olvm-he opc]# dnf install -y oracle-ovirt-release-45-el8
-
執行
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
-
執行下列命令以啟用任何遺漏的儲存區域。
[root@olvm-he opc]# dnf config-manager --enable <repository-name>
-
如果主機正在執行 UEK R7,請執行下列指令。
dnf install -y kernel-uek-modules-extra
-
執行
ovirt-engine
指令以安裝管理員。dnf install -y ovirt-engine --allowerasing
-
執行下列命令以設定引擎。
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 VCN 網域不可公開解析。
- 確定為執行處理設定的安全清單 /NSG 允許使用連接埠 443 的傳入連線。
若要存取 Oracle Linux Virtualization Manager 代管的引擎 Web 主控台,您可以新增 DNS 記錄至本機作業系統 (OS) 主機檔案 C:\Windows\System32\drivers\etc\hosts
。
<VM-public-IP> olvm-he.olvm.defaultvcn.oraclevcn.com
您可以使用 admin@ovirt
使用者名稱和設定的密碼進行認證。
作業 3:設定 Oracle Linux Kernel 型虛擬機器 (KVM) 主機
我們從第一個 KVM 主機開始。如果要設定第二個主機,您需要在第二個 BM 主機中執行 SSH,並執行相同的命令。設定 VLAN 1000 介面時,更新 MAC 和 IP 位址的注意事項。
-
確認 KVM 主機有兩個連線至 VLAN 1000 和 1001 的次要 VNIC。
-
在 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 位址。
-
啟用
ol8_baseos_latest
儲存區域。[root@kvm-1 opc]# dnf config-manager --enable ol8_baseos_latest
-
安裝會自動啟用或停用必要儲存區域的 Oracle Linux Virtualization Manager 版本 4.5 套裝程式。
[root@kvm-1 opc]# dnf install -y oracle-ovirt-release-45-el8
-
執行
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
-
執行下列命令以啟用任何遺漏的儲存區域。
[root@kvm-1 opc]# dnf config-manager --enable <repository-name>
-
如果主機正在執行 UEK R7,請執行下列指令。
[root@kvm-1 opc]# dnf install -y kernel-uek-modules-extra
-
啟用 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 專用區域
-
在 OCI 中建立新的專用 DNS 區域。如需詳細資訊,請參閱建立專用 DNS 區域。
- 此區域的名稱可以是
olvm.demo
。 - 將區域連附至 VCN 的 DNS 專用檢視。
- 此區域的名稱可以是
-
為兩個 KVM 主機建立兩筆 DNS 記錄並發布變更。
A 10.0.10.11 kvm1.olvm.demo A 10.0.10.12 kvm2.olvm.demo
作業 5:新增 KVM 主機至 Oracle Linux Virtualization Manager
-
連線至 Oracle Linux Virtualization Manager Web 主控台。
-
更新 ovirtmgmt 網路以使用 VLAN 1000 。
-
瀏覽至網路和網路。
-
選取 ovirtmgmt ,然後按一下編輯。
-
選取啟用 VLAN 標記,輸入 1000 ,然後按一下確定。
-
-
新增 KVM 主機。
-
瀏覽至運算和主機。
-
按一下新增,然後輸入下列資訊。
- 名稱:輸入
kvm1.olvm.demo
。 - 主機名稱:輸入
kvm1.olvm.demo.
- 認證:選取 SSH 公開金鑰。
將公用 SSH 金鑰新增至 KVM 主機的
/root/.ssh/authorized_keys
檔案,並移除現有內容。 - 名稱:輸入
-
按一下確定。
-
作業 6:將 Oracle Linux Virtualization Manager 憑證授權單位 (CA) 新增至瀏覽器信任的根憑證授權單位清單
-
從下列地址下載 CA 憑證:
https://<OLVM-hosted-engine-FQDN>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA
。 -
瀏覽至瀏覽器設定值、憑證,然後將 Oracle Linux Virtualization Manager CA 匯入信任的根憑證授權機構清單。
作業 7:建立新儲存網域
-
在與 KVM 主機相同的可用性網域內建立新的 OCI 區塊磁碟區。
-
將區塊磁碟區連附至第一個 KVM 主機,然後選取讀取 / 寫入 - 可共用作為存取 (Access) 。
-
將相同的區塊磁碟區連附至第二個 KVM 主機,然後選取讀取 / 寫入 - 可共用作為存取。
-
在 Oracle Linux Virtualization Manager 中建立新的儲存體網域。
-
前往 Oracle Linux Virtualization Manager Web 主控台,瀏覽至儲存裝置與網域。
-
按一下新建網域,然後輸入下列資訊。
- 名稱:輸入
iscsi-datavol
。 - 儲存體類型 (Storage Type):選取 iSCSI 。
- 主機:輸入
kvm1.private.zone
。 - 地址:輸入
169.254.2.2
。 - 連接埠:輸入
3260
。
- 名稱:輸入
-
按一下全部登入。
-
展開找到的目標,然後按一下「Lun ID」的新增。
-
按一下確定即可建立新網域。
-
作業 8:上傳新的作業系統映像檔
-
前往 Oracle Linux Virtualization Manager Web 主控台,瀏覽至儲存裝置與磁碟。
-
按一下上傳和啟動。
-
提供作業系統 ISO 映像檔。選取 iscsi-datavol 儲存體網域,然後按一下確定。如需詳細資訊,請參閱 Get Ubuntu Server 。
作業 9:設定開啟的虛擬網路 (OVN) 網路
-
移至 Oracle Linux Virtualization Manager Web 主控台,瀏覽至網路,網路,然後按一下新建。
-
請輸入下列資訊。
- 名稱:選取預設。
- 選取在外部提供者上建立。
- 外部提供者:輸入
ovirt-provider-ovn
。 - 網路連接埠安全:選取停用。
-
選取子網路,並使用下列資訊建立新的子網路。
- 名稱:選取預設。
- CIDR:輸入
10.0.150.0/24
。 - 閘道:輸入
10.0.150.1
。
-
按一下確定。
作業 10:在 Oracle Linux Virtualization Manager 中佈建新的虛擬機器
-
移至 Oracle Linux Virtualization Manager Web 主控台,瀏覽至運算、虛擬機器,然後按一下新建。
-
請輸入下列資訊。
- 名稱:輸入
vm1
。 - 在執行處理映像檔中,按一下建立,然後輸入 Size 作為 15GB 。
- nic1:選取預設 / 預設。
- 名稱:輸入
-
按一下顯示進階選項,輸入下列資訊,然後按一下確定。
- 啟動選項:附加 CD -
ubuntu-24.04.1-live-server-amd64.iso
。
- 啟動選項:附加 CD -
-
等待建立磁碟、選取建立的 VM、按一下執行,然後等待 VM 啟動。
-
若要連線至 VM 主控台,請瀏覽至主控台的主控台選項,選取 NoVNC ,按一下確定,然後按一下主控台。
繼續安裝作業系統,請注意,目前無法使用網際網路。
作業 11:將開啟的虛擬網路連線至 OCI VCN
在下列影像中,您可以看到我們必須在 Oracle Linux Virtualization Manager 中定義的邏輯網路圖解。
OCI VLAN 1001 的存取是透過分散式閘道連接埠提供。如需詳細資訊,請參閱 How to create an Open Virtual Network distributed Gateway router 。
-
設定 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.
-
從 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"
-
建立名為
router
的邏輯路由器。[root@olvm-he opc]# ovn-nbctl lr-add router
-
建立 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
-
將
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
-
執行下列指令以顯示邏輯網路。
[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"]
-
建立名為
public
的邏輯橋接器。[root@olvm-he opc]# ovn-nbctl ls-add public
-
準備透過
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
-
使用分散式路由器連接埠將
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
-
排定路由器連接埠 (第一部 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
-
檢查路由器連接埠的組態。
[root@olvm-he opc]# ovn-nbctl lrp-get-gateway-chassis router-public router-public-kvm1.olvm.demo 20 router-public-kvm2.olvm.demo 15
-
透過 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
-
執行下列命令以查看組態摘要。
[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 主機關聯。 -
將連線到 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
-
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
-
使用下列內容建立名稱為
/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()
-
使用下列內容建立名稱為
/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.
-
啟動服務。
systemctl enable ovn-ha-gateway-controller.service systemctl start ovn-ha-gateway-controller.service
作業 12:完成 OCI 網路組態。
VM1 中的封包應該能夠連線 OCI VLAN 1001。我們的計畫是讓這些封包連線到網際網路。
-
您應該使用下列規則將路由表連附至 VLAN:(路由
0.0.0.0/0
到 NAT 閘道)。 -
對於從網際網路返回 VM1 的流量,我們需要處理 CIDR
10.0.150.0/24
的路由。我們需要為 VLAN 1001 定義外部 IP。這是與邏輯路由器連接埠10.0.20.10
關聯的 IP 位址。定義此 IP 位址後,我們將使用以下規則建立新的路由表:(路由
10.0.150.0/24
到10.0.20.10
) -
現在,我們可以將此新路由與 NAT 閘道建立關聯,然後將封包轉送至 VM1。
在這個階段,我們應該能夠從 VM1 連線網際網路。
相關連結
認可
- 作者 - Andrei Ilas (主要雲端架構師)
其他學習資源
探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Deploy Oracle Linux Virtualization Manager using the Open Virtualization Network Provider on Oracle Cloud Infrastructure
G19507-02
December 2024