Neutron - 网络服务

准备和部署

Neutron 默认在 /etc/kolla/globals.yml 中启用

#enable_neutron: "{{ enable_openstack_core | bool }}"

网络接口

Neutron 外部接口用于与外部世界通信,例如提供商网络、路由器和浮动 IP。要设置 Neutron 外部接口,请修改 /etc/kolla/globals.yml 设置 neutron_external_interface 为所需的接口名称或逗号分隔的接口名称列表。其默认值为 eth1。这些外部接口由 network 组中的主机使用。如果设置了 enable_neutron_provider_networks 或启用了 DVR,它们也由 compute 组中的主机使用。

外部接口分别连接到由 neutron_bridge_name 定义的桥接器(Open vSwitch 或 Linux Bridge,具体取决于驱动程序),默认值为 br-ex。当有多个外部接口时,neutron_bridge_name 应该是一个相同长度的逗号分隔列表。

默认 Neutron 物理网络是 physnet1,或者当有多个外部网络接口时,是 physnet1physnetN。可以通过将 neutron_physical_networks 设置为相同长度的逗号分隔列表来更改此设置。

示例:单个接口

在只有单个 Neutron 外部接口的情况下,配置很简单

neutron_external_interface: "eth1"

示例:多个接口

在某些情况下,可能需要多个外部网络接口。这可以通过逗号分隔的列表来实现

neutron_external_interface: "eth1,eth2"
neutron_bridge_name: "br-ex1,br-ex2"

这两个列表是“zip”在一起的,这样 eth1 连接到 br-ex1 桥接器,而 eth2 连接到 br-ex2 桥接器。Kolla Ansible 将这些接口映射到 Neutron 物理网络 physnet1physnet2 分别。

示例:自定义物理网络

有时我们可能希望自定义使用的物理网络名称。这可能是为了允许并非所有主机都可以访问所有物理网络,或者使用更具描述性的名称。

例如,在具有用于 Ironic 配置的单独物理网络的环境中,控制器可能可以访问两个物理网络

neutron_external_interface: "eth1,eth2"
neutron_bridge_name: "br-ex1,br-ex2"
neutron_physical_networks: "physnet1,physnet2"

而计算节点只能访问 physnet2

neutron_external_interface: "eth1"
neutron_bridge_name: "br-ex1"
neutron_physical_networks: "physnet2"

示例:共享接口

有时用于 Neutron 外部网络的接口也可能用于其他流量。将接口直接连接到桥接器会阻止我们在接口上拥有可用的 IP 地址。解决此问题的一种方法是使用中间的 Linux 桥接器和虚拟以太网对,然后在 Linux 桥接器上分配 IP 地址。这种设置受 Kayobe 支持。由于以持久的方式设置起来很复杂,因此它超出了本文档的范围。

提供商网络

提供商网络允许将计算实例直接连接到物理网络,从而避免隧道。这对于某些性能关键型应用程序是必需的。只有 OpenStack 的管理员才能创建这些网络。

要在实例中使用提供商网络,还需要在 /etc/kolla/globals.yml 中设置以下内容

enable_neutron_provider_networks: yes

对于提供商网络,计算主机必须创建一个由 Ansible 配置和配置的外部桥接器(当 Neutron 分布式虚拟路由 (DVR) 模式启用时也需要这样做)。在这种情况下,请确保为 compute 组中的主机正确配置了 neutron_external_interface

内部 DNS 解析

网络服务允许用户使用与端口、网络和浮动 IP 关联的两个属性来控制分配给端口的名称。下表显示了这些资源中每个资源可用的属性

资源

dns_name

dns_domain

端口

网络

浮动 IP

要启用此功能,需要在 /etc/kolla/globals.yml 中设置以下内容

neutron_dns_integration: "yes"
neutron_dns_domain: "example.org."

重要提示

neutron_dns_domain 值必须不同于 openstacklocal(其默认值)并且必须以句点 . 结尾。

注意

网络服务与外部 DNSaaS(DNS-as-a-Service)的集成在 Designate - DNS 服务 中描述。

OpenvSwitch (ml2/ovs)

默认情况下,kolla-ansible 使用 openvswitch 作为其底层网络机制,您可以使用 neutron_plugin_agent 变量在 /etc/kolla/globals.yml 中更改它

neutron_plugin_agent: "openvswitch"

当在兼容的内核(4.3+ 上游,请参阅您的发行版的文档以了解支持详细信息)上使用 Open vSwitch 时,您可以通过使用配置覆盖(请参阅 Kolla 中的 OpenStack 服务配置)切换到使用本机 OVS 防火墙驱动程序。您可以在 /etc/kolla/config/neutron/openvswitch_agent.ini 中设置它

[securitygroup]
firewall_driver = openvswitch

L3 代理高可用性

可以使用以下命令以高可用性 (HA) 状态创建 L3 和 DHCP 代理

enable_neutron_agent_ha: "yes"

