Open vSwitch: 提供网络

此架构示例使用 VLAN (802.1q) 标记在实例和物理网络基础设施之间提供第二层连接。它支持一个未标记(flat)网络和最多 4095 个标记(VLAN)网络。实际 VLAN 网络的数量取决于物理网络基础设施。有关提供网络的更多信息,请参阅 提供网络

警告

Linux 发行版通常会打包较旧版本的 Open vSwitch,这可能在使用 Networking 服务时引入问题。我们建议使用 Open vSwitch 的最新长期稳定 (LTS) 版本,以获得最佳体验和 Open vSwitch 的支持。请参阅 http://www.openvswitch.org 获取可用版本,以及 安装说明 以获取更多详细信息。

先决条件

一个控制器节点,包含以下组件

  • 两个网络接口:管理和提供网络。

  • OpenStack Networking server 服务和 ML2 插件。

两个计算节点,包含以下组件

  • 两个网络接口:管理和提供网络。

  • OpenStack Networking Open vSwitch (OVS) 第二层代理、DHCP 代理、元数据代理以及包括 OVS 在内的所有依赖项。

注意

较大的部署通常会将 DHCP 和元数据代理部署到计算节点的子集,以提高性能和冗余。但是,过多的代理可能会使消息总线不堪重负。此外,为了进一步简化任何部署,您可以省略元数据代理,并使用配置驱动器向实例提供元数据。

架构

Provider networks using OVS - overview

下图显示了一个未标记(flat)网络的组件和连接。在这种情况下,实例位于与网络 DHCP 代理相同的计算节点上。如果 DHCP 代理位于另一个计算节点上,则后者仅包含一个 DHCP 命名空间,该命名空间在 OVS 集成桥上有一个端口。

Provider networks using OVS - components and connectivity - one network

下图描述了两个标记(VLAN)网络的组件之间的虚拟连接。本质上,所有网络都使用单个 OVS 集成桥,具有不同的内部 VLAN 标签。内部 VLAN 标签几乎总是与 Networking 服务中的网络 VLAN 分配不同。与未标记网络的情况类似,DHCP 代理可能位于不同的计算节点上。

Provider networks using OVS - components and connectivity - multiple networks

注意

这些图表省略了控制器节点,因为它不处理实例网络流量。

示例配置

使用以下示例配置作为模板,在您的环境中部署提供网络。

控制器节点

  1. 安装提供 neutron-server 服务和 ML2 插件的 Networking 服务组件。

  2. neutron.conf 文件中

    • 配置通用选项

      [DEFAULT]
      core_plugin = ml2
      auth_strategy = keystone
      
      [database]
      # ...
      
      [keystone_authtoken]
      # ...
      
      [nova]
      # ...
      
      [agent]
      # ...
      

      请参阅您的 OpenStack 版本的 安装教程和指南配置参考,以获取 [DEFAULT][database][keystone_authtoken][nova][agent] 部分的适当附加配置。

    • 禁用服务插件,因为提供网络不需要任何插件。但是,这会破坏管理 Networking 服务的仪表板的部分功能。有关更多信息,请参阅最新的 安装教程和指南

      [DEFAULT]
      service_plugins =
      
    • 启用每个网络的两个 DHCP 代理,以便两个计算节点都可以提供 DHCP 服务提供网络。

      [DEFAULT]
      dhcp_agents_per_network = 2
      
    • 如果需要,配置 MTU

  3. ml2_conf.ini 文件中

    • 配置驱动程序和网络类型

      [ml2]
      type_drivers = flat,vlan
      tenant_network_types =
      mechanism_drivers = openvswitch
      extension_drivers = port_security
      
    • 配置网络映射

      [ml2_type_flat]
      flat_networks = provider
      
      [ml2_type_vlan]
      network_vlan_ranges = provider
      

      注意

      由于该架构不支持自助服务网络,因此 tenant_network_types 选项不包含任何值。

      注意

      为了支持使用任意 VLAN ID,network_vlan_ranges 选项中的 provider 值缺少 VLAN ID 范围。

  4. 填充数据库。

    # su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
      --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
    
  5. 启动以下服务

    • 服务器

