多个 PXE 过滤后端¶
https://bugs.launchpad.net/ironic-inspector/+bug/1665666
这部分是 HA inspector 项目的一部分 1,tripleo 路由网络 ironic inspector 项目的一部分 2,以及 Pike PTG inspector 架构会议的结果 3。
问题描述¶
为了防止与 ironic 裸机节点的正常 PXE 启动产生干扰,inspector 必须采用过滤“inspection” PXE 流量的方式。因此,过滤器必须阻止未被检查的节点,同时必须显式地将正在被检查的节点列入白名单。考虑到 *discovery* 功能,未知节点必须允许启动 inspection 镜像。
inspector 目前仅支持基于 L2 的 iptables 过滤器或不进行过滤的选项。虽然在扁平网络场景中功能正常,但 iptables 过滤器会造成扩展瓶颈和安全问题。对于 叶脊 用例,其中 DHCP PXE 请求通过机架顶层交换机中继,当前的 iptables 黑名单机制无法再使用,因为当跨越 L2 广播域时,原始 DHCP 帧的源 MAC 地址会被 TOR 交换机的 MAC 地址替换。如果使用专用的 discovery 网络,则不再需要 PXE 过滤。
为了支持这些用例并允许特定于供应商的解决方案,我们建议将 inspection PXE 流量过滤抽象成一个 *驱动程序接口*。这可以通过 *aaS* 的方式实现,例如 neutron,或者通过直接控制 DHCP 服务,即通过其 D-Bus 接口与 dnsmasq 通信。一个智能的 TOR 交换机可以直接过滤中继流量。在专用 discovery 网络的情况下,将使用一个 noop 驱动程序。
提议的变更¶
由于本质上过滤是一个 ironic 与 inspector 与过滤器同步的问题,我们建议创建一个离散的 PXE 过滤 *驱动程序接口*,其中包含这些 *幂等* 方法,这些方法 *不得锁定* 任何节点项目
__init__(self)同步;为每个进程创建“单例”实例的过滤器驱动程序;由 stevedore 调用以配置过滤器驱动程序。
init_filter(self)可以同步;初始化内部过滤器状态。此方法可以执行系统范围的过滤器状态更改。sync(self, ironic=None)在后台线程中调用;执行 ironic、inspector 和驱动程序内部状态之间的同步,例如更新iptables。tear_down_filter(self)可以同步;重置内部过滤器状态。此方法可以执行系统范围的过滤器状态更改。
这个抽象接口应该位于 inspector 树中,以及一个 iptables 和一个 noop 驱动程序实现。
此外,应该提供一个通用的 get_periodic_sync_task 过滤器驱动程序方法,特定的驱动程序实现可以考虑覆盖该方法,例如选择退出定期同步。
任何特定于驱动程序的 HA 问题不在本规范和 inspector 代码库的范围内,应由特定的驱动程序内部解决。
备选方案¶
选择几个受支持的、位于树中的过滤器,而不能由供应商扩展该集合。
数据模型影响¶
无
HTTP API 影响¶
无
客户端 (CLI) 影响¶
无
Ironic python agent 影响¶
无
性能和可扩展性影响¶
我们希望自定义 PXE 过滤器驱动程序帮助 inspector 扩展到超出当前基于防火墙的过滤瓶颈。
安全影响¶
无
部署者影响¶
引入一个新的配置选项
pxe_filter_driver,指向特定的过滤驱动程序。默认值应该是iptables。配置选项
firewall.*已被 *弃用* 并重命名为iptables.*配置选项
pxe_filter_driver应该优先于配置选项iptables.*。配置选项
iptables.manage_firewall将被 *弃用并忽略*。配置选项
firewall.firewall_update_period将被 *弃用并忽略*。部署者可以考虑适合其需求的自定义驱动程序。
将使用“标准” grenade 测试与基于防火墙的驱动程序,在 upstream inspector CI 网关中执行,以断言可升级性。
实现¶
为了说明驱动程序实现可能是什么样子,我们列出了特定的驱动程序将必须在内部处理哪些信息,比较了驱动程序的可能的 sync 方法实现。
驱动程序 |
白名单 |
黑名单 |
Discovery 支持 |
|---|---|---|---|
neutron |
使用 inspection 网络 ID 更新 PXE 端口 |
清除 PXE 端口上的 inspection 网络 ID |
N/A(单独的 VLAN) |
dnsmasq |
显式允许 MAC 地址租约 |
显式拒绝 MAC 地址租约 |
默认授予租约 |
iptables |
从黑名单中减去 MAC 地址 |
拒绝 MAC 地址的访问 |
默认接受 DHCP 流量 |
负责人¶
- 主要负责人
<milan k (vetrisko)>
工作项¶
引入抽象驱动程序接口
重构当前的基于防火墙的过滤器
依赖项¶
无
测试¶
将添加覆盖接口和默认实现的单元测试。一个“标准” Grenade CI 网关作业将断言 inspector 与默认基于防火墙的过滤器的可升级性。