新的对象模型的 LBaaS 驱动程序接口变更

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/neutron/+spec/lbaas-objmodel-driver-changes

即将到来的 Juno 版本的 LBaaS 对象模型和 API 变更将需要一些驱动程序接口变更,用于新的对象和向后兼容性。

新的接口包括 create_load_balancer(以及其余的 CRUD 操作)和 create_listener。Create_vip 将被移除,并将在旧版驱动程序的 shim 层中支持。M:N 健康监控关联也将被移除。

新的对象模型和 API 蓝图:https://blueprints.launchpad.net/neutron/+spec/lbaas-api-and-objmodel-improvement

此蓝图不涵盖新的 TLS 或 L7 功能的变更。

问题描述

随着即将到来的 LBaaS 对象模型和 API 变更,我们将需要新的接口用于后端负载均衡驱动程序,以及一个 shim 层,以便在弃用期间让旧版驱动程序继续工作。

提议的变更

加载驱动程序时,neutron 将确定它是一个新的对象模型驱动程序还是一个旧版驱动程序,并根据情况选择合适的实现/shim 类。

新的驱动程序接口方法将传递带有属性的对象,而不是像 icehouse 驱动程序那样传递字典。为了方便起见,最初这些对象将是标准的 neutron sqlalchemy 对象,但未来不保证完整的 sqlalchemy 功能。基本的属性和依赖对象查找将长期支持。

新的驱动程序接口将由实现 create、update 和 delete 方法的处理器类组成。示例,可能会更改

sample_driver.py

class SampleDriver(LoadBalancerAbstractDriver):
    def __init__(self):
        self.load_balancer = MyLoadBalancerManager(self)
        self.listener = MyListener(self)
        self.member = ef.MemberHandler(self)
        self.stats = xyz.foo.StatsGatherer(self)
        self.health_monitor = HMHandler(self)

class MyLoadBalancerManager(BaseManager):
    def __init__(self, driver):
        self.driver = driver
    def create(self, context, lb_obj):
        print("create")
    def update(self, context, lb_obj):
        print("update")
    def delete(self, context, lb_obj):
        print("delete")

支持的驱动程序处理器:* load_balancer * listener * pool * member * health_monitor * stats

以下旧版驱动程序方法将被转换/支持。每个方法旁边的注释说明了与现有行为的不同之处。

  • create_vip - 上述一个 load_balancer 和 listener 对象的组合。

  • update_vip

  • delete_vip

  • create_pool - 首先创建的对象

  • update_pool

  • delete_pool

  • stats

  • create_member

  • update_member

  • delete_member

  • update_pool_health_monitor

  • create_pool_health_monitor

  • delete_pool_health_monitor

旧版驱动程序 shim 的限制

  • 负载均衡器上不支持多个 listener。

  • listener 上不支持多个 pool。

  • 不支持健康监控的多对多关联。

  • 不支持 member 对象上的子网 ID。

驱动程序中断

  • 在相关驱动程序(embrane、radware)的维护者更新驱动程序之前,对 ldb.Vip 的一些引用将会中断。这些驱动程序的测试将被暂时禁用,直到修复为止。

备选方案

对于驱动程序的向后兼容 shim 层,一种建议的替代方案是创建一个完全独立的新 LBaaS 扩展/插件,使用完全独立的数据库表,并让两者同时存在。这将涉及重复的驱动程序和数据库表。我们决定不使用这种方法,并且 lbaas api/驱动程序变更的通用实施计划

  • 使用在旧模型和新模型之间具有合并字段的数据库表创建新的 LBaaS 扩展。

  • 更改旧扩展的前端以“转换”为对新模型的操作。

  • 更改驱动程序以使用新模型。

  • 从数据库中弃用/删除未使用的旧模型字段。

  • 弃用/删除旧前端。

数据模型影响

无,请参阅对象模型蓝图。

REST API 影响

无,请参阅对象模型蓝图。

安全影响

无,与当前驱动程序实现相同的影响。

通知影响

无。

其他最终用户影响

无。

性能影响

无,与当前驱动程序实现相同的影响。

其他部署者影响

升级到新的 LBaaS 将涉及数据库迁移;请参阅对象模型蓝图。旧版 LBaaS 驱动程序将继续工作,除非尝试将多个 listener 添加到负载均衡器,否则将失败。

开发人员影响

当前的 LBaaS 驱动程序维护者最终需要更新他们的驱动程序以使用新的接口。

实现

负责人

主要负责人

https://launchpad.net/~brandon-logan https://launchpad.net/~dougwig

工作项

  • 修改驱动程序上方的层以调用新的入口点。

  • 修改驱动程序上方的层以调用旧版驱动程序接口方法,用于旧版驱动程序,并根据需要转换新的对象模型。

  • 带有新接口的新 abstract_driver。

更新参考 haproxy 驱动程序将在另一个蓝图中进行。

依赖项

测试

  • 针对旧版驱动程序的现有测试将继续通过,除非测试 M:N 健康监控关系。

  • 当更新参考驱动程序时,将添加用于新入口点的测试。

  • 如“提议的变更”中所述的损坏的驱动程序将导致测试被禁用,直到驱动程序修复为止。

文档影响

无。

参考资料