代理和服務

通常的 Neutron 设置由在单个或多个节点上运行的多个服务和代理组成(尽管某些设置可能不需要任何代理)。这些服务中的每一个都提供一些网络或 API 服务。其中特别重要的有

  1. neutron-server 提供 API 端点,并作为访问数据库的单一入口点。它通常运行在控制器节点上。

  2. Layer2 代理可以使用 Open vSwitch 或其他供应商特定的技术,为项目网络提供网络分段和隔离。L2 代理应在负责连接和保护虚拟接口的每个节点上运行(通常是计算节点和网络节点)。

  3. Layer3 代理运行在网络节点上,提供东西向和南北向路由,以及一些高级服务,例如 FWaaS 或 VPNaaS。

配置选项

Neutron 配置选项在 neutron-server 和代理之间进行隔离。这两个服务和代理都可以加载主 neutron.conf 文件,因为该文件应包含内部 Neutron RPC 的 oslo.messaging 配置,并且可能包含特定于主机的配置,例如文件路径。 neutron.conf 包含数据库、keystone、nova 凭据以及仅供 neutron-server 使用的端点。

此外,neutron-server 可以加载特定于插件的配置文件,但代理不应加载。由于插件配置主要是站点范围内的选项,并且插件为 neutron 提供持久层,因此应通过 RPC 指示代理对这些值执行操作。

每个单独的代理都可以有自己的配置文件。该文件应在加载主 neutron.conf 文件之后加载,以便代理配置优先。特定于代理的配置可以包含在 Neutron 部署中的主机之间不同的配置,例如 L2 代理的 local_ip。如果任何代理需要访问 Neutron RPC 之外的其他外部服务,则应在特定于代理的配置文件中定义这些端点(例如,元数据代理的 nova 元数据)。

代理的管理状态特定配置选项

创建新代理时,该字段 admin_state_up 将设置为配置选项 enable_new_agents 的值,该配置选项的默认值为 true

[DEFAULT]
enable_new_agents = true

可以通过 API 或 CLI 将代理的 admin_state_up 值设置为 False

$ openstack network agent set agent-uuid --disable

这因代理类型而异

L2 代理

Neutron 数据库中代理的 admin_state_up 字段设置为 False,但代理仍然能够绑定端口。对于 openvswitch-agent 和 sriov-agent 而言,情况就是如此。

注意

在基于 OVN 的部署中,Neutron 不会在 agents 数据库表中跟踪 OVN 控制器,因此设置 admin_state_up 是不允许的,因为 Neutron 无法控制 OVN 实体。通过 Neutron REST API 删除 OVN 代理的可能性是为了清理错误的 chassis 信息。

Metadata agent

admin_state_up 设置为 False 对元数据代理没有影响。

DHCP 代理

DHCP 代理调度程序会将网络调度到 admin_state_upTrue 的代理。

L3 agent

L3 调度程序会将路由器调度到 admin_state_up 字段为 True 的 L3 代理。

代理运行的外部进程

一些 Neutron 代理,例如 DHCP、Metadata 或 L3,通常运行外部进程来提供其某些功能。这可能是 keepalived、dnsmasq、haproxy 或其他进程。Neutron 代理负责在必要时生成和终止这些进程。默认情况下,为了终止这些进程,代理使用简单的 kill 命令,但在某些情况下,例如当这些附加服务在容器内运行时,这可能不是一个好的解决方案。为了解决这个问题,操作员应使用 AGENT 配置组选项 kill_scripts_path 来配置一个路径,该路径指向这些进程的 kill 脚本 所在的位置。默认情况下,它设置为 /etc/neutron/kill_scripts/。如果配置中的 kill_scripts_path 选项更改为不同的位置,则应相应地更改 /etc/rootwrap.conf 中的 exec_dirs。如果设置了 kill_scripts_path,那么每次 Neutron 必须终止进程时,例如 dnsmasq,它都会在该目录中查找一个名为 <process_name>-kill 的文件。因此,对于 dnsmasq 进程,它将查找一个 dnsmasq-kill 脚本。如果存在这样的文件,则将调用它,而不是使用 kill 命令。

Kill 脚本使用两个参数调用

<process>-kill <sig> <pid>

其中:<sig> 是信号,与 kill 命令相同,例如 9SIGKILL;并且 <pid> 是要终止的进程的 pid。

然后,此外部脚本应处理终止给定进程,因为 Neutron 将不再为它调用 kill 命令。