分享

浅谈openstack中的nova-network

hochikong 发表于 2014-8-6 18:06:37 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 9646
本帖最后由 hochikong 于 2014-8-6 18:10 编辑
问题导读:
1.nova-network实现了什么功能?
2.floating ip 和fixed ip的区别是什么?
3.启动虚拟机的过程中,组件们是如何工作的?




在Openstack中网络是比较复杂的一个部分。在openstack目前版本中的网络组件主要使用的是neutron, 但我们将neutron使用在产线上时机还并不成熟, 目前我们产线上仍然在使用nova-network。本文将分析一下nova-network的主要作用和其实现方式。

在Openstack中,nova-network主要实现了以下一些功能,括号中是其实现时主要使用的工具:
NAT (iptables,  ip)
VLAN (ifconfig,  brctl)
DHCP Server (dnsmasq)
DNS Server (dnsmasq)
Firewall (iptables)

目前,我们在部署nova-network时采用的是multi-host的部署方式,会在每台计算节点上nova-network。这样做的好处是可扩展性比较好。当我们计算资源不足时,仅需要直接扩展即可。如果将nova-network部署在controller节点上,当我们扩展计算节点时,会增加对controller节点的网络负载。可能会引起controller节点也需要扩展。从这个方面考虑,nova-network部署在计算节点上是比较好的,可以起到网络负载分流的作用。但也有不足之处,比如计算节点其实应该尽可能的单纯,上面跑的服务越单纯越少,对于虚拟机的稳定性肯定越好。另外, nova-conductor已经将数据库访问操作从nova-compute中抽离,如果nova-network节点部署在计算节点上,那计算节点上任然会有数据库访问操作。

Whatever,综合考虑其利弊后,我们还是认为将nova-network部署在计算节点上是比较适合当前产线以及我们的应用的。

下面的图是我们lab中一个计算节点的示意图:

对这幅图简单说明如下:
在Lab中,我们目前一台计算节点使用的是一块网卡(1Gbit/s),并将admin网络和data网络分离。
eth0接口上配有IP (10.224.159.64/26),这个IP是作为管理IP使用,Openstack组件间通信使用的是这个IP。
子接口eth0.90是作为public interface使用, Openstack的虚拟机想要和外部网络通信时使用的是这个IP。(这台计算节点的默认路由会走eth0.90)
eth0作为vlan interface使用,openstack中我们使用的是vlan模式,因此创建fixed ip的vlan时,会创建在这个接口上。
可以看到图中我们有两个fixed ip的vlan,一个是vlan70,另一个是vlan71。这两个网络中各起了一台虚拟机。以vlan70中的虚拟机为例, fixed ip 192.168.70.2是真正配置在虚拟机内部的, 通过vnet1绑定到桥br70下,br70由绑定了eth0的子接口vlan70, 这样虚拟机中的数据就会传输到vlan70中。
在桥br70上会起一个dnsmasq进程,这个进程在vlan70中起到dhcp server和dns server的作用。
图中左下部分,是由nova-compute管理的,右上部分是有nova-network管理的。

上面那副图从整体上介绍了计算节点上网络部分的构成。那么下面就讲一下一般容易混淆的内容。
首先说一下floating ip 和fixed ip的区别,说这个问题前,我们可以首先抛开openstack,我们想一下一般我们在企业内pc上网是怎么做的?
首先我们可以把网络的拓扑简化成如下所示:
PC(内部网络) --> Switch --> Route --> 外部网络
我们的pc一般会得到一个内部网络的ip地址,这个地址可能是192.168.X.Y。我们通过路由器的NAT转换成外部地址后,就可以上网了。
那现在我们考虑另一种情况, 外部网络的PC想要向内部网络PC发起连接该怎么办呢? 通常情况下就会使用端口映射的方式了。我们会在路由器设置一些NAT规则将路由器上的一个公有地址映射到内部网络的ip地址。这样就可以实现外部网络中PC对内网PC发起连接了。
其实在Openstack中,fixed ip就是上述情况中的内网IP,floating ip就是路由器上设置端口映射的公有IP。
在看下面这幅图应该就可以很容易理解了:



