浅谈openstack中的nova-network

  • Post author:
  • Post category:其他


在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的地址。

# tcpdump -i br100 -vvv -nnn

tcpdump: listening on br100, link-type EN10MB (Ethernet), capture size 65535 bytes

01:01:15.270589 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 308)

0.0.0.0.68 > 255.255.255.255.67: [udp sum ok]

BOOTP/DHCP, Request

from fa:16:3e:ad:6e:7f, length 280, xid 0xf42cb507, Flags [none] (0x0000)

Client-IP 100.100.100.20

Client-Ethernet-Address fa:16:3e:ad:6e:7f

Vendor-rfc1048 Extensions

Magic Cookie 0x63825363

DHCP-Message Option 53, length 1: Request

Client-ID Option 61, length 7: ether fa:16:3e:ad:6e:7f

MSZ Option 57, length 2: 576

Parameter-Request Option 55, length 7:

Subnet-Mask, Default-Gateway, Domain-Name-Server, Hostname

Domain-Name, BR, NTP

Vendor-Class Option 60, length 12: “udhcp 1.18.5”

END Option 255, length 0

01:01:15.270906 IP (tos 0x0, ttl 64, id 45514, offset 0, flags [none], proto UDP (17), length 338)

100.100.100.4.67 > 100.100.100.20.68: [udp sum ok]

BOOTP/DHCP, Reply,

length 310, xid 0xf42cb507, Flags [none] (0x0000)

Client-IP 100.100.100.20

Your-IP 100.100.100.20

Server-IP 100.100.100.4

Client-Ethernet-Address fa:16:3e:ad:6e:7f

Vendor-rfc1048 Extensions

Magic Cookie 0x63825363

DHCP-Message Option 53, length 1: ACK

Server-ID Option 54, length 4: 100.100.100.4

Lease-Time Option 51, length 4: 120

RN Option 58, length 4: 55

RB Option 59, length 4: 100


Subnet-Mask Option 1, length 4: 255.255.255.0

BR Option 28, length 4: 100.100.100.255

Default-Gateway Option 3, length 4: 100.100.100.4

Domain-Name-Server Option 6, length 4: 100.100.100.4

Domain-Name Option 15, length 9: “novalocal”

Hostname Option 12, length 5: “matt6”


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)的数据包。之后会从fixed ip池中分配一个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防火墙的使用了。

#ip addr

17: eth0.90@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

link/ether 7c:ad:74:6f:ca:fc brd ff:ff:ff:ff:ff:ff

inet 10.224.144.134/25 brd 10.224.144.255 scope global eth0.90


inet 10.224.144.138/32 scope global eth0.90


# iptables -nvL -t nat

Chain nova-network-OUTPUT (1 references)

pkts bytes target prot opt in out source destination


0 0 DNAT all — * * 0.0.0.0/0 10.224.144.138 to:104.104.104.11


Chain nova-network-PREROUTING (1 references)

pkts bytes target prot opt in out source destination


10 684 DNAT all — * * 0.0.0.0/0 10.224.144.138 to:104.104.104.11


Chain nova-network-float-snat (1 references)

pkts bytes target prot opt in out source destination

0 0 SNAT all — * * 104.104.104.11 104.104.104.11 to:10.224.144.138


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/

Meeting视频录像,PPT下载地址:

http://www.kuaipan.cn/file/id_72287705500749802.htm



版权声明:本文为maoliping455mlp455原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。