计算节点

  1. 安装 Networking 服务 OVS 第二层代理、DHCP 代理和元数据代理。

  2. 安装 OVS。

  3. neutron.conf 文件中,配置常用选项

    [DEFAULT]
    core_plugin = ml2
    auth_strategy = keystone
    
    [database]
    # ...
    
    [keystone_authtoken]
    # ...
    
    [nova]
    # ...
    
    [agent]
    # ...
    

    请参阅您的 OpenStack 版本的 安装教程和指南配置参考,以获取 [DEFAULT][database][keystone_authtoken][nova][agent] 部分的适当附加配置。

  4. openvswitch_agent.ini 文件中,配置 OVS 代理

    [ovs]
    bridge_mappings = provider:br-provider
    
    [securitygroup]
    firewall_driver = iptables_hybrid
    
  5. dhcp_agent.ini 文件中,配置 DHCP 代理

    [DEFAULT]
    enable_isolated_metadata = True
    force_metadata = True
    

    注意

    无论子网是否包含路由器上的接口,force_metadata 选项都会强制 DHCP 代理提供指向元数据服务的宿主路由,地址为 169.254.169.254,从而在子网之间保持类似且可预测的元数据行为。

  6. metadata_agent.ini 文件中,配置元数据代理

    [DEFAULT]
    nova_metadata_host = controller
    metadata_proxy_shared_secret = METADATA_SECRET
    

    METADATA_SECRET 的值必须与 [neutron] 部分的 nova.conf 文件中相同选项的值匹配。

  7. 启动以下服务

    • OVS

  8. 创建 OVS 提供商网桥 br-provider

    $ ovs-vsctl add-br br-provider
    
  9. 将提供商网络接口作为端口添加到 OVS 提供商网桥 br-provider

    $ ovs-vsctl add-port br-provider PROVIDER_INTERFACE
    

    PROVIDER_INTERFACE 替换为处理提供商网络的底层接口的名称。例如,eth1

  10. 启动以下服务

    • OVS 代理

    • DHCP 代理

    • Metadata agent

验证服务操作

  1. 获取管理项目凭据。

  2. 验证代理的存在和运行

    $ openstack network agent list
    +--------------------------------------+--------------------+----------+-------------------+-------+-------+---------------------------+
    | ID                                   | Agent Type         | Host     | Availability Zone | Alive | State | Binary                    |
    +--------------------------------------+--------------------+----------+-------------------+-------+-------+---------------------------+
    | 1236bbcb-e0ba-48a9-80fc-81202ca4fa51 | Metadata agent     | compute2 | None              | True  | UP    | neutron-metadata-agent    |
    | 457d6898-b373-4bb3-b41f-59345dcfb5c5 | Open vSwitch agent | compute2 | None              | True  | UP    | neutron-openvswitch-agent |
    | 71f15e84-bc47-4c2a-b9fb-317840b2d753 | DHCP agent         | compute2 | nova              | True  | UP    | neutron-dhcp-agent        |
    | a6c69690-e7f7-4e56-9831-1282753e5007 | Metadata agent     | compute1 | None              | True  | UP    | neutron-metadata-agent    |
    | af11f22f-a9f4-404f-9fd8-cd7ad55c0f68 | DHCP agent         | compute1 | nova              | True  | UP    | neutron-dhcp-agent        |
    | bcfc977b-ec0e-4ba9-be62-9489b4b0e6f1 | Open vSwitch agent | compute1 | None              | True  | UP    | neutron-openvswitch-agent |
    +--------------------------------------+--------------------+----------+-------------------+-------+-------+---------------------------+
    

创建初始网络

