为代理添加可用区

https://blueprints.launchpad.net/neutron/+spec/add-availability-zone

为 DHCP 和 L3 代理实现可用区。 就像 Nova 和 Cinder 一样,这允许用户指定网络服务运行的位置,从而提供更好的故障隔离。

问题描述

Nova 和 Cinder 今天都有可用区。 云管理员可以将可用区分配给物理节点。 这些节点通常配备不同的电源插座、网络交换机、冷却设备等。 通过正确选择提供的可用区,用户可以最大限度地降低服务故障的风险。

但是,由于 Neutron 没有可用区,因此无法像虚拟机实例或虚拟机卷一样将网络服务置于不同的可用区下。 目前 Neutron 的情况完全是偶然的。 用户面临更高的网络故障概率风险,因为用户无法将网络资源分配到可用区以实现高可用性。 此外,网络流量可能在可用区之间经过较长的路径。 DVR 和 L3 HA 可以在一定程度上缓解这些问题,但它们并不能完全解决问题,因为 DVR 仍然需要中央 SNAT 路由器,该路由器需要具备 HA 能力,并且 L3 HA 不了解底层硬件配置以实现系统级别的 HA(即,不仅仅是将路由器分配到“其他节点”,而是分配到“合适的节点(或节点组)”)。

注意:此规范侧重于网络资源的高可用性。 此规范不涉及与单元讨论相关的进程通信的可扩展性问题,也不涉及与网络段讨论相关的底层网络拓扑。

提议的变更

此更改将“可用区”的概念引入 Neutron。 特别是,可用区是网络和路由器资源的可选属性。 这些属性不会以任何方式影响 Neutron 在允许的逻辑网络连接方面的行为。 这些属性只是作为后端关于将使用这些网络资源的其它资源(计算和存储)位置的提示。 Neutron 后端可以使用此信息来优化其资源的动态放置,以提高性能和/或确保资源放置在相同的定义故障域中。

创建一个名为 availability_zone 的新扩展。

  • 该扩展添加了一个新的 API,用于列出可用区。

此信息的其余部分适用于内置参考后端中可用区的实现。

该扩展将 availability_zone 属性添加到 Agent DB 模型。 它还为 Network 和 Router DB 模型添加了 availability_zones 和 availability_zone_hints 属性。 相应的 API 资源也将看到 availability_zone 属性。

添加了新的配置选项 availability_zone 和 default_availability_zones。 每个代理的可用区由每个配置文件中的 availability_zone 配置参数设置。 如果代理配置中未提供 availability_zone 参数,则该代理将被分配到名为“nova”的默认可用区。 “nova”名称指的是 Nova 和 Cinder 的可用区。 当用户在没有可用区属性的情况下执行资源创建 API 时,neutron 将 default_availability_zones 值设置为资源。 default_availability_zones 值可以是空白。 如果是这样,调度器将从任何可用区选择任何代理,而不会偏好特定的可用区。 这有助于避免资源分配不平衡。

API 和配置安排如下。

  • 使用配置,部署者指定代理属于哪个 availability_zone,他们还可以为用户资源定义默认可用区。

  • 使用可用区 GET API,用户可以获取 neutron 管理的所有可用区。 可用区 API 仅为“GET”。

  • 使用网络资源 GET API,用户可以获取其网络资源分配到的可用区。

  • 使用网络资源 POST API,用户可以创建一个带有可用区提示的网络资源,作为资源所属可用区的候选区。

此规范使每个资源能够属于多个可用区。 用户可以在创建资源时将多个 AZ 的列表指定为参数,定义资源可能部署的可用区候选区。 如果创建时未提供该参数,并且未指定 default_availability_zones 配置,则资源可以部署在任何可用区。 换句话说,资源的多个 AZ 列表限制了部署范围。 因此,我们可以通过将网络或路由器调度到两个不同可用区的两个代理来获得冗余。 调度器也得到了改进,以便正确地分配具有可用区的路由器和网络。

限制:在没有 HA 的参考 L3 实现中,我们显然无法将路由器分配给多个 L3 代理,因此我们无法从可用区获得纯粹的高可用性。 用户只是通过将可用区设置为非 HA 路由器来期望故障域。 在参考 L3 实现中启用 L3-HA 的路由器的情况下,所有跨可用区的 L3 代理仍然需要统一地具有到外部网络的连接才能实现高可用性部署。

