中子/L3 高可用性 VRRP¶
Launchpad蓝图
https://blueprints.launchpad.net/neutron/+spec/l3-high-availability
此蓝图的目的是在虚拟路由器上添加高可用性功能。
高可用性功能将作为扩展和驱动程序实现。代理端的第一驱动程序将基于 Keepalived。
为了实现冗余,还将添加一个新的调度器,以便能够在多个代理上生成相同路由器的多个实例。
DVR 蓝图将利用此提案作为专门用于 SNAT 流量的服务节点。请参阅本文档末尾的 DVR BP 参考。
问题描述¶
目前,我们可以生成多个 l3 代理,并且一个 l3 代理可以处理多个外部网络,但是每个 l3 代理都是单点故障 (SPOF)。
如果一个 l3 代理失败,该代理的所有虚拟路由器都将丢失,从而导致连接到这些虚拟路由器的所有虚拟机被隔离。
提议的变更¶
对于中子服务器端
此蓝图的想法是将虚拟路由器调度到至少两个 l3 代理,但可以通过更改中子配置文件中的参数来增加此限制。
对于中子 L3 代理端
l3 代理中当前的路由器接口管理将被抽象化,以便引入用于此目的的驱动程序。作为驱动程序的首次实现,将添加一个 HA Keepalived 驱动程序。所有 IP 都将转换为 VIP。
为了隐藏租户视角的 HA 流量,将添加一个 HA 网络,并且所有虚拟路由器实例都将通过一个 HA 端口连接到此网络。
流程
+----+ +----+
| | | |
+-------+ QG +------+ +-------+ QG +------+
| | | | | | | |
| +-+--+ | | +-+--+ |
| VIPs| | | |VIPs |
| | +--+-+ +--+-+ | |
| + | | | | + |
| KEEPALIVED+---+ HA +------+ HA +----+KEEPALIVED |
| + | | | | + |
| | +--+-+ +--+-+ | |
| VIPs| | | |VIPs |
| +-+--+ | | +-+--+ |
| | | | | | | |
+-------+ QR +------+ +-------+ QR +------+
| | | |
+----+ +----+
作为 Keepalived 驱动程序实现的第二阶段,Keepalived 驱动程序将启动一个 conntrackd 实例,以便在从活动状态切换到待机状态时不会丢失已建立的连接。
备选方案¶
第一个驱动程序将基于 Keepalived。我们可以使用基于其他协议的替代驱动程序,例如:通用地址冗余协议 (CARP)。
默认情况下,将添加一个配置参数,以指定虚拟路由器是否为 HA。此外,还引入了一个仅供管理员使用的 API,该 API 允许管理员将现有的路由器迁移到 HA 模式。
数据模型影响¶
将在 router_extra_attributes 表中添加两列,以指定虚拟路由器是否为 HA 以及指定虚拟路由器 ID。
属性名称 |
类型 |
访问 |
默认值 |
验证/转换 |
描述 |
|---|---|---|---|---|---|
ha ha_vr_id |
bool int |
RW, admin RW, admin |
False N/A |
N/A N/A |
将路由器设置为 HA HA 虚拟路由器 ID |
由于 VRRP 协议的限制,ha_vr_id 将限制为 255。在引入没有此限制的新驱动程序时,必须删除此限制。
将引入一个新的表,以指定路由器、代理和将用于 HA 管理流量的 HA 端口之间的关联。
属性名称 |
类型 |
访问 |
默认值 |
验证/转换 |
键 |
描述 |
|---|---|---|---|---|---|---|
port_id |
UUID |
RW,管理员 |
N/A |
N/A |
主键 |
HA 端口 ID |
router_id |
UUID |
RW,管理员 |
N/A |
N/A |
||
l3_agent_id |
UUID |
RW,管理员 |
N/A |
N/A |
||
priority |
int |
RW,管理员 |
50 |
N/A |
||
state |
enum |
RW,管理员 |
N/A |
N/A |
active/standby |
REST API 影响¶
router-create 为给定的租户创建一个路由器。
- ::
router-create –name another_router –ha=true
只有管理员才能设置此属性。租户不需要了解路由器表中的此属性。因此,它对租户不可见。
请求
- ::
POST /v2.0/routers Accept: application/json
{ “router”:{ “name”:”another_router”, “admin_state_up”:true, “ha”:true} }
响应
- ::
{ “router”:{ “status”:”ACTIVE”, “external_gateway_info”:null, “name”:”another_router”, “admin_state_up”:true, “ha”:true, “tenant_id”:”6b96ff0cb17a4b859e1e575d221683d3”, “id”:”8604a0de-7f6b-409a-a47c-a1cc7bc77b2e”} }
router-show 显示给定路由器的信息。
请求
- ::
GET /v2.0/routers/a9254bdb-2613-4a13-ac4c-adc581fba50d Accept: application/json
响应
- ::
{ “routers”:[{ “status”:”ACTIVE”, “external_gateway_info”:{ “network_id”:”” }, “name”:”router1”, “admin_state_up”:true, “ha”:true, “tenant_id”:”33a40233088643acb66ff6eb0ebea679”, “id”:”a9254bdb-2613-4a13-ac4c-adc581fba50d”}] }
router-update 为给定的租户创建一个路由器。
只有管理员才能更新路由器的 HA 模式。
仅管理员上下文
- ::
neutron router-update router1 –ha=True
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
不会对网络性能产生影响。生成新的虚拟路由器可能会稍长,因为启动 Keepalived/Conntrackd 进程存在延迟。
其他部署者影响¶
由于此实现依赖于 Keepalived,因此必须在每个 l3 节点上部署 Keepalived。所需的 Keepalived 版本是版本 1.2.0,以便支持 IPV6。
此外,每个节点都需要运行 conntrackd。
没有计划在更新以前的 Openstack 安装时自动迁移原始虚拟路由器到 HA 虚拟路由器。因此,在迁移之后,并将 l3_ha 配置参数设置为“True”的情况下,新创建的路由器将为 HA,而旧的路由器将保持不变。云管理员可以使用新的 API 将现有的虚拟路由器迁移到 HA 路由器。此 API 不向租户公开。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Sylvain Afchain <sylvain-afchain>
- 其他贡献者
Assaf Muller <amuller>
工作项¶
HA L3 扩展,DB 基础
HA L3 调度器
Keepalived 管理器
L3 代理驱动程序抽象介绍,Keepalived 驱动程序
Conntrackd 支持
依赖项¶
无
测试¶
代码将由单元测试覆盖。当可用多节点测试时,将引入 tempest 测试。
将更新一份文档,解释如何在审查过程中测试所有补丁
https://docs.google.com/document/d/1P2OnlKAGMeSZTbGENNAKOse6B2TRXJ8keUMVvtUCUSM
文档影响¶
文档部署影响。
参考资料¶
https://review.openstack.org/#/q/topic:bp/l3-high-availability,n,z https://git.openstack.org/cgit/openstack/neutron-specs/tree/specs/juno/neutron-ovs-dvr.rst https://wiki.openstack.org/wiki/Neutron/L3_High_Availability_VRRP