该配置支持一个 flat 或多个 VLAN 提供网络。为了简单起见,以下过程创建一个 flat 提供网络。

  1. 获取管理项目凭据。

  2. 创建一个 flat 网络。

    $ openstack network create --share --provider-physical-network provider \
      --provider-network-type flat provider1
    +---------------------------+-----------+-
    | Field                     | Value     |
    +---------------------------+-----------+
    | admin_state_up            | UP        |
    | mtu                       | 1500      |
    | name                      | provider1 |
    | port_security_enabled     | True      |
    | provider:network_type     | flat      |
    | provider:physical_network | provider  |
    | provider:segmentation_id  | None      |
    | router:external           | Internal  |
    | shared                    | True      |
    | status                    | ACTIVE    |
    +---------------------------+-----------+
    

    注意

    share 选项允许任何项目使用此网络。要限制对提供网络的访问,请参阅 基于角色的访问控制 (RBAC)

    注意

    要创建 VLAN 网络而不是 flat 网络,请将 --provider-network-type flat 更改为 --provider-network-type vlan 并添加 --provider-segment,其值引用 VLAN ID。

  3. 在提供网络上创建一个 IPv4 子网。

    $ openstack subnet create --subnet-range 203.0.113.0/24 --gateway 203.0.113.1 \
      --network provider1 --allocation-pool start=203.0.113.11,end=203.0.113.250 \
      --dns-nameserver 8.8.4.4 provider1-v4
    +-------------------+----------------------------+
    | Field             | Value                      |
    +-------------------+----------------------------+
    | allocation_pools  | 203.0.113.11-203.0.113.250 |
    | cidr              | 203.0.113.0/24             |
    | dns_nameservers   | 8.8.4.4                    |
    | enable_dhcp       | True                       |
    | gateway_ip        | 203.0.113.1                |
    | ip_version        | 4                          |
    | name              | provider1-v4               |
    +-------------------+----------------------------+
    

    重要提示

    启用 DHCP 会导致 Networking 服务提供 DHCP,这可能会干扰物理网络基础设施上的现有 DHCP 服务。使用 --no-dhcp 选项让现有 DHCP 服务管理子网。

  4. 在提供网络上创建一个 IPv6 子网。

    $ openstack subnet create --subnet-range fd00:203:0:113::/64 --gateway fd00:203:0:113::1 \
      --ip-version 6 --ipv6-address-mode slaac --network provider1 \
      --dns-nameserver 2001:4860:4860::8844 provider1-v6
    +-------------------+------------------------------------------------------+
    | Field             | Value                                                |
    +-------------------+------------------------------------------------------+
    | allocation_pools  | fd00:203:0:113::2-fd00:203:0:113:ffff:ffff:ffff:ffff |
    | cidr              | fd00:203:0:113::/64                                  |
    | dns_nameservers   | 2001:4860:4860::8844                                 |
    | enable_dhcp       | True                                                 |
    | gateway_ip        | fd00:203:0:113::1                                    |
    | ip_version        | 6                                                    |
    | ipv6_address_mode | slaac                                                |
    | ipv6_ra_mode      | None                                                 |
    | name              | provider1-v6                                         |
    +-------------------+------------------------------------------------------+
    

    注意

    Networking 服务使用第三层代理来提供路由器通告。提供网络依赖于物理网络基础设施来提供第三层服务,而不是第三层代理。因此,物理网络基础设施必须在提供网络上提供路由器通告,以确保 IPv6 的正常运行。

