Bootstrap

理解 OpenStack 高可用(HA):Neutron 分布式虚拟路由(下)

1. 代码分析

DVR 代码修改包括几部分:

  1. DVR Router network namespace 的创建和删除
  2. DVR Router 相关的 flows
  3. DVR Router 的 ARP 表

1.1 DVR Router 相关 network namespace 的创建和删除

1.1.1 qrouter 在计算和网络节点上的删除和创建

  1. 对于每一个 DVR Router,在每个分布了和 router 连接的网段内的虚机的计算节点上,都会有一个 qrouter 实例。两种情况下会将一个 DVR Router 部署到一个 L3 Agent 上:

    • 当一个子网 subnet 被加入到一个 DVR Router 时,DVR Router 会被分布到所有包含在该子网内的虚机的计算节点上。
    • 计算节点上的 L3 Agent 会收到一个通知,它会配置 router
      OVS Agent 会将 router 的端口 plug 到 OVS Bridge 上,并且配置 flows
  2. 当一个虚机被创建,而且虚机所在的计算节点上不存在该虚机所在 subnet 连接的 DVR Router 时。

  3. 当与 DVR Router 相关的最后一个虚机被删除时,router namespace 会被从虚机所在的计算节点上删除。

1.1.2 snat 在网络节点上的创建和删除

创建:当设置 router 的 external gateway 时

删除:当删除 router 的 external gateway 时

1.1.3 fip 在 计算节点上的创建和删除

创建:当一个浮动 IP 被分配给一个虚机的时候,如果虚机所在的计算节点上 fip namespace 不存在,则创建它

删除:(1)当计算节点上最后一个使用浮动 IP 的虚机被删除后 (2)所有虚机的浮动 IP 被删除后

1.2 DVR MAC 地址

前面提到过,分布到多个计算节点上的 qrouter 的interface 的 MAC 地址都相同。这在传统的网络中是不允许的,在 neutron 网络中某些时候也会导致一些问题。Neutron的做法是会向每个计算节点分配一个唯一的 DVR Host MAC 地址。当使用了 DVR 的 OVS Agent 启动的时候,它通过 RPC 去从 neutron server 上申请该 MAC 地址。该 MAC 地址会被保存在 DB 中,与该计算节点强绑定。比如:

MariaDB [neutron]> select * from dvr_host_macs;
+----------+-------------------+
| host     | mac_address       |
+----------+-------------------+
| network  | fa:16:3f:12:a3:38 |
| compute1 | fa:16:3f:b2:34:82 |
| compute2 | fa:16:3f:db:6f:73 |
+----------+-------------------+

当数据包离开 DVR Router 经过 br-tun 时,OVS flows 会将 DVR Router interface 的源 MAC 地址替换成该 MAC 地址。

root@compute1:/home/s1# ovs-ofctl dump-flows br-tun | grep mod_dl_src
 cookie=0x0, duration=6989.394s, table=1, n_packets=6405, n_bytes=627690, idle_age=510, priority=1,dl_vlan=1,dl_src=fa:16:3e:ec:f3:dd actions=mod_dl_src:fa:16:3f:b2:34:82,resubmit(,2)
 cookie=0x0, duration=8055.165s, table=1, n_packets=10, n_bytes=980, idle_age=4814, priority=1,dl_vlan=2,dl_src=fa:16:3e:63:3b:4c actions=mod_dl_src:fa:16:3f:b2:34:82,resubmit(,2)
 cookie=0x0, duration=8059.947s, table=1, n_packets=635, n_bytes=26950, idle_age=4843, priority=1,dl_vlan=1,dl_src=fa:16:3e:a9:da:b5 actions=mod_dl_src:fa:16:3f:b2:34:82,resubmit(,2)

而 src mac 地址分别是 qrouter 上的作为默认各网段的默认网关的 mac 地址:

s1@controller:~$ neutron port-list | grep fa:16:3e:ec:f3:dd
| f849ae46-4819-45f5-a805-5970d4e31951 |      | fa:16:3e:ec:f3:dd | {
  "subnet_id": "f8841500-b392-4053-bda1-acf419f4a86e", "ip_address": "90.1.180.1"} 
s1@controller:~$ neutron port-list | grep fa:16:3e:63:3b:4c
| 517bdba3-b117-43ce-851b-bb1d039879dc |      | fa:16:3e:63:3b:4c | {
  "subnet_id": "4ec65731-35a5-4637-a59b-a9f2932099f1", &#
;