Namespace:Openstack的网络实现
前言:众所周知在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日 于城云科技