验证网络操作

  1. 在每个计算节点上,验证 qdhcp 命名空间的创建。

    # ip netns
    qdhcp-8b868082-e312-4110-8627-298109d4401c
    
  2. 获取常规(非管理)项目凭据。

  3. 创建适当的安全组规则,以允许 ping 和 SSH 访问使用该网络的实例。

    $ openstack security group rule create --proto icmp default
    +------------------+-----------+
    | Field            | Value     |
    +------------------+-----------+
    | direction        | ingress   |
    | ethertype        | IPv4      |
    | protocol         | icmp      |
    | remote_ip_prefix | 0.0.0.0/0 |
    +------------------+-----------+
    
    $ openstack security group rule create --ethertype IPv6 \
      --proto ipv6-icmp default
    +-----------+-----------+
    | Field     | Value     |
    +-----------+-----------+
    | direction | ingress   |
    | ethertype | IPv6      |
    | protocol  | ipv6-icmp |
    +-----------+-----------+
    
    $ openstack security group rule create --proto tcp --dst-port 22 default
    +------------------+-----------+
    | Field            | Value     |
    +------------------+-----------+
    | direction        | ingress   |
    | ethertype        | IPv4      |
    | port_range_max   | 22        |
    | port_range_min   | 22        |
    | protocol         | tcp       |
    | remote_ip_prefix | 0.0.0.0/0 |
    +------------------+-----------+
    
    $ openstack security group rule create --ethertype IPv6 --proto tcp \
      --dst-port 22 default
    +----------------+---------+
    | Field          | Value   |
    +----------------+---------+
    | direction      | ingress |
    | ethertype      | IPv6    |
    | port_range_max | 22      |
    | port_range_min | 22      |
    | protocol       | tcp     |
    +----------------+---------+
    
  4. 使用 flavor ID 1 启动一个具有提供网络接口的实例。例如,一个 CirrOS 镜像。

    $ openstack server create --flavor 1 --image cirros \
      --nic net-id=NETWORK_ID provider-instance1
    

    NETWORK_ID 替换为提供网络的 ID。

  5. 确定实例的 IPv4 和 IPv6 地址。

    $ openstack server list
    +--------------------------------------+--------------------+--------+------------------------------------------------------------+--------+---------+
    | ID                                   | Name               | Status | Networks                                                   | Image  | Flavor  |
    +--------------------------------------+--------------------+--------+------------------------------------------------------------+--------+---------+
    | 018e0ae2-b43c-4271-a78d-62653dd03285 | provider-instance1 | ACTIVE | provider1=203.0.113.13, fd00:203:0:113:f816:3eff:fe58:be4e | cirros | m1.tiny |
    +--------------------------------------+--------------------+--------+------------------------------------------------------------+--------+---------+
    
  6. 在控制器节点或任何可以访问提供网络的宿主机上,ping 实例的 IPv4 和 IPv6 地址。

    $ ping -c 4 203.0.113.13
    PING 203.0.113.13 (203.0.113.13) 56(84) bytes of data.
    64 bytes from 203.0.113.13: icmp_req=1 ttl=63 time=3.18 ms
    64 bytes from 203.0.113.13: icmp_req=2 ttl=63 time=0.981 ms
    64 bytes from 203.0.113.13: icmp_req=3 ttl=63 time=1.06 ms
    64 bytes from 203.0.113.13: icmp_req=4 ttl=63 time=0.929 ms
    
    --- 203.0.113.13 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3002ms
    rtt min/avg/max/mdev = 0.929/1.539/3.183/0.951 ms
    
    $ ping6 -c 4 fd00:203:0:113:f816:3eff:fe58:be4e
    PING fd00:203:0:113:f816:3eff:fe58:be4e(fd00:203:0:113:f816:3eff:fe58:be4e) 56 data bytes
    64 bytes from fd00:203:0:113:f816:3eff:fe58:be4e icmp_seq=1 ttl=64 time=1.25 ms
    64 bytes from fd00:203:0:113:f816:3eff:fe58:be4e icmp_seq=2 ttl=64 time=0.683 ms
    64 bytes from fd00:203:0:113:f816:3eff:fe58:be4e icmp_seq=3 ttl=64 time=0.762 ms
    64 bytes from fd00:203:0:113:f816:3eff:fe58:be4e icmp_seq=4 ttl=64 time=0.486 ms
    
    --- fd00:203:0:113:f816:3eff:fe58:be4e ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2999ms
    rtt min/avg/max/mdev = 0.486/0.796/1.253/0.282 ms
    
  7. 访问实例。

  8. 测试到 Internet 或其他外部网络的 IPv4 和 IPv6 连接。

