OpenStack Neutron DVR L2 Agent的初步解析:DVR的创建及生效
OpenStack Juno版本已正式发布,这是这个开源云平台的10个版本,在Juno版的Neutron模块中真正引入了分布式路由(DVR)的实现,现在就我们就来看下具体DVR是怎么样创建起来并且生效进行工作的。
L2用Plugin与L3 agent交互
L2 OVS agent初始化
在L2 OVS agent初始化过程中,需要知道其主机唯一的DVR的MAC地址,为了将适当的OVS规则添加到隧道和集成网桥。为了这个目的,在L2 agent调用由ML2的插件提供的RPC函数 get_dvr_mac_address(HOST_ID)获取主机的DVR mac地址。
分布式路由的创建
一个路由器可以建立为明确的分布式路由器。创建路由器(在分布式模式或以其他方式)所需的操作通常没有在agent上进行操作。只有当一个接口被添加到路由器中,有在L2和L3 agent才会采取行动。在插件这方面,创建路由器的信息存储在DB中,如下图所示。
将接口添加到路由器中
在 分布式路由器执行接口的增加命令导致routers_updated()的RPC在CN上的L3-agent被调用。作为这种服务的请求的一部分,L3- Agent-on-CN初步验证这个受影响的路由器是否是一个分布式路由。如果是,则获取对应于新增的接口的接口端口并将这个端口挂在集成网桥上。这个操 作在本质上类似于L3 agent,除了在L3-Agent-on-CN运行在计算节点,并增加了端口,这种端口只会在分布式路由器上。
这里的端口是一个分布式路由器的接口,将有一个特殊的device_owner字段值:network:router_interface_distributed
在 把路由器上的接口端口加入BR-INT后,L3-Agent-on-CN要求提供有关该子网接口上的云端口的列表信息。对于这一点,调用 get_compute_ports_ by_subnet(subnet_id)到L3的插件。L3插件与ML2插件通信,去得到可用的输入子网中的所有端口,并返回L3-Agent-on- CN的端口列表。L3-Agent-on-CN缓存这些端口,然后使用端口信息来创建在DVR路由器命名空间上的静态ARP表项。这样就完成了路由器接口 的DVR侧的处理。
由 L3-Agent-on-CN加入路由器接口的端口被 L2 Agent检测到。L2 Agent识别到如果该端口是一个分布式的路由器接口。如果没有,它进行通常处理。如果是的话,它进行特殊处理,在其中调用 get_compute_ports_on_host_by_subnet(subnet_id),以获得本地虚拟机在此路由器的接口列表。然后,它使用 的端口列表及路由器接口的端口信息,在隧道和集成网桥上建立OVS规则。
从分布式路由移除接口
在 一个分时路由上执行一个路由接口的删除命令,在L3-Agent-on-CN调用routers_updated() RPC请求。作为这样一个请求的服务的一部分,L3-Agent-on-CN初始化时验证这个影响到的路由器是否是一个分布式路由,如果是,他就会获取对 应的要被删除掉额接口端口。再将路由接口端口从集成网桥移除。这个操作在本质上类似于L3 agent,除了在L3-Agent-on-CN运行在计算节点,而且删除的端口,这种端口只会在分布式路由器上。 在删除路由器上在br-int上的接口端口,L3-Agent-on-CN这个端口的缓存来确定端口中可以被删除的路由器接口就行。然后它会为列表中所有 端口移除路由器命名空间中的静态ARP表项。这样就完成了DVR侧的路由器接口删除的处理。
这些被L3-Agent-on-CN删除的路由器接口端口被L2 agent检测到。L2 agent识别这个端口是否是分布式路由接口。如果不是,就进行通常处理;如果是,完成特定的进程,将所有的与删除的路由器接口端口匹配的OVS规则从集成网桥和隧道网桥中移除。
新的虚拟机加入到分布式路由器的子网接口
当 一个新租户下VM被添加到分布式路由管理的子网接口,一个创建port的api调用被nova完成去主持新租户下的VM。作为ML2插件提供的创建端口服 务的一部分,ML2插件将通知L3 Plugin一个新的端口正在被添加。L3 Plugin将检查这个新的端口是否在一个DVR组建的子网中。如果不是,则不做任何操作。如果是,L3 Plugin将启动一个RPC call port_add() 到 the L3-Agent-on-CN。L3-Agent-on-CN收到这个RPC请求,会获取这个port的信息,然后为这个port增加静态的ARP表项到 对应的路由器命名空间。这样就完成DVR侧对一个新租户的VM port的增加。
新 租户的VM的端口被L2 agent检测到,L2 agent验证这个端口是否是已经存在分布式路由的子网的一个成员。如果不是,则做普通操作。如果是,执行特定操作:在br-int和br-tun上为匹 配的子网网关添加这个port(OFPORT)到现有的OVS规则中。
现有的虚拟机从一个分布式的路由器子网接口中删除
当 一个租户VM从一个被分布式路由管理的子网中移除,一个DeletePort API调用被Nova执行用来删除租户VM。作为ML2插件提供的删除创建端口服务的一部分,ML2插件将通知L3 Plugin一个新的端口正在被删除。L3 Plugin将检查这个要删除的端口是否在一个DVR组建的子网中。如果不是,则不做任何操作。如果是,L3 Plugin将启动一个RPC call port_delete() 到 the L3-Agent-on-CN。L3-Agent-on-CN收到这个RPC请求,会获取这个port的信息,然后为这个port移除静态的ARP表项到 对应的路由器命名空间。这样就完成DVR侧对一个新租户的VM port的移除。
移除的port被L2 agent检测到,L2 agent验证这个端口是否是已经存在分布式路由的子网的一个成员。如果不是,则做普通操作。如果是,执行特定操作:在br-int和br-tun上为匹配的子网网关移除这个port(OFPORT)到现有的OVS规则中。