如果活动代理停止,这允许网络在控制器之间故障转移。如果启用此选项,也建议设置

neutron_l3_agent_failover_delay:

有时需要重新启动代理。在每个代理的重新启动操作之间调用此延迟(以秒为单位)。正确设置后,它将停止由所有代理同时重新启动引起的网络中断。确切的重新启动时间取决于硬件和存在的路由器数量。一个经验法则是将值设置为 40 + 3n,其中 n 是路由器的数量。例如,对于 5 个路由器,40 + (3 * 5) = 55,因此可以将该值设置为 55。但是,更好的方法是首先确定中断持续多长时间,然后相应地设置该值。

默认值为 0。非零起始值仅会在故障转移时间大于延迟时导致中断,这比一致的行为更难诊断。

OVN (ml2/ovn)

为了将 OVN 作为 neutron 的机制驱动程序使用,您需要设置以下内容

neutron_plugin_agent: "ovn"

使用 OVN - Kolla Ansible 默认不会启用分布式浮动 IP 功能(不会在计算节点上启用外部桥接器)。要更改此行为,您需要设置以下内容

neutron_ovn_distributed_fip: "yes"

默认情况下,通过将 ovn-controller 组中的总主机数除以 ovn_sb_db_relay_compute_per_relay(默认为 50)中的值并向上取整来计算中继组的数量 (ovn_sb_db_relay_count)。例如,如果您在 ovn-controller 组中有 120 个主机,您将得到 ceil(120 / 50) = 3 个中继组。您可以覆盖 ovn_sb_db_relay_compute_per_relay 以缩放每个中继处理的主机数量,例如

ovn_sb_db_relay_compute_per_relay: 25

您还可以通过 ovn_sb_db_relay_count 绕过自动计算并手动设置固定数量的中继组

ovn_sb_db_relay_count: 10

注意

如果显式设置 ovn_sb_db_relay_count,它将有效地覆盖基于 ovn_sb_db_relay_compute_per_relay 计算的计数。

也可以使用 Ansible host_var ovn_sb_db_relay_client_group_id 设置 ovn-controller 主机(网络节点或超visor)与特定 OVN 中继之间的静态映射。

同样 - 为了在 OVN 网络场景中部署 Neutron DHCP 代理,请使用

neutron_ovn_dhcp_agent: "yes"

这可能需要,例如,当使用 Ironic 裸机节点作为计算服务时。目前 OVN 无法回答端口类型外部的 DHCP 查询,Neutron 代理就在这里提供帮助。

为了部署 Neutron OVN 代理,您需要设置以下内容

neutron_enable_ovn_agent: "yes"

目前,该代理仅用于硬件卸载端口的 QoS。

在需要运行 ovn-nbctlovn-sbctl 命令时,从 ovn_northd 容器运行它们最方便

docker exec ovn_northd ovn-nbctl show

Mellanox Infiniband (ml2/mlnx)

为了将 mlnx_infiniband 添加到 neutron 的机制驱动程序列表中以支持 Infiniband 虚拟功能,您需要设置以下内容(假设也使用 enable_neutron_sriov 标志启用了 neutron SR-IOV 代理)

enable_neutron_mlnx: "yes"

此外,您还需要通过 neutron_mlnx_physnet_mappings 提供 physnet:interface 映射,该映射通过 mlnx_agent.inieswitchd.conf 将其呈现给 neutron_mlnx_agent 容器

neutron_mlnx_physnet_mappings:
  ibphysnet: "ib0"

外部系统中(交换机)的 SSH 身份验证

默认情况下,Kolla 会生成并复制 ssh 密钥到 neutron_server 容器(位于 /var/lib/neutron/.ssh/id_rsa),可用于在外部系统(例如在 networking-generic-switchnetworking-ansible 管理的交换机)中进行身份验证。

您可以在 passwords.yml 中设置 neutron_ssh_key 变量以控制使用的密钥。

Neutron 的自定义内核模块配置

Neutron 可能需要特定的内核模块才能实现某些功能。虽然 Ansible 角色中有预定义的默认模块,但用户可以根据需要添加自定义模块的灵活性。

要为 Neutron 添加自定义内核模块,请修改 /etc/kolla/globals.yml 中的配置

neutron_modules_extra:
  - name: 'nf_conntrack_tftp'
    params: 'hashsize=4096'

在本例中

  • neutron_modules_extra: 允许用户指定其他模块及其关联的参数。给定的配置调整了 nf_conntrack_tftp 模块的 hashsize 参数。

在外部系统中(交换机)的 SSH 身份验证

Kolla 中有一个功能,允许克服在 ml2/ovs 中重新启动 neutron-l3-agent 和 neutron-dhcp-agent 或在 ml2/ovn 中重新启动 neutron-ovn-metadata-agent 时中断数据平面连接、dhcp 和元数据服务的问题。

要启用它,请修改 /etc/kolla/globals.yml 中的配置

neutron_agents_wrappers: "yes"

有关更多详细信息,请参阅 bug 1891469