网络流量流

以下部分描述了几个常见场景中网络流量的流程。南北流量网络流量在实例与外部网络(如 Internet)之间传输。东西流量网络流量在相同或不同网络的实例之间传输。在所有场景中,物理网络基础设施处理提供商网络和外部网络(如 Internet)之间的交换和路由。每个案例都引用以下一个或多个组件

  • 提供网络 1 (VLAN)

    • VLAN ID 101(已标记)

    • IP 地址范围 203.0.113.0/24 和 fd00:203:0:113::/64

    • 网关(通过物理网络基础设施)

      • IP 地址 203.0.113.1 和 fd00:203:0:113:0::1

  • 提供网络 2 (VLAN)

    • VLAN ID 102(标记)

    • IP 地址范围 192.0.2.0/24 和 fd00:192:0:2::/64

    • 网关

      • IP 地址 192.0.2.1 和 fd00:192:0:2::1

  • 实例 1

    • IP 地址 203.0.113.101 和 fd00:203:0:113:0::101

  • 实例 2

    • IP 地址 192.0.2.101 和 fd00:192:0:2:0::101

南北向

  • 实例位于计算节点 1 上,并使用提供网络 1。

  • 实例向 Internet 上的宿主机发送数据包。

以下步骤涉及计算节点 1。

  1. 实例接口 (1) 通过 veth 对将数据包转发到安全组桥实例端口 (2)。

  2. 安全组桥上的安全组规则 (3) 处理数据包的防火墙和连接跟踪。

  3. 安全组桥 OVS 端口 (4) 通过 veth 对将数据包转发到 OVS 集成桥安全组端口 (5)。

  4. OVS 集成桥向数据包添加内部 VLAN 标记。

  5. OVS 集成桥 int-br-provider 补丁端口 (6) 将数据包转发到 OVS 提供桥 phy-br-provider 补丁端口 (7)。

  6. OVS 提供桥将内部 VLAN 标签与实际 VLAN 标签 101 交换。

  7. OVS 提供桥提供网络端口 (8) 将数据包转发到物理网络接口 (9)。

  8. 物理网络接口将数据包转发到物理网络基础设施交换机 (10)。

以下步骤涉及物理网络基础设施

  1. 交换机从数据包中删除 VLAN 标签 101,并将其转发到路由器 (11)。

  2. 路由器将数据包从提供网络 (12) 路由到外部网络 (13),并将数据包转发到交换机 (14)。

  3. 交换机将数据包转发到外部网络 (15)。

  4. 外部网络 (16) 接收数据包。

Provider networks using Open vSwitch - network traffic flow - north/south

注意

返回流量以相反的顺序执行类似步骤。

东西向场景 1:同一网络上的实例

同一网络上的实例直接在包含这些实例的计算节点之间进行通信。

  • 实例 1 位于计算节点 1 上,并使用提供网络 1。

  • 实例 2 位于计算节点 2 上,并使用提供网络 1。

  • 实例 1 向实例 2 发送数据包。

以下步骤涉及计算节点 1

  1. 实例 1 接口 (1) 通过 veth 对将数据包转发到安全组桥实例端口 (2)。

  2. 安全组桥上的安全组规则 (3) 处理数据包的防火墙和连接跟踪。

  3. 安全组桥 OVS 端口 (4) 通过 veth 对将数据包转发到 OVS 集成桥安全组端口 (5)。

  4. OVS 集成桥向数据包添加内部 VLAN 标记。

  5. OVS 集成桥 int-br-provider 补丁端口 (6) 将数据包转发到 OVS 提供桥 phy-br-provider 补丁端口 (7)。

  6. OVS 提供桥将内部 VLAN 标签与实际 VLAN 标签 101 交换。

  7. OVS 提供桥提供网络端口 (8) 将数据包转发到物理网络接口 (9)。

  8. 物理网络接口将数据包转发到物理网络基础设施交换机 (10)。

