在 chef cookbook 中启用分布式虚拟路由器(DVR)

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/openstack-chef/+spec/enable-dvr-chef-cookbook

问题描述

目前 DVR 在 Neutron 中默认禁用,并且不允许在 Network cookbook 中进行配置。部署后,用户必须手动修改 Neutron 配置文件才能启用 DVR。

提议的变更

cookbook-openstack-network 中的以下属性文件将被修改:* default.rb 我们将在其中添加属性 [‘openstack’][‘network’][‘router_distributed’]。用户可以将此属性设置为 ‘auto’、true 和 false。当此属性设置为 ‘auto’ 时,chef cookbook 将执行充分的检查,例如检查网络类型 ML2 扩展是否支持 DVR,检查是否启用了 OVS,然后 chef cookbook 将启用 DVR,或者输出警告消息和日志以告知用户发生了什么情况。并且考虑到只有 GRE 和 VXLAN 网络类型支持 DVR,router_distributed 的 true 和 false 设置仅在两种网络类型中有效。对于 VLAN 网络类型,即使将 router_distributed 设置为 true,DVR 也会默认禁用,将向用户提供警告消息以通知为什么 DVR 配置不起作用。

cookbook-openstack-network 中的以下模板文件将被修改:* neutron.conf.erb * l3_agent.ini.erb * ovs_neutron_plugin.ini.erb * ml2_conf.ini.erb 修改 neutron.conf.erb 中的 ‘router_distributed’ 属性,l3_agent.ini.erb 中的 ‘agent_mode’,ovs_neutron_plugin.ini.erb 中的 ‘enable_distributed_routing’ 和 ‘l2_population’,以及 ml2_conf.ini.erb 中的 ‘mechanism_drivers’。这些属性可以在以下参考部分中的 howto 链接中找到。

cookbook-openstack-network 中的以下 recipe 文件可能会被修改:* l3_agent.rb DVR 为虚拟机提供新的数据路径,例如东西向通信,为计算节点提供外部 IP,以便虚拟机不仅可以从网络节点获取浮动 IP。并且 DVR 仅在具有 L3 代理和 OVS 代理的节点上工作,这些代理将为网络节点角色和计算节点角色安装。l3_agent.ini.erb 在启用 DVR 时需要查询当前节点是计算节点还是网络节点。我们将使用现有的网络节点角色和计算节点角色来处理此问题。如果节点同时具有这两个角色,我们将此节点视为网络节点。

如果需要,我们还需要方法来确保必要的软件包,例如 iproute,安装在计算节点上。

DVR 由网络类型 GRE 和 VXLAN 支持,但目前不支持 VLAN,因此我们还需要一种方法来确保当前网络类型是 GRE 或 VXLAN,网络类型需要映射到 ovs_neutron_plugin.ini 中键名 tunnel_types,其值为 gre 或 vxlan。如果当前网络类型是 VLAN,我们应该停止 DVR 的配置。我们还需要方法来确保在计算节点上创建必要的网络资源,例如隧道网络桥接。

如果需要,我们将更改计算节点的角色定义。

我们已经进行了测试并在 Redhat 和 Ubuntu 上启用了 DVR,但并非所有版本都经过测试。因此,在 cookbook 中,我们将处理不同平台和受影响版本中的细节,并输出警告消息和日志到我们不支持的操作系统。

备选方案

另一种处理 tunnel_types 为 vlan 时启用 DVR 的情况是,我们可以用 gre 或 vxlan 覆盖 ovs_neutron_plugin.ini 中 tunnel_type 的值。考虑到如果用户决定启用 DVR,用户可以接受 openvswitch 代理配置文件中的更改。

数据模型影响

REST API 影响

实现

负责人

主要负责人

<lzklibj@cn.ibm.com>

其他贡献者

工作项

依赖项

测试

在环境文件中添加属性 ‘router_distributed’ => ‘true’,然后部署 1+N 环境或多个网络节点环境。(All-in-one 案例是不必要的,我们可以将其视为 1+0 案例)检查配置文件是否根据 wiki Neutron DVR HowTo 页面中的列表进行了修改。

构建网络 N1 和 N2,路由器 R1,将 N1 和 N2 的子网添加到 R1 作为接口,在启动任何实例之前,我们应该在计算节点上运行 “ip netns” 时看不到任何列出内容。在 N1 和 N2 上启动实例,在不同的计算节点上,我们应该通过在这些计算节点上运行 “ip netns” 来查看网络命名空间。

ip-netns 是进程网络命名空间管理命令。您可以运行 “ip netns help” 以获取更多用法。而 “ip netns” 是 “ip netns list” 的简写,它将显示所有命名的网络命名空间,这些命名空间位于 /var/run/netns 下。

此外,我们可以在从计算节点运行 tcpdump 的同时,从 vm 到 vm 之间 ping 来检查输出。如果我们从网络节点或 CN1(计算节点 1)上登录 vm1 在 N1 上,并在 CN2 上启动 vm2 在 N2 上,在登录 vm1 后(无论我们从网络节点还是 CN1 登录),我们可以 ping vm2 并运行 ‘tcpdump | grep -i “X”’ 在 CN1 或 CN2 上,而 “X” 是您的网络类型,我们将发现 ICMP 数据包路径直接从 CN1 到 CN2,而无需通过网络节点(在 1+N 案例中,当 DVR 禁用时,ICMP 数据包需要通过集中式网络节点传输)。

文档影响

  • 用户可以将 [‘openstack’][‘network’][‘router_distributed’] 设置为 ‘auto’,让 chef cookbook 自动为 DVR 配置,启用 DVR 或提供警告消息。

  • 当网络类型为 GRE 或 VXLAN 时,DVR 将默认启用,用户可以将 [‘openstack’][‘network’][‘router_distributed]’ 设置为 ‘false’ 在 override_attributes 中禁用它。

  • 当将 [‘openstack’][‘network’][‘router_distributed’] 设置为 ‘true’ 时,用户应检查以下属性以启用 DVR:检查 [‘openstack’][‘network’] [‘core_plugin’] 是否具有值 ‘neutron.plugins.ml2.plugin.ML2Plugin’,检查 [‘openstack’][‘network’][‘ml2’][‘mechanism_drivers’] 是否具有值 ‘openvswitch’,并检查 [‘openstack’][‘compute’][‘network’][‘plugins’] 是否具有值 ‘openvswitch’。