使用 DevStack 与 neutron 网络

本指南将引导您使用 OpenStack neutron 与 ML2 插件和 Open vSwitch 机制驱动程序。

使用单个接口的 Neutron

在某些情况下,例如在开发人员的笔记本电脑上,只有一个网络接口可用。在这种情况下,物理接口被添加到 Open vSwitch 桥接器,并且笔记本电脑的 IP 地址被迁移到桥接器接口上。 这样,物理接口就可以用于传输自助服务项目网络流量、OpenStack API 流量和管理流量。

警告

在使用单个接口网络设置时,您的 IP 地址从机器的物理网卡移动到 OVS 桥接器,将会出现短暂的网络中断。 如果您从另一台计算机通过 SSH 连接到该机器,则有断开 SSH 会话的风险(由于 arp 缓存失效),这会停止 stack.sh 或使其处于未完成状态。 在这些情况下,请在自己的 screen 会话中启动 stack.sh,以便它可以继续运行。

物理网络设置

在大多数使用单个接口部署 DevStack 的情况下,都使用硬件路由器进行外部连接和 DHCP。 开发人员机器连接到此网络,并与其它机器位于共享子网中。 此处的 local.conf 假定 1500 是该网络上使用的合理 MTU。

Network configuration for a single DevStack node

DevStack 配置

以下是主机 devstack-1 的完整 local.conf。 它将运行所有 API 和服务,并充当虚拟机监控程序来运行客户实例。

[[local|localrc]]
HOST_IP=172.18.161.6
SERVICE_HOST=172.18.161.6
MYSQL_HOST=172.18.161.6
RABBIT_HOST=172.18.161.6
GLANCE_HOSTPORT=172.18.161.6:9292
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret

## Neutron options
Q_USE_SECGROUP=True
FLOATING_RANGE="172.18.161.0/24"
IPV4_ADDRS_SAFE_TO_USE="10.0.0.0/22"
Q_FLOATING_ALLOCATION_POOL=start=172.18.161.250,end=172.18.161.254
PUBLIC_NETWORK_GATEWAY="172.18.161.1"
PUBLIC_INTERFACE=eth0

# Open vSwitch provider networking configuration
Q_USE_PROVIDERNET_FOR_PUBLIC=True
OVS_PHYSICAL_BRIDGE=br-ex
PUBLIC_BRIDGE=br-ex
OVS_BRIDGE_MAPPINGS=public:br-ex

添加其它计算节点

假设在第一个主机上安装 DevStack 后,您还想进行多节点测试和网络配置。

物理网络设置

Network configuration for multiple DevStack nodes

在 DevStack 安装和配置 Neutron 后,来自客户 VM 的流量将从 devstack-2(计算节点)流出,并通过 VXLAN 隧道封装回 devstack-1(控制节点),L3 代理正在运行。

stack@devstack-2:~/devstack$ sudo ovs-vsctl show
8992d965-0ba0-42fd-90e9-20ecc528bc29
    Bridge br-int
        fail_mode: secure
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
    Bridge br-tun
        fail_mode: secure
        Port "vxlan-c0a801f6"
            Interface "vxlan-c0a801f6"
                type: vxlan
                options: {df_default="true", in_key=flow, local_ip="172.18.161.7", out_key=flow, remote_ip="172.18.161.6"}
        Port patch-int
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
        Port br-tun
            Interface br-tun
                type: internal
    ovs_version: "2.0.2"

控制节点上的 Open vSwitch,L3 代理运行在上面,配置为解封装来自计算节点的流量,然后通过 br-ex 桥接器转发它,eth0 连接到该桥接器。

