• 1
  • 2
  • 3
  • 4
  • 5
阿里云应用开发 首 页  »  帮助中心  »  云服务器  »  阿里云应用开发
OpenStack Neutron DVR L2 Agent的初步解析
发布日期:2016-7-11 21:7:48

  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规则中。