Openstack dvr
1. 拓扑图
2. 通信流程
a) 不同子网间通信(东西向)
如上图所示,有两个子网net1 (10.0.0.0/)和net2(10.0.1.0/), 两个DVR(左边为dvr1,右边为dvr2) i. Instance1(10.0.0.5)向instance2(10.0.1.5)发送报文 ii. Instance1 查看路由表,应该将报文发送至网管10.0.0.1处。此时发出arp消息,获取网管mac地址。广播送至br-int, 因为qvo与qr-1位于同一vlan tag,<br /> 因此DVR会响应改arp请求。 同时为了防止外部DVR响应,当报文转发到了br-tun网桥时,ovs流规则中会drop对于10.0.0.1的arp请求报文 iii. Instance1获取到网管mac之后,封装报文,并发送至ovs port qr-.此时报文头格式如下:
源mac | 目的mac | 源IP | 目的IP |
Vm1_mac | Dvr1_net1_mac | 10.0.0.5 | 10.0.1.5 |
- dvr1收到该报文,根据自身路由规则,将报文转发至dvr1 qr-2(10.0.1.1)。
源mac | 目的mac | 源IP | 目的IP |
dvr1_net1_mac | dvr1_net2_mac | 10.0.0.5 | 10.0.1.5 |
- 之后dvr1 qr-2会查询instance2的mac地址,mac是由neutron使用静态arp方式设定的。因为neutron知道所有虚拟机mac,因此可在虚拟机创建时候将对应arp信息记录。获取到instance2 mac之后,报文会被发往br-int网桥。此时报文头格式如下:
源mac | 目的mac | 源IP | 目的IP |
dvr1_net2_mac | instance2_mac | 10.0.0.5 | 10.0.1.5 |
- Br-int网桥将此报文发往br-tun网桥,在br-tun网桥的流规则中,会丢弃目标mac为dvr的报文。防止dvr响应外部请求(隔离外部网络和防止IP冲突),因此必须修改报文源mac地址。
在neutron数据库表dvr_host_macs中,会为每个计算节点分配一个唯一的mac地址,报文在封装成vxlan报文之前,源mac会被替换成compute1在表中对应的mac : com1_mac。
源mac | 目的mac | 源IP | 目的IP |
com1_mac | instance2_mac | 10.0.0.5 | 10.0.1.5 |
- 报文在br-tun封装成vxlan报文,从绑定IP的设备上通过物理链路到达compute2上
- Compute2 br-tun解vxlan封装之后,会根据规则转发到br-int网桥上。
- Br-int上根据流规则,在检测到源mac为com1_mac全局mac,且目的ip位于10.0.1.0/24网段,因此会将源mac修改为dvr2_net2_mac。此时报文头部如下:
源mac | 目的mac | 源IP | 目的IP |
dvr2_net2_mac | instance2_mac | 10.0.0.5 | 10.0.1.5 |
随后instance2收到该报文。
b) 绑定floating ip对外通信(南北向)
从内部ping外网主机
- 为虚拟机绑定floating ip 后,会生成floating ip namespace
- Instance1将报文发送至dvr网关处,dvr中设有策略路由和nat规则链(在dvr namespace中通过iptables -nvL -t nat 以及ip rule + ip route list table xx 可观察到),会将10.0.0.5做snat,转化为对应的floating ip,通过fpr-xxx发送至floating ip namespace.
- Floating ip namespace 中会有通向外网的默认路由,收到报文后会经由br_int, br-ex. 最后通过连接外网的物理网卡出去
从外部网络访问虚拟机(令floating ip 为172.16.6.167)
- Floating ip namespace中设置了arp代理,因此在收到收到外网报文时会将fg-xxx端口mac响应给外部设备
- Floating ip namespace fg-xxx端口收到报文之后,对于floating ip 172.16.6.167有以下路由:
因此会将报文发送至 fpr-xxx端口。fpr-xxx 同rfp-xxx为VETH Pair, 所以报文被传递至dvr namespace
- Dvr namespace中,会对该floating ip做DNAT,映射到对应的虚拟机IP。 最终通过br-int达到instance1
参考文档
http://www.sxt.cn/u/756/blog/3168
3. 配置 & 操作
http://docs.openstack.org/liberty/networking-guide/scenario-dvr-ovs.html#example-configuration
4. 遇到问题
- Opensatck默认安全组是禁止ssh和ping的,在测试之前先添加相关策略。
5. Dvr配合lbaas使用
- 安装好,并成功启动neutron-l3-agent以及neutron-lbaas-agent服务之后,登录dashboard管理界面
- 在左侧栏选中网络,点击负载均衡
- 新建资源池,配置vip,并且绑定floating ip
- 添加成员,并指定监听端口
- 在后端虚拟机中开启http服务,通过浏览器访问
在lbaas服务器上,通过ip netns 指令可查看namespace信息
[root@compute2-twb3 ~]# ip netns
qlbaas-b674b309-e7ec-45aa-84ee-e25c2926578e
fip-f2800d8c-1ff7-4832-98d3-186bec870f25
qrouter-9b040a00-98b1-4f51-b349-d8a68ea90398
与外界通信过程,同绑定floating ip的虚拟机一样。流量不会通过网络节点!