stack@devstack-1:~/devstack$ sudo ovs-vsctl show
422adeea-48d1-4a1f-98b1-8e7239077964
    Bridge br-tun
        fail_mode: secure
        Port br-tun
            Interface br-tun
                type: internal
        Port patch-int
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
        Port "vxlan-c0a801d8"
            Interface "vxlan-c0a801d8"
                type: vxlan
                options: {df_default="true", in_key=flow, local_ip="172.18.161.6", out_key=flow, remote_ip="172.18.161.7"}
    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port "eth0"
            Interface "eth0"
        Port br-ex
            Interface br-ex
                type: internal
    Bridge br-int
        fail_mode: secure
        Port "tapce66332d-ea"
            tag: 1
            Interface "tapce66332d-ea"
                type: internal
        Port "qg-65e5a4b9-15"
            tag: 2
            Interface "qg-65e5a4b9-15"
                type: internal
        Port "qr-33e5e471-88"
            tag: 1
            Interface "qr-33e5e471-88"
                type: internal
        Port "qr-acbe9951-70"
            tag: 1
            Interface "qr-acbe9951-70"
                type: internal
        Port br-int
            Interface br-int
                type: internal
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
        Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}
    ovs_version: "2.0.2"

br-int 是 Open vSwitch 机制驱动程序创建的桥接器,用作“集成桥接器”,在其中创建端口并插入到虚拟交换结构中。 br-ex 是一个 OVS 桥接器,用于连接物理端口(如 eth0),以便可以从物理网络基础设施(和互联网)接收项目网络的浮动 IP 流量,并将其路由到自助服务项目网络端口。 br-tun 是一个隧道桥接器,用于连接 OpenStack 节点(如 devstack-2)。 此桥接器用于使使用 VXLAN 隧道协议的项目网络流量在运行项目实例的每个计算节点之间流动。

DevStack 计算节点配置

主机 devstack-2 具有非常精简的 local.conf

[[local|localrc]]
HOST_IP=172.18.161.7
SERVICE_HOST=172.18.161.6
MYSQL_HOST=172.18.161.6
RABBIT_HOST=172.18.161.6
GLANCE_HOSTPORT=172.18.161.6:9292
ADMIN_PASSWORD=secret
MYSQL_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret

## Neutron options
PUBLIC_INTERFACE=eth0
ENABLED_SERVICES=n-cpu,rabbit,q-agt,placement-client

来自计算节点上 eth0 的网络流量然后由运行 Neutron 的 neutron-l3-agent 的控制器节点进行 NAT 处理,并提供 L3 连接。

使用 Open vSwitch 和提供网络的 Neutron 网络

在某些情况下,希望使用 neutron 的提供网络扩展,以便可以在外部路由器上配置的网络可以被 neutron 利用,并且通过 Nova 创建的实例可以连接到外部路由器管理的网络。

例如,在某些实验室环境中,硬件路由器已由另一方预先配置,并且 OpenStack 开发人员获得了 VLAN 标签和 IP 地址范围,以便通过 DevStack 创建的实例将使用外部路由器进行 L3 连接,而不是 neutron L3 服务。

物理网络设置

Network configuration for provider networks

在计算节点上,第一个接口 eth0 用于 OpenStack 管理(API、消息总线等),以及管理员访问机器的 ssh。

stack@compute:~$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr bc:16:65:20:af:fc
          inet addr:10.0.0.3

eth1 在启动时手动配置为没有 IP 地址。 请查阅您的操作系统文档以获取适当的技术。 对于 Ubuntu,/etc/network/interfaces 的内容包含

auto eth1
iface eth1 inet manual
        up ifconfig $IFACE 0.0.0.0 up
        down ifconfig $IFACE 0.0.0.0 down

第二个物理接口 eth1 被添加到桥接器(在本例中命名为 br-ex),用于转发来自客户 VM 的网络流量。

stack@compute:~$ sudo ovs-vsctl add-br br-ex
stack@compute:~$ sudo ovs-vsctl add-port br-ex eth1
stack@compute:~$ sudo ovs-vsctl show
9a25c837-32ab-45f6-b9f2-1dd888abcf0f
    Bridge br-ex
        Port br-ex
            Interface br-ex
                type: internal
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port "eth1"
            Interface "eth1"