在理解了fixed ip和floating ip的区别后,我们再来看看虚拟机启动时是怎样获取fixed ip的呢?
在虚拟机系统启动时,会发出dhcp请求,工作在brXXX上的dnsmasq会相应这些请求。可以从以下抓包中看到,虚机机会得到hostname, ip, 网关, dns server等信息。
拿到这些信息后, 虚机就会设置自己的hostname, 接口地址, 默认路由以及dns server等信息。 从抓包中可以看出, 网关和dns server就是计算节点中brXXX的地址。

  1. # tcpdump -i br100 -vvv -nnn
  2. tcpdump: listening on br100, link-type EN10MB (Ethernet), capture size 65535 bytes
  3. 01:01:15.270589 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 308)
  4.     0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Requestfrom fa:16:3e:ad:6e:7f, length 280, xid 0xf42cb507, Flags [none] (0x0000)
  5.   Client-IP 100.100.100.20
  6.   Client-Ethernet-Address fa:16:3e:ad:6e:7f
  7.   Vendor-rfc1048 Extensions
  8.     Magic Cookie 0x63825363
  9.     DHCP-Message Option 53, length 1: Request
  10.     Client-ID Option 61, length 7: ether fa:16:3e:ad:6e:7f
  11.     MSZ Option 57, length 2: 576
  12.     Parameter-Request Option 55, length 7:
  13.       Subnet-Mask, Default-Gateway, Domain-Name-Server, Hostname
  14.       Domain-Name, BR, NTP
  15.     Vendor-Class Option 60, length 12: "udhcp 1.18.5"
  16.     END Option 255, length 0
  17. 01:01:15.270906 IP (tos 0x0, ttl 64, id 45514, offset 0, flags [none], proto UDP (17), length 338)
  18.     100.100.100.4.67 > 100.100.100.20.68: [udp sum ok] BOOTP/DHCP, Reply, length 310, xid 0xf42cb507, Flags [none] (0x0000)
  19.   Client-IP 100.100.100.20
  20.   Your-IP 100.100.100.20
  21.   Server-IP 100.100.100.4
  22.   Client-Ethernet-Address fa:16:3e:ad:6e:7f
  23.   Vendor-rfc1048 Extensions
  24.     Magic Cookie 0x63825363
  25.     DHCP-Message Option 53, length 1: ACK
  26.     Server-ID Option 54, length 4: 100.100.100.4
  27.     Lease-Time Option 51, length 4: 120
  28.     RN Option 58, length 4: 55
  29.     RB Option 59, length 4: 100
  30.     Subnet-Mask Option 1, length 4: 255.255.255.0
  31.     BR Option 28, length 4: 100.100.100.255
  32.     Default-Gateway Option 3, length 4: 100.100.100.4
  33.     Domain-Name-Server Option 6, length 4: 100.100.100.4
  34.     Domain-Name Option 15, length 9: "novalocal"
  35.     Hostname Option 12, length 5: "matt6"
  36.     END Option 255, length 0
复制代码

现在我们再来看一下,当一个虚拟机启动时大概会发生什么事情:


当我们使用nova boot启动虚机时,首先scheduler选定一个有足够资源的计算节点,然后通过MQ消息发送给这台计算节点的nova-compute,之后nova-compute会做一系列的动作,其中有一步就是使用MQ消息发给nova-network通知"我要在计算节点上启动一个虚机,请帮我配置好计算节点的网络"。nova-network收到消息后就会开始配置网络了,首先看下这台虚机是属于哪个网络的,以上图为例,他是属于vlan70这个网络的,那nova-network就会检查这台计算节点上有没有已经配置了br70,有没有vlan70?如果没有就配置上这个vlan,然后检查dnsmasq启动过了吗?如果没有,就需要向防火墙中添加dhcp/dns端口的过滤规则,图中防火墙规则的意思就是接收端口为67(dhcp)和53(dns)的数据包。之后会从fixedip池中分配一个IP给这台虚机,并将IP,hostname等信息写在dnsmasq的配置文件中,重启dnsmaq。这样nova-network的网络就大致配置好了。nova-compute在知道网络准备好后,就会继续启动虚机,在启动虚机的最后阶段在host主机的防火墙中为虚机配置Security Group中定义的访问控制规则,这样虚机就启动好了。

在启动虚机之后,我们可能还会像为这个虚机配置floating ip, 这时会发生什么呢?
其实floating IP的配置非常简单,其实所谓的floating ip无非是端口映射而已,而目前在openstack中实现方式是使用NAT来实现的。问题就变成了如何用iptables/netfilter框架来实现端口映射。
答案就是两条DNAT规则+一条SNAT规则,另外在接口上配置一个ip用来相应ARP请求,此处如果不明白的话就需要看下iptables防火墙的使用了。
  1. #ip addr
  2. 17: eth0.90@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
  3. link/ether 7c:ad:74:6f:ca:fc brd ff:ff:ff:ff:ff:ff
  4. inet 10.224.144.134/25 brd 10.224.144.255 scope global eth0.90
  5. inet 10.224.144.138/32 scope global eth0.90
  6. # iptables -nvL -t nat
  7. Chain nova-network-OUTPUT (1 references)
  8. pkts bytes target prot opt in out source destination
  9. 0 0 DNAT all -- * * 0.0.0.0/0 10.224.144.138 to:104.104.104.11
  10. Chain nova-network-PREROUTING (1 references)
  11. pkts bytes target prot opt in out source destination
  12. 10 684 DNAT all -- * * 0.0.0.0/0 10.224.144.138 to:104.104.104.11
  13. Chain nova-network-float-snat (1 references)
  14. pkts bytes target prot opt in out source destination
  15. 0 0 SNAT all -- * * 104.104.104.11 104.104.104.11 to:10.224.144.138
  16. 0 0 SNAT all -- * eth0.90 104.104.104.11 0.0.0.0/0 to:10.224.144.138
复制代码

在这之后,我们可能会想去了解虚机之间,虚机与外部通信时,数据流是怎走的呢?
mirantis的大神早在去年就分析过了,在此不再累述,强烈推荐参考一下blog:
http://www.mirantis.com/blog/vlanmanager-network-flow-analysis/



###########################################################
本文转自:http://blog.csdn.net/matt_mao/article/details/16918483


欢迎加入about云群9037177932227315139327136 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

已有(1)人评论

跳转到指定楼层
Riordon 发表于 2014-8-7 08:38:35
赞,每天进步一点点...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条