以下步骤涉及物理网络基础设施

  1. 交换机将数据包从计算节点 1 转发到计算节点 2 (11)。

以下步骤涉及计算节点 2

  1. 物理网络接口 (12) 将数据包转发到 OVS 提供桥提供网络端口 (13)。

  2. OVS 提供桥 phy-br-provider 补丁端口 (14) 将数据包转发到 OVS 集成桥 int-br-provider 补丁端口 (15)。

  3. OVS 集成桥将实际 VLAN 标签 101 与内部 VLAN 标签交换。

  4. OVS 集成桥安全组端口 (16) 将数据包转发到安全组桥 OVS 端口 (17)。

  5. 安全组桥上的安全组规则 (18) 处理数据包的防火墙和连接跟踪。

  6. 安全组桥实例端口 (19) 通过 veth 对将数据包转发到实例 2 接口 (20)。

Provider networks using Open vSwitch - network traffic flow - east/west scenario 1

注意

返回流量以相反的顺序执行类似步骤。

东西向场景 2:不同网络上的实例

实例通过物理网络基础设施上的路由器进行通信。

  • 实例 1 位于计算节点 1 上,并使用提供网络 1。

  • 实例 2 位于计算节点 1 上,并使用提供网络 2。

  • 实例 1 向实例 2 发送数据包。

注意

两个实例都位于同一个计算节点上,以说明 VLAN 标记如何使相同的物理第二层网络可以使用多个逻辑第二层网络。

以下步骤涉及计算节点

  1. 实例 1 接口 (1) 通过 veth 对将数据包转发到安全组桥实例端口 (2)。

  2. 安全组桥上的安全组规则 (3) 处理数据包的防火墙和连接跟踪。

  3. 安全组桥 OVS 端口 (4) 通过 veth 对将数据包转发到 OVS 集成桥安全组端口 (5)。

  4. OVS 集成桥向数据包添加内部 VLAN 标记。

  5. OVS 集成桥 int-br-provider 补丁端口 (6) 将数据包转发到 OVS 提供桥 phy-br-provider 补丁端口 (7)。

  6. OVS 提供桥将内部 VLAN 标签与实际 VLAN 标签 101 交换。

  7. OVS 提供桥提供网络端口 (8) 将数据包转发到物理网络接口 (9)。

  8. 物理网络接口将数据包转发到物理网络基础设施交换机 (10)。

以下步骤涉及物理网络基础设施

  1. 交换机从数据包中删除 VLAN 标签 101,并将其转发到路由器 (11)。

  2. 路由器将数据包从提供网络 1 (12) 路由到提供网络 2 (13)。

  3. 路由器将数据包转发到交换机 (14)。

  4. 交换机将 VLAN 标签 102 添加到数据包,并将其转发到计算节点 1 (15)。

以下步骤涉及计算节点

  1. 物理网络接口 (16) 将数据包转发到 OVS 提供桥提供网络端口 (17)。

  2. OVS 提供桥 phy-br-provider 补丁端口 (18) 将数据包转发到 OVS 集成桥 int-br-provider 补丁端口 (19)。

  3. OVS 集成桥将实际 VLAN 标签 102 与内部 VLAN 标签交换。

  4. OVS 集成桥安全组端口 (20) 删除内部 VLAN 标签,并将数据包转发到安全组桥 OVS 端口 (21)。

  5. 安全组桥上的安全组规则 (22) 处理数据包的防火墙和连接跟踪。

  6. 安全组桥实例端口 (23) 通过 veth 对将数据包转发到实例 2 接口 (24)。

Provider networks using Open vSwitch - network traffic flow - east/west scenario 2

注意

返回流量以相反的顺序执行类似步骤。