服务配置

控制节点

在本例中,控制节点将运行大多数 OpenStack API 和管理服务(keystone、glance、nova、neutron)

计算节点

在本例中,将托管客户实例的节点将运行 neutron-openvswitch-agent 以进行网络连接,以及计算服务 nova-compute

DevStack 配置

以下是控制器节点上 DevStack 配置的片段。

HOST_IP=10.0.0.2
SERVICE_HOST=10.0.0.2
MYSQL_HOST=10.0.0.2
RABBIT_HOST=10.0.0.2
GLANCE_HOSTPORT=10.0.0.2:9292
PUBLIC_INTERFACE=eth1

ADMIN_PASSWORD=secret
MYSQL_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret

## Neutron options
Q_USE_SECGROUP=True
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=3001:4000
PHYSICAL_NETWORK=default
OVS_PHYSICAL_BRIDGE=br-ex

Q_USE_PROVIDER_NETWORKING=True

disable_service q-l3

## Neutron Networking options used to create Neutron Subnets

IPV4_ADDRS_SAFE_TO_USE="203.0.113.0/24"
NETWORK_GATEWAY=203.0.113.1
PROVIDER_SUBNET_NAME="provider_net"
PROVIDER_NETWORK_TYPE="vlan"
SEGMENTATION_ID=2010
USE_SUBNETPOOL=False

在此配置中,我们将 IPV4_ADDRS_SAFE_TO_USE 定义为公开路由的 IPv4 子网。 在此特定实例中,我们使用 RFC 5737 中定义的特殊 TEST-NET-3 子网,该子网用于文档。 在您的 DevStack 设置中,IPV4_ADDRS_SAFE_TO_USE 将是您或您的组织分配给您的公共 IP 地址范围,以便您可以从公共互联网访问您的实例。

以下是计算节点 1 上的 DevStack 配置。

HOST_IP=10.0.0.3
SERVICE_HOST=10.0.0.2
MYSQL_HOST=10.0.0.2
RABBIT_HOST=10.0.0.2
GLANCE_HOSTPORT=10.0.0.2:9292
ADMIN_PASSWORD=secret
MYSQL_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret

# Services that a compute node runs
ENABLED_SERVICES=n-cpu,rabbit,q-agt

## Open vSwitch provider networking options
PHYSICAL_NETWORK=default
OVS_PHYSICAL_BRIDGE=br-ex
PUBLIC_INTERFACE=eth1
Q_USE_PROVIDER_NETWORKING=True

计算节点 2 的配置将完全相同,除了 HOST_IP 将是 10.0.0.4

当 DevStack 配置为使用提供网络(通过 Q_USE_PROVIDER_NETWORKING 为 True)时 - DevStack 将自动将 PUBLIC_INTERFACE 中定义的网络接口添加到 OVS_PHYSICAL_BRIDGE

例如,使用上述配置,将创建一个桥接器,命名为 br-ex,该桥接器由 Open vSwitch 管理,计算节点上的第二个接口 eth1 连接到该桥接器,以转发客户 VM 发送的流量。

其它提示

物理网络上的非标准 MTU

Neutron 默认使用 1500 字节的 MTU,这是以太网的标准 MTU。

可以通过将以下内容添加到 local.conf 的 Neutron 部分来指定不同的 MTU。 例如,如果您拥有支持巨型帧的网络设备,则可以将 MTU 设置为 9000 字节,方法是添加以下内容

[[post-config|/$Q_PLUGIN_CONF_FILE]]
global_physnet_mtu = 9000

禁用下一代防火墙工具

DevStack 不能与现代防火墙工具正常运行。 具体来说,它似乎客户 VM 可以通过 ICMP 访问外部网络,但 UDP 和 TCP 数据包不会传递到客户 VM。 该问题的根本原因在于 ufw(Uncomplicated Firewall)和 firewalld(Fedora 的防火墙管理器)将防火墙规则应用于系统中的所有接口,而不是每个设备。 解决此问题的一种方法是恢复到 iptables 功能。

