参考架构¶
参考架构定义了在生产环境中部署具有 Open Virtual Network (OVN) 集成的 OpenStack 所需的最低环境,并具备足够的规模和性能期望。为了评估目的,您可以使用 安装指南 或 Vagrant 部署此环境。任何扩展或性能评估都应使用裸机而不是虚拟机。
布局¶
参考架构包括至少四个节点。
控制器节点包含以下组件,提供足够的功能来启动基本实例
一个网络接口用于管理
身份服务
镜像服务
使用 ML2 机制驱动程序进行 OVN 的网络管理(控制平面)
计算管理(控制平面)
数据库节点包含以下组件
一个网络接口用于管理
OVN 北向服务 (
ovn-northd)Open vSwitch (OVS) 数据库服务 (
ovsdb-server) 用于 OVN 北向数据库 (ovnnb.db)Open vSwitch (OVS) 数据库服务 (
ovsdb-server) 用于 OVN 南向数据库 (ovnsb.db)
注意
仅用于功能评估,您可以组合控制器和数据库节点。
两个计算节点包含以下组件
两个或三个网络接口用于管理、覆盖网络和可选的提供者网络
计算管理(hypervisor)
Hypervisor (KVM)
OVN 控制器服务 (
ovn-controller)OVS 数据平面服务 (
ovs-vswitchd)OVS 数据库服务 (
ovsdb-server) 与 OVS 本地配置 (conf.db) 数据库OVN 元数据代理 (
ovn-metadata-agent)
网关节点包含以下组件
三个网络接口用于管理、覆盖网络和提供者网络。
OVN 控制器服务 (
ovn-controller)OVS 数据平面服务 (
ovs-vswitchd)OVS 数据库服务 (
ovsdb-server) 与 OVS 本地配置 (conf.db) 数据库
注意
每个 OVN 元数据代理都在计算节点上以轻量级的方式提供本地元数据服务。访问计算节点实例的每个网络都将具有相应的元数据 ovnmeta-$net_uuid 命名空间,并且内部的 haproxy 会通过 unix socket 将请求转发到 ovn-metadata-agent。
对于调试目的,此命名空间非常有用,可以访问计算节点上的本地实例。如果您以 root 用户身份登录到该计算节点,您可以执行
ip netns ovnmeta-$net_uuid exec ssh user@my.instance.ip.address
硬件布局¶
服务布局¶
具有 OVN 集成的网络服务¶
参考架构部署具有 OVN 集成的网络服务,如以下场景所述
使用 ovn 驱动程序,所有遍历虚拟路由器的东西向流量完全分布,从一个计算节点到另一个计算节点,而无需通过网关节点。
需要 SNAT(没有浮动 IP)的南北流量将始终通过集中式网关节点,但是,一旦您拥有多个网关节点,ovn 驱动程序将利用 ovn 的 HA 功能。
集中式浮动 IP¶
在此架构中,所有南北路由器流量(snat 和浮动 IP)都通过网关节点。
计算节点不需要连接到外部网络,尽管如果我们要让某些实例直接连接到该网络,可以提供连接。
为了进行外部连接,网关节点必须在 Open_vSwitch 表的 external_ids 列中设置 ovn-cms-options,并使用 enable-chassis-as-gw,例如
$ ovs-vsctl set open . external-ids:ovn-cms-options="enable-chassis-as-gw"
分布式浮动 IP (DVR)¶
在此架构中,浮动 IP 南北流量直接通过特定的提供者网络桥从/到计算节点流动。在这种情况下,计算节点需要连接到外部网络。
每个计算节点包含以下网络组件
注意
网络服务为每个虚拟网络创建一个唯一的网络命名空间,从而启用元数据服务。
可以通过提供者桥创建几个外部连接。这些可用于直接 vm 连接到特定网络或使用分布式浮动 IP。
访问 OVN 数据库内容¶
OVN 将配置数据存储在一组 OVS 数据库表中。以下命令显示北向和南向数据库中最常见数据库表的内容。本节中的示例数据库输出使用这些命令和各种输出过滤器。
$ ovn-nbctl list Logical_Switch
$ ovn-nbctl list Logical_Switch_Port
$ ovn-nbctl list ACL
$ ovn-nbctl list Address_Set
$ ovn-nbctl list Logical_Router
$ ovn-nbctl list Logical_Router_Port
$ ovn-nbctl list Gateway_Chassis
$ ovn-sbctl list Chassis
$ ovn-sbctl list Encap
$ ovn-nbctl list Address_Set
$ ovn-sbctl lflow-list
$ ovn-sbctl list Multicast_Group
$ ovn-sbctl list Datapath_Binding
$ ovn-sbctl list Port_Binding
$ ovn-sbctl list MAC_Binding
$ ovn-sbctl list Gateway_Chassis
注意
默认情况下,您必须从包含 OVN 数据库的节点运行这些命令。
添加计算节点¶
当您将计算节点添加到环境中时,该节点上的 OVN 控制器服务将连接到 OVN 南向数据库并将该节点注册为 chassis。
_uuid : 9be8639d-1d0b-4e3d-9070-03a655073871
encaps : [2fcefdf4-a5e7-43ed-b7b2-62039cc7e32e]
external_ids : {ovn-bridge-mappings=""}
hostname : "compute1"
name : "410ee302-850b-4277-8610-fa675d620cb7"
vtep_logical_switches: []
encaps 字段值引用计算节点的隧道端点信息。
_uuid : 2fcefdf4-a5e7-43ed-b7b2-62039cc7e32e
ip : "10.0.0.32"
options : {}
type : geneve
安全组/规则¶
创建 Neutron 安全组时,等效的 OVN 端口组 (pg-<security_group_id>) 会被创建。此端口组在 external_ids 列中引用 Neutron SG id。
创建 Neutron 端口时,等效的 OVN 逻辑端口将添加到与该端口所属的 Neutron 安全组关联的那些端口组。
删除 Neutron 端口时,将删除 OVN 中的关联逻辑端口。由于模式包含对端口的弱引用,因此在删除 LSP 时,它将自动从先前存在的任何端口组条目中删除。
每次创建安全组规则时,我们不会确定受其 SG 影响的端口并插入将由不同的逻辑交换机引用的 ACL 行,而是从关联的端口组引用它。
OVN 操作¶
创建安全组将导致 OVN 机制驱动程序在北向 DB 的 Port_Group 表中创建一个端口组
_uuid : e96c5994-695d-4b9c-a17b-c7375ad281e2 acls : [33c3c2d0-bc7b-421b-ace9-10884851521a, c22170ec-da5d-4a59-b118-f7f0e370ebc4] external_ids : {"neutron:security_group_id"="ccbeffee-7b98-4b6f-adf7-d42027ca6447"} name : pg_ccbeffee_7b98_4b6f_adf7_d42027ca6447 ports : []
它还在北向 DB 的 ACL 表中创建默认 ACL,用于出站流量
_uuid : 33c3c2d0-bc7b-421b-ace9-10884851521a action : allow-related direction : from-lport external_ids : {"neutron:security_group_rule_id"="655b0d7e-144e-4bd8-9243-10a261b91041"} log : false match : "inport == @pg_ccbeffee_7b98_4b6f_adf7_d42027ca6447 && ip4" meter : [] name : [] priority : 1002 severity : [] _uuid : c22170ec-da5d-4a59-b118-f7f0e370ebc4 action : allow-related direction : from-lport external_ids : {"neutron:security_group_rule_id"="a303a34f-5f19-494f-a9e2-e23f246bfcad"} log : false match : "inport == @pg_ccbeffee_7b98_4b6f_adf7_d42027ca6447 && ip6" meter : [] name : [] priority : 1002 severity : []
没有安全组的端口¶
当端口不属于任何安全组并且启用端口安全时,默认情况下,我们会丢弃所有到/从该端口的流量。为了通过端口组实现这一点,我们将创建一个具有固定名称 (neutron_pg_drop) 的特殊端口组,该端口组保存用于丢弃所有流量的 ACL。
此 PG 在 neutron-server 分叉到 worker 之前自动创建一次。
网络¶
路由器¶
实例¶
启动实例会导致无论网络如何,都会发生相同的操作序列。以下示例使用 provider 提供者网络、cirros 镜像、m1.tiny flavor、default 安全组和 mykey 密钥。