多个 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 驱动程序。

提议的变更

由于本质上过滤是一个 ironicinspector 与过滤器同步的问题,我们建议创建一个离散的 PXE 过滤 *驱动程序接口*,其中包含这些 *幂等* 方法,这些方法 *不得锁定* 任何节点项目

  • __init__(self) 同步;为每个进程创建“单例”实例

    的过滤器驱动程序;由 stevedore 调用以配置过滤器驱动程序。

  • init_filter(self) 可以同步;初始化内部过滤器状态。此方法可以执行系统范围的过滤器状态更改。

  • sync(self, ironic=None) 在后台线程中调用;执行 ironicinspector 和驱动程序内部状态之间的同步,例如更新 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 网关中执行,以断言可升级性。

开发者影响

自定义 PXE 过滤器驱动程序的开发人员应遵守建议的驱动程序接口。任何特定的 HA 考虑因素应由驱动程序内部解决。将使用 stevedore 库来实现驱动程序加载机制。

实现

为了说明驱动程序实现可能是什么样子,我们列出了特定的驱动程序将必须在内部处理哪些信息,比较了驱动程序的可能的 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 与默认基于防火墙的过滤器的可升级性。