未来工作:预计 neutron 中的所有其它服务,例如 lbaas、fwaas、vpnaas 等,都能够将可用区作为其属性处理。 由于这些尚未在参考实现中支持 HA 功能,我建议逐步地在另一个规范中分别实现它们,希望几乎与此规范同时进行。

数据模型影响

如上所述,该规范将 availability_zone 属性添加到 DB。 将提供一个迁移脚本。 当操作员更新配置时,neutron 会检查资源和代理之间的不同可用区,然后输出一些日志。

将添加属性

将 Availability_zone 属性添加到 RouterExtraAttributes

属性

类型

描述

availability_zone_hints

字符串

路由器的可用区候选区

availability_zones

字符串

路由器的可用区

将 Availability_zone 属性添加到 NETWORKS 作为扩展

属性

类型

描述

availability_zone_hints

字符串

网络的可用区候选区

availability_zones

字符串

网络的可用区

将 Availability_zone 属性添加到 Agent

属性

类型

描述

availability_zone

字符串

代理的可用区

REST API 影响

  • /agents

将“availability_zone”键添加到“configurations”属性(字典)中。 请注意,“configurations”属性是只读的。

  • /networks 和 /routers

添加了以下属性。

新属性

属性名称

类型

访问

默认值

验证转换

描述

availability_zone_hints

字符串列表

RW(仅 POST),全部

[]

字符串列表

人类可读名称列表

availability_zones

字符串列表

RO,全部

[]

字符串列表

人类可读名称列表

  • /availability_zones

该扩展引入了一个新的 availability_zone API 资源。 仅提供 GET。

属性名称

类型

访问

默认值

验证转换

描述

availability_zones

字典列表

RO,全部

N/A

N/A

请参见下面的示例

JSON 响应示例

{
    "availability_zones": [
        {
            "name": "nova",
            "state": "available"
        }]
}

安全影响

无。

通知影响

无。

其他最终用户影响

python-neutronclient 和 horizon 将支持新的 availability_zone 值。

性能影响

无。

IPv6 影响

无。 此提案与协议无关。

其他部署者影响

为了使用此功能,部署者需要在每个配置文件(例如 l3_agent.ini 和 dhcp_agent.ini)中设置 availability_zone,指定每个网络节点的可用区。

该规范期望部署者通过配置文件将可用区设置为代理,因为可用区与电源插座的位置和固定设备相关。 但是,它不会阻止与可用区相关的新的功能从提供 API,从而使部署者能够在没有配置的情况下指定可用区。 它包括管理物理资源(如 Host_aggregation、Cell 等)的功能。

升级影响

代理端:升级前,所有代理都被认为位于名为“nova”的默认可用区。 一旦操作员在其代理配置文件中配置了 availability_zone 配置参数“availability_zone”并重新启动了代理,该代理就属于配置文件中设置的可用区。 如果操作员将“nova”设置为该参数,则意味着与默认可用区相同。

资源端:升级前,所有资源都被认为位于任何可用区。 即使操作员更改了代理的可用区,也不会破坏与代理上现有资源的匹配。

开发人员影响

无。

社区影响

无。

备选方案

无。

实现

负责人

主要负责人

Hirofumi Ichihara <ichihara-hirofumi>

二级分配人

Iwamoto Toshihiro <iwamoto>

工作项

  • 将 availability_zone 添加到 DB 模型

  • 使代理报告其 availability_zone 设置

  • 添加 availability_zone 扩展

  • (验证 REST API availability_zone 参数)

  • 基于现有的 neutron 调度器实现添加 AvailabilityZoneFilter

  • 修改 L3(非 DVR 和 dvr_snat 路由器)和 DHCP 代理调度器以感知 AZ

  • 修改 L3(HA 路由器)代理调度器以感知 AZ

  • 将可用区添加到 python-neutronclient(需要志愿者)

  • 将可用区添加到 horizon(assignee: amotoki)

依赖项

无。

测试

Tempest 测试

无。

功能测试

添加测试,以确保资源分配到正确的可用区。 将为以下资源添加两个新测试

  • 网络可用区

  • 路由器可用区

API 测试

将添加新属性和新 API 资源的测试。

文档影响

用户文档

将记录新的配置选项。 可用区用例和用法将在 devref 中记录。

开发人员文档

无。

参考资料