Openvswitch Agent 上分布式路由器通告

RFE: https://bugs.launchpad.net/neutron/+bug/1961011

Neutron L3 路由器将运行 radvd 来发送 RA(路由器通告)数据包,以通知虚拟机子网的 ManagedFlag、LinkMTU 和 IPv6 子网的前缀。这对于小型云或长期稳定的云环境(没有更改)来说是可以工作的。但对于大型云环境,管理复杂性会增加。

Neutron openvswitch agent 可以被认为是分布式 SDN 控制器,本文档描述了如何在分布式模式下,在每个计算节点上使 RA 工作,而无需额外的进程。

问题描述

radvd 在 L3 路由器命名空间中启动,它将在路由器接口上多播 RA,到达所有连接的虚拟机。当前的 radvd 配置如下

interface qr-8fd65326-c4
{
   AdvSendAdvert on;
   MinRtrAdvInterval 30;
   MaxRtrAdvInterval 100;
   AdvLinkMTU 1500;
   AdvManagedFlag on;
   prefix fda7:a5cc:3460:3::/64
   {
        AdvOnLink on;
        AdvAutonomous off;
   };
};

为了完成这项工作,L3 agent 需要执行以下操作:* 启动一个 radvd 的进程管理器 * 渲染 radvd 的配置文件 * 监控额外的进程,以防意外退出 * 在发生更改时重新启动进程

对于 DVR 路由器,radvd 也会在计算节点上的每个本地路由器命名空间中运行。

在某些情况下,这会增加服务器进程的数量,增加服务器的资源消耗,增加故障点,并降低 L3 agent 的处理性能。

当前 RA 机制存在缺陷。它强制子网与 Neutron 路由器关联,如果您希望 Neutron 管理 IPv6 相关的配置 [2]。那么,如果一个子网没有连接到路由器,radvd 将不会响应 RS 请求,也不会返回 RA。隔离网络下的虚拟机将无法找到如何处理 IPv6 地址,如何配置 IPv6 地址,以及如何处理 DHCPv6。

因此,此 agent 扩展将使隔离网络能够使用 IPv6。在其下的虚拟机将获得关于 IPv6 子网前缀、自主地址配置标志、管理地址配置标志和其他配置标志的 RA。隔离网络下的虚拟机将根据这些标志使用 IPv6。

提议的变更

为 Neutron openvswitch agent 添加一个 agent 扩展,以更自然和优雅的方式向本地虚拟机发送 RA。

注意

此扩展仅适用于 openvswitch agent,其他机制驱动程序将不被考虑,因为此新扩展将依赖于 openflow 协议和原理。

提出的解决方案

新的 agent 扩展将使用 os-ken(ryu) [1] 来组装 RA 数据包,然后直接通过 packet-out 到 ofport(虚拟机端口)。任务完成,非常简单!一些主要的代码流程将是

  • 新扩展使用子网缓存列表初始化

  • 启动一个周期性循环,向来自这些子网的每个端口发送 RA

  • handle_port 方法中,每个虚拟机端口的子网将被添加到缓存中

  • delete_port 中,从子网的端口缓存中删除虚拟机端口

  • 通过资源缓存 RPC 获取子网信息

  • 循环发送 RA 到每个端口

Openvswitch agent 将通过“资源缓存”相关的 RPC 拉取端口、子网和网络信息。

注意

在某些情况下,neutron 路由器将与上游物理路由器交互。此扩展将不处理此类配置和部署架构。

如果子网的属性 ipv6_ra_mode 为 None,则 Neutron 将不会向虚拟机生成 RA。 ipv6_ra_mode = None 将用于指示是否存在外部(物理)路由器。

实现

负责人

工作项

  • 添加 ovs-agent 扩展来完成 RA 工作。

  • 使 L3-agent radvd 可配置。

  • 测试。

  • 文档。

依赖项

测试

测试用例以验证 RA 是否适用于端口。

参考资料