Namespace:Openstack的网络实现,namespaceopenstack


前言:众所周知在linux系统中PID、IPC、Network等都是全局性的资源,任何的修改和删减都会对整个系统造成影响,这也是为什么kvm之类的虚拟化技术需要模拟一个完成主机系统的原因。但是,在linux namespace中这些PID、IPC、Network等都不再是全局性的资源,基于namespace的虚拟化技术是内核级别的虚拟化,具有敏捷、安全、资源轻消耗的优点。在云计算的信息化建设中,计算资源和存储资源的虚拟化已经做的非常好并具备了丰富的解决方案。但是网络的虚拟化的技术还在逐步成熟的过程中,在网络虚拟化技术中目前最主流的技术就是基于namespace网络虚拟化技术(我更觉得应该称为NFV:网络功能虚拟化)。本文意在通过对Network namespace的解析来统一的介绍一下Openstack网络实现原理,以期帮助需要的伙伴更好的理解网络虚拟化相关技术。

Linux Namespace:

Linux Namespace是Linux提供的一种OS-level virtualization的方法。目前在Linux系统上实现OS-level virtualization的系统有Linux VServer、OpenVZ、LXC Linux Container、Virtuozzo等,Linux namespace提供了PID、IPC、UTS、Mount、Network等系统资源的完全隔离机制。这种完全隔离机制的实现是靠不同namespace中的进程彼此之间是互不干扰的,即使是同样的进程只要在不同的namespace中。为了更好的理解这一点,我们略加分析一个PID例子。在所有的linux系统都一个init进程(即初始化进程),其PID=1,而由于在不同的namespace中的进程都是彼此透明的,因此在不同的namespace中都可以有自己的PID=1的init进程,相应Namespace内的孤儿进程都将以该进程为父进程,当该进程被结束时该Namespace内所有的进程都会被结束。换句话说,在同一个linux系统中由于namespace的存在,可以允许n个相同的进程存在并互不干扰的运行。

Network Namespace

一个Network Namespace为进程提供了一个完全独立的网络协议栈的视图,包括网络设备接口、IPv4和IPv6协议栈、IP路由表、防火墙规则、sockets等等。在这样的情况下,一个network namespace可以是一个交换机、也可以是一个路由器、或者是一个防火墙等,这就相当于network namespace提供了一个完全的系统环境(这也是namespace的基本特性)。在network namespace中有两个概念是实现network namespace的全部网络功能的关键,一个虚拟接口,一个是虚拟网桥。这里先概念性的说一下两条实现规则,这两个规则在后面的openstack和docker的网络实现中会具体的用到并结合实例进行解释。第一条:一个虚拟接口只能属于一个network namespace,但是可以从一个network namespace转移到另外一个network namespace中,虚拟接口都是成对出现的,发一个其中一个接口的数据另外一个接口也会接到;第二条:一个虚拟网桥可以接多个虚拟接口,且网桥能使数据在这些虚拟接口之上进行转发。

Openstack的网络实现

Openstcak从Havana版开始将其网络项目更名为neutron,从H版到最近发布的kilo版neutron的功能和组件都进行了很多的优化和改进。在openstcak的网络实现模式中,neutron+open vswitch是一种常见的网络实现模式,也有的是使用neturon+bridge模式实现的。由于最近自己研究的是neutron+open vswitch的模式,对这种模式下的network namespace实现机制理解的比较好,所以就以这种模式为例解析一下openstcak利用network namespace机制的网络实现。
1. OVS、虚拟接口(veth pair)、linux birdge:在OVS中包含bridge和ports,在一个OVS中包含两个bridge,每个bridge上包含若干个ports。OVS中一个网桥(bridge-ethx)用于连接主机的物理网卡ethx,另一个网桥(bridge-int)用于连接linux bridge和虚拟机的网络接口,而两个网桥之间是通过一对veth pair进行连接(可以理解为一根虚拟网线)。veth pair 都是成对出现的,发一个其中一个接口的数据另外一个接口也会接到。linux bridge主要是用于连接虚拟机和OVS bridge-int以及进行安全策略的设置和安全组的实现。
2. netwrok namespace:每当在neutron中创建一个虚拟网络时,neutron都会创建一个network namespace。network namespace上有两个网络接口,一个是loop设备,一个用于连接OVS上得bridge-int。从此可知,neutron创建的这个network namespace通过OVS连接到虚拟机网络中。当一个虚拟机被创建时,虚拟机上的网络接口会连接到linux bridge的接口上,同时虚拟机的网络接口会根据预配置这时network namespace 和虚拟机都连接到了OVS的bridge-int网桥上,从物理链路上就打通了。neutron在network namespace中会起dhcp服务,这样当物理链路打通后在接收到新建虚拟机的dhcp请求时就会分配一个和network namespce同网段的ip地址,这样虚拟机和network namespace连接在bridge-int上的网络接口就具备相同的vlan id,而根据OVS的网络隔离机制同一个vlan id的网络接口是可以相互转发数据的。
3. 虚拟机间的同网络通信:每新建一个虚拟机都会通过虚拟机的网络接口连接到linux bridge网桥上,通过linux birdge连接到OVS bridge-int上,最终通过OVS bridge-ethx接入到虚拟机网络中。在新建虚拟机时,我们需要预先设置好该虚拟机属于哪个网络,在虚拟机进行网络初始化时就会发送dhcp请求,相对应网络的network namespace在接收到新建虚拟机的dhcp请求时都会分配一个自己所在网络的ip地址给新建虚拟机,这样具备同样网络ip地址段的虚拟机就可以相互进行通信。在这里简要解释一个neutron的网络隔离,在neutron中通过设置可以使用vlan、vxlan、GRE等进行网络隔离。不过由于使用vlan是最符合传统网络认知的,所以我们就假定在OVS上使用的是通过vlan进行网络隔离的方式。
4. 虚拟机不同网络之间的路由通信:如前面所将,在neutron上每创建一个网络都会新建一个nework namespace,这个network namespace为新建的网络服务。那么现在假设有了两个网络,也就有了两个network namespace,但是这两个namespace是相互独立的,因为他们在不同的网络中。现在如果我们想打通这两个网络,我们就需要另外一个network namespace–router network namespace,router network namespace中可以拥有2以上的网络接口(这里就以2个接口为例)。在传统的网络环境中,我们知道如果要和一个网络想通,只要和其网关相通就可以了。在这里也是采用这样的原理,在neutron中我们可以使用命令将两个需要相互连通的网络加入到router network namespace中,这时router nerwork namespace中就会出现两个网络接口连接到OVS bridge-int上,并且这两个网络接口的ip地址就是两个网络的网关。这时我们需要在router network namespace中设置一下net.ipv4.ip_forward参数为1,这样就可以在router network namespace内部进行不同网段数据的转发了,至此两个不同网络就可以打通了。
以上就是一个openstack利用namespace进行网络实现的方法论性质的原理解析,希望可以帮助大家能够更好的理解openstack的网络实现。如果文中解析有错误和不到位的地方,还请大家能够不吝赐教。

赵英俊 2015年6月3日 于城云科技

相关内容