参考架构

参考架构定义了在生产环境中部署具有 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

硬件布局

Hardware layout

服务布局

Service layout

具有 OVN 集成的网络服务

参考架构部署具有 OVN 集成的网络服务,如以下场景所述

Architecture for Networking service with OVN integration

使用 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 南北流量直接通过特定的提供者网络桥从/到计算节点流动。在这种情况下,计算节点需要连接到外部网络。

每个计算节点包含以下网络组件

Compute node network components

注意

网络服务为每个虚拟网络创建一个唯一的网络命名空间,从而启用元数据服务。

可以通过提供者桥创建几个外部连接。这些可用于直接 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 操作

  1. 创建安全组将导致 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 密钥。