注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
使用 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
):
- 一个公共子网 (
10.0.11.0/24
),用于托管引擎的主要 VNIC。 - 一个专用子网 (
10.0.12.0/24
),用于基于 Oracle Linux 内核的虚拟机 (KVM) 主机的主 VNIC。 - 用于 Oracle Linux Virtualization Manager 托管引擎与 KVM 主机之间通信的虚拟局域网 (Virtual Local Area Network,VLAN) 1000 (
10.0.10.0/24
)。 - 用于将 OVN 虚拟网络扩展到 OCI 的 VLAN 1001 (
10.0.20.0/24
)。 - 一个 NAT 网关。
- 一个 Internet 网关。
- 一个专用路由表(通过 NAT 网关为
0.0.0.0/0
),并将其与专用子网和 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。
-
创建运行 Oracle Linux 8 的两个 BM 实例(建议配置: BM.Standard.E5.192 ),这些实例将用作 KVM 主机。将两个辅助 VNIC 连接到每个 BM 主机,并将其连接到 VLAN 1000 和 1001。
目标
- 在 OCI 中运行 Oracle Linux Virtualization Manager 发行版 4.5,并允许 VM 通过 OCI NAT 网关访问互联网。
先决条件
-
Oracle Linux Virtualization Manager 托管引擎可以在 VM 上运行 (VM.Standard.E5)。灵活,具有 2 个 OCPU/24GB RAM —经过测试 )。
-
基于 Oracle Linux 内核的虚拟机 (KVM) 主机可以在裸金属 (Bare Metal,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 记录添加到本地操作系统 (Operating System,OS) 主机文件 C:\Windows\System32\drivers\etc\hosts
。
<VM-public-IP> olvm-he.olvm.defaultvcn.oraclevcn.com
可以使用 admin@ovirt
用户名和配置的密码进行验证。
任务 3:设置基于 Oracle Linux 内核的虚拟机 (KVM) 主机
我们从第一个 KVM 主机开始。要配置第二个主机,需要通过 SSH 连接到第二个 BM 主机并运行相同的命令。请注意,在设置 VLAN 1000 接口时更新 MAC 和 IP 地址。
-
确认 KVM 主机具有两个辅助 VNIC,它们连接到 VLAN 1000 和 1001。
-
在 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
-
激活驾驶舱 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 区域。有关更多信息,请参见 Creating a Private DNS Zone 。
- 该区域可以命名为
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 。
-
导航到 Network 和 Networks 。
-
选择 ovirtmgmt ,然后单击编辑。
-
选择 Enable VLAN tagging(启用 VLAN 标记),输入 1000 ,然后单击 Ok(确定)。
-
-
添加 KVM 主机。
-
导航到计算和主机。
-
单击新建并输入以下信息。
- 名称:输入
kvm1.olvm.demo
。 - 主机名:输入
kvm1.olvm.demo.
- 验证:选择 SSH 公钥。
将公共 SSH 密钥添加到 KVM 主机上的
/root/.ssh/authorized_keys
文件并删除现有内容。 - 名称:输入
-
单击确定。
-
任务 6:将 Oracle Linux Virtualization Manager 证书颁发机构 (Certificate Authorities,CA) 添加到浏览器可信根证书颁发机构列表
-
从以下地址下载 CA 证书:
https://<OLVM-hosted-engine-FQDN>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA
。 -
导航到浏览器的 Settings(设置)、 Certificates(证书),并将 Oracle Linux Virtualization Manager CA 导入到可信根证书颁发机构列表。
任务 7:创建新存储域
-
在与 KVM 主机相同的可用性域中创建新的 OCI 块存储卷。
-
将块存储卷连接到第一个 KVM 主机,然后选择读/写 - 可共享作为访问。
-
将同一块存储卷连接到第二个 KVM 主机,然后选择读/写 - 可共享作为访问。
-
在 Oracle Linux Virtualization Manager 中创建新存储域。
-
转到 Oracle Linux Virtualization Manager Web 控制台,导航到存储和域。
-
单击新建域并输入以下信息。
- 名称:输入
iscsi-datavol
。 - 存储类型:选择 iSCSI 。
- 主机:输入
kvm1.private.zone
。 - 地址:输入
169.254.2.2
。 - 端口:输入
3260
。
- 名称:输入
-
单击全部登录。
-
展开搜索到的目标,然后单击 "Lun ID" 的 Add 。
-
单击确定创建新域。
-
任务 8:上载新的操作系统映像
-
转到 Oracle Linux Virtualization Manager Web 控制台,导航到 Storage 和 Disks 。
-
依次单击上载和开始。
-
提供 OS ISO 映像。选择 iscsi-datavol 存储域,然后单击 Ok 。有关详细信息,请参见获取 Ubuntu 服务器。
任务 9:设置开放虚拟网络 (Open Virtual Network,OVN) 网络
-
转到 Oracle Linux Virtualization Manager Web 控制台,导航到 Network 、 Networks 并单击 New 。
-
输入以下信息。
- 名称:选择默认。
- 选择在外部提供程序上创建。
- 外部提供程序:输入
ovirt-provider-ovn
。 - 网络端口安全:选择 Disabled 。
-
选择子网,并使用以下信息创建新子网。
- 名称:选择默认值。
- CIDR:输入
10.0.150.0/24
。 - 网关:输入
10.0.150.1
。
-
单击确定。
任务 10:在 Oracle Linux Virtualization Manager 中预配新虚拟机
-
转到 Oracle Linux Virtualization Manager Web 控制台,导航到计算、虚拟机,然后单击新建。
-
输入以下信息。
- 名称:输入
vm1
。 - 在实例映像中,单击创建,然后输入大小为 15GB 。
- nic1:选择默认值。
- 名称:输入
-
单击显示高级选项,输入以下信息,然后单击确定。
- 引导选项:附加 CD-
ubuntu-24.04.1-live-server-amd64.iso
。
- 引导选项:附加 CD-
-
等待要创建的磁盘,选择已创建的 VM,单击运行并等待 VM 启动。
-
要连接到 VM 控制台,请导航到控制台、控制台选项,选择 NoVNC ,单击确定,然后单击控制台。
继续安装 OS,请注意,在阶段,Internet 不可用。
任务 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 地址映射更新 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
-
使用以下内容创建名为
/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:(通过 NAT 网关将路由
0.0.0.0/0
)。 -
对于从 Internet 返回到 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 访问 Internet。
相关链接
确认
- 作者 — Andrei Ilas(首席云架构师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Deploy Oracle Linux Virtualization Manager using the Open Virtualization Network Provider on Oracle Cloud Infrastructure
G19506-02
December 2024