要为 Fedora 获取功能防火墙配置,请执行以下操作

sudo service iptables save
sudo systemctl disable firewalld
sudo systemctl enable iptables
sudo systemctl stop firewalld
sudo systemctl start iptables

要为包含 ufw 的发行版获取功能防火墙配置,请禁用 ufw。 请注意,ufw 通常不在 Ubuntu 中默认启用。 要禁用已启用的 ufw,请执行以下操作

sudo service iptables save
sudo ufw disable

配置 ML2 插件的扩展驱动程序

ML2 插件的扩展驱动程序使用变量 Q_ML2_PLUGIN_EXT_DRIVERS 设置,默认情况下包括“port_security”扩展。 如果要删除所有扩展驱动程序(甚至“port_security”),请将 Q_ML2_PLUGIN_EXT_DRIVERS 设置为空。

使用 MacVTap 代替 Open vSwitch

安全组不受 MacVTap 代理的支持。 因此,devstack 在计算节点上配置 NoopFirewall 驱动程序。

MacVTap 代理不支持 l3、dhcp 和元数据代理。 因此,您可以选择以下部署方案

使用 config drive 和外部 l3、dhcp 的单节点提供网络

如果 l3 和 dhcp 服务由外部提供,或者您不需要它们,则适用此方案。

[[local|localrc]]
HOST_IP=10.0.0.2
SERVICE_HOST=10.0.0.2
MYSQL_HOST=10.0.0.2
RABBIT_HOST=10.0.0.2
ADMIN_PASSWORD=secret
MYSQL_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret

Q_ML2_PLUGIN_MECHANISM_DRIVERS=macvtap
Q_USE_PROVIDER_NETWORKING=True

enable_plugin neutron https://opendev.org/openstack/neutron

## MacVTap agent options
Q_AGENT=macvtap
PHYSICAL_NETWORK=default

IPV4_ADDRS_SAFE_TO_USE="203.0.113.0/24"
NETWORK_GATEWAY=203.0.113.1
PROVIDER_SUBNET_NAME="provider_net"
PROVIDER_NETWORK_TYPE="vlan"
SEGMENTATION_ID=2010
USE_SUBNETPOOL=False

[[post-config|/$Q_PLUGIN_CONF_FILE]]
[macvtap]
physical_interface_mappings = $PHYSICAL_NETWORK:eth1

[[post-config|$NOVA_CONF]]
force_config_drive = True

具有 MacVTap 计算节点的多节点

如果需要 OpenStack 提供的 l3、dhcp 或元数据服务,则适用此方案。 这些托管在单独的控制器和网络节点上,运行其它 l2 代理技术(在本例中为 Open vSwitch)。 需要为 VLAN 租户网络配置此节点。

对于 OVS,可以使用类似于 OVS 提供网络 部分中描述的配置。 只需将以下行添加到 local.conf,它还将加载 MacVTap 机制驱动程序

[[local|localrc]]
...
Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch,macvtap
...

对于 MacVTap 计算节点,使用此 local.conf

HOST_IP=10.0.0.3
SERVICE_HOST=10.0.0.2
MYSQL_HOST=10.0.0.2
RABBIT_HOST=10.0.0.2
ADMIN_PASSWORD=secret
MYSQL_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret

# Services that a compute node runs
disable_all_services
enable_plugin neutron https://opendev.org/openstack/neutron
ENABLED_SERVICES+=n-cpu,q-agt

## MacVTap agent options
Q_AGENT=macvtap
PHYSICAL_NETWORK=default

[[post-config|/$Q_PLUGIN_CONF_FILE]]
[macvtap]
physical_interface_mappings = $PHYSICAL_NETWORK:eth1