《深入理解OpenStack Neutron》基础学习
参考:
https://read.douban.com/ebook/45214941/
https://blog.51cto.com/arkling/2289431
https://blog.csdn.net/chengqiuming/article/details/80369680
https://www.jianshu.com/p/78f252e4c08f
https://www.jianshu.com/p/55addeaee178
前言:
Linux虚拟网络既是构建Neutron网络的基础,也是构建Neutron代码的基础。Neutron的代码写到最后,不过是调用Linux的命令行而已(也包括调用OVS的命令行)。调用命令行只是Neutron代码的最后一步,在这之前Neutron还需要知道调用什么命令行。这涉及到能否正确分配逻辑资源问题。Neutron不仅需要具备分配逻辑资源的机制,还需要创建相应的虚拟网元,并将这些虚拟网元正确地连接和配置,构建成正确的网络。Neutron所能支持的二、三层网络特性,不仅体现在它的代码中,也体现在它的资源模型中,并且以RESTful接口的形式对外提供服务。
第一章 Neutron概述
1.2 Neutron的特性与应用
当前支持的特性如下。
特性 |
备注 |
Networks |
支持的网络类型有: Local,Flat,VLAN,VXLAN,GRE,Geneve |
Subnets |
|
Ports |
|
Routers |
支持路由转发,SNAT,DNAT,外部网关等功能 |
Security Groups |
|
External Networks |
支持Floating IP和安全组 |
DVR |
Distributed Virtual Routers |
L3 High Availability |
支持虚拟路由冗余协议 |
Quality of Service |
|
Border Gateway Protocol |
支持BGP、MPLS VPN |
DNS |
|
Turnk Ports |
支持VLAN aware VM |
Metering |
L3路由级路由度量 |
Routed Provider |
将多段3层封装为一个网络实体 |
1.2.1 基于OpenStack的应用
基于OpenStack的应用,就是原生的云应用,Neutron作为OpenStack中的网络部件,为用户提供网络服务。
1.2.2 基于SDN的应用
所有的SDN控制器都是挂接在Neutron之下的。这不仅因为业界期望Neutron能够成为统一的北向接口,也是源于Neutron的可扩展能力。
第二章 Linux虚拟网络基础
2.1 tap
tap从功能定位上来讲,位于数据链路层,数据链路层的主要协议有:
点对点协议(point-to-point Protocol)
以太网(Ethernet)
高级数据链路协议(High-Level Link Protocol)
帧中继(Frame Relay)
异步传输模式(Asynchronous Rransfer Mode)
但在这些以太网协议中tap只与以太网(Ethernet)协议对应。所以,tap有时也被称为“虚拟以太网设备”。
#创建一个tap设备 tunctl -t tap_test #查看 ip link list 或者 ifconfig -a #绑定IP地址 ip addr add local 192.168.100.1/24 dev tap_test #或者 ifconfig tap_test 192.168.100.1/24 |
2.2 namespace
Linux namespace 隔离的资源
资源 |
含义 |
uts_ns |
UTS为Unix Timesharing System的简称,包含内存名称、版本、底层体系结构等信息 |
ipc_ns |
所有与进程间通信(IPC)有关的信息 |
mnt_ns |
当前装载的文件系统 |
pid_ns |
有关进程ID的信息 |
user_ns |
资源配额的信息 |
net_ns |
网络信息 |
#查看 ip netns list #创建 ip netns add ns_test #将上面的虚拟设备迁移到namsspace里面 ip link set tap_test netns ns_test #查看或者操作namespace里面的设备 # ip [-all] netns exec [NAME] cmd #绑定IP ip netns exec ns_test ifconfig tap_test 192.168.100.1/24 up ip netns exec ns_test ifconfig tap_test ifconfig -a |
2.3 veth pair
veth pair不是一个设备,而是一对设备,以连接两个虚拟以太网端口。操作veth pair要和namespace配合使用。
#创建veth_pair ip link add tap1 type veth peer name tap1_peer ip link add tap2 type veth peer name tap2_peer ip link add tap3 type veth peer name tap3_peer ip link add tap4 type veth peer name tap4_peer #创建ns ip netns add ns1 ip netns add ns2 ip netns add ns3 ip netns add ns4 #把tap移动到对应的ns中 ip link set tap1 netns ns1 ip link set tap2 netns ns2 ip link set tap3 netns ns3 ip link set tap4 netns ns4 #创建bridge brctl addbr br1 #把tap peer添加到对应的bridge中 brctl addif br1 tap1_peer brctl addif br1 tap2_peer brctl addif br1 tap3_peer brctl addif br1 tap4_peer #配置对应tap的IP地址 ip netns exec ns1 ip addr add 192.168.10.1/24 dev tap1 ip netns exec ns2 ip addr add 192.168.10.2/24 dev tap2 ip netns exec ns3 ip addr add 192.168.10.3/24 dev tap3 ip netns exec ns4 ip addr add 192.168.10.4/24 dev tap4 #将bridge和所有tap设备up ip link set br1 up ip link set tap2_peer up ip link set tap2_peer up ip link set tap3_peer up ip link set tap4_peer up ip netns exec ns1 ip link set tap1 up ip netns exec ns2 ip link set tap2 up ip netns exec ns3 ip link set tap3 up ip netns exec ns4 ip link set tap4 up |
2.4 Bridge
brctl show brctl addbr <br> brctl delbr <br> brctl addif <br> <device> ... |
2.5 Router
#查看转发功能是否打开 less /proc/sys/net/ipv4/ip_forward #打开 echo "1" > /proc/sys/net/ipv4/ip_forward |
2.6 tun
Linux一共原生支持5中三层隧道。ipip/gre/sit(Ipv6 over IPv4)等。
#在ns1上创建tun1 和ipip tunnel ip netns exec ns1 ip tunnel add tun1 mode ipip remote 192.168.200.2 local 192.168.100.2 ttl 255 ip netns exec ns1 ip link set tun1 up ip netns exec ns1 ip addr add 192.168.50.10 peer 192.168.60.10 dev tun1 #在ns2上创建tun2 和ipip tunnel ip netns exec ns2 ip tunnel add tun2 mode ipip remote 192.168.100.2 local 192.168.200.2 ttl 255 ip netns exec ns2 ip link set tun2 up ip netns exec ns2 ip addr add 192.168.60.10 peer 192.168.50.10 dev tun2 |
第三章 Neutron的网络实现模型
3.1 总览
从部署角度来说,Neutron分为三类节点:控制节点、计算节点、网络节点。网络节点和计算节点为VM构建了具体的网络,控制节点则对这些网络进行管理。Neutron的实现模型如下图所示。
控制节点的Neutron进程和网络节点、计算节点的各个Agent进程互相配合(RPC通信),对内完成对网络节点、计算节点中虚拟网元的配置管理,对外提供RESTful等服务接口。
计算节点中的各个Bridge构建了Neutron中的Local、flat、VLAN,GRE,VXLAN等二层网络。
br-ethx与br-tun对外构建用户网络,对内则为br-int屏蔽用户网络的各种差异,将不同类型的用户网络统统转换为VLAN网络。
网络节点为Neutron提供了其他网络服务,比如DHCP等。网络节点中Router,则提供三层服务,除了普通的路由转发外,还提供SNAT/DNAT等功能。
3.2 计算节点的实现模型
一个基于OpenStack的云系统会有很多计算节点,一个计算节点就是一个Host。计算节点里充满了VM,但是VM之间需要通信。二层需要Bridge,三层需要Router。
下面以VXLAN为例,VLAN及GRE模型均类似。
3.2.1 VXLAN模型为例
VXLAN的实现模型与VLAN的实现模型非常相像。
从表面来看,VXLAN与VLAN的实现模型相比,仅仅一个差别:VLAN中对应的br-ethx,而VXLAN中对应的是br-tun(br-tun是一个混合单词的缩写:Bridge-Tunnel。此时的Tunnel是VXLAN Tunnel)。
其实,br-ethx是一个OVS,br-tun也是一个OVS。所有说,两者的差别不是实现组件的差别,而是组件所执行功能的差别。br-ethx所执行的一个普通二层交换机的功能,br-tun所执行的是VXLAN中VTEP的功能,上图中两个tun所对应的接口IP分时标识为10.0.100.88和10.0.100.77,这两个IP就是VXLAN的隧道终结点IP。
VXLAN与VLAN一样也存在内外VID的转换。通过VXLAN,就可以明白Neutron为什么要做内外VID的转换。
上图把br-tun一分为二,设想为两部分:上层是VTEP,对VXLAN隧道进行了终结;下层是一个普通的VLAN Bridge。所以,对于Host来说,它有两层网络,虚线以上是VXLAN网络,虚线以下是VLAN网络。如此一来,VXLAN内外VID的转换则变成了不得不做的工作,因为它不仅仅是表面上看起的那样,仅仅是VID数值的转变,而且背后蕴含着网络类型的转变。
VLAN类型的网络并不存在VXLAN这样的问题。当Host遇到VLAN时,它并不会变成两重网络,可为什么要做内外VID的转换呢?这主要是为了避免内部VLAN ID的冲突。内部VLAN ID是体现在br-int上的,而一个Host内装有1个br-int,也就是说VLAN和VXLAN是共用一个br-int.假如VLAN网络不做内外VID的转换,则很可能引发br-int上的内部VLAN ID冲突,如下表。
网络类型 |
用户视角(外部VID) |
Host视角(内部VLAN) |
备注 |
VLAN |
100(VLAN) |
100(VLAN) |
假设内外VID不做转换 |
VXLAN |
1000(VNI) |
100(VLAN) |
内部VLAN 冲突 |
VXLAN做内外VID转换时,并不知道VLAN的外部VID是什么,所以它就根据自己的算法将内部VID转换为100,结果很不辛,与VLAN网络的外部VID相等。因为VLAN的内部VID没有做转换,仍然等于外部VID,所以两者在br-int上产生了冲突。正是这个原因,所以VLAN类型的网络,也要做内外VID的转换,而且所有的网络类型都需要做VID的转换。这样的话Neutron就能统一掌控,从而避免内部VID的冲突。
VXLAN的转换过程如下:
1 出报文的VID转换过程:
2 入报文VID转换过程如下:
3.2.2计算节点的实现网络模型小结
计算节点一共分为两层:用户网络层、本地网络层。
(1)用户网络层,是指OpenStack的用户创建的网络,即外部网络(相对于Host内部网络而言)。用户网络层对应的Bridge是br-ethx(对应Flat,VLAN等非隧道二层网络)或者br-tun(对应VXLAN,GRE等隧道型三层网络),载体一般都是OVS。用户网络层的功能是将用户网络和本地网络(Host内部的本地网络)进行相互转换,比如VID转换,VXLAN封装与解封装等。用户网络层是对本地网络层的一个屏蔽,即不管用户网络采用什么技术(比如VLAN、VXLAN、GRE等),本地网络都仅用VLAN技术。
(2)本地网络层,是指Host内部的本地网络。本地网络层也分为两层,一个是qbr(载体为Linux Bridge),它仅仅是负责安全,称为安全层。br-int的实现载体一般为OVS,它负责内部交互,称为为Bridge层。
3.3 网络节点的实现模型
Neutron的网络节点的实现模型,如图所示。从网络视角,网络节点分为4层:用户网络层、本地网络层、网络服务层、外部网络层。前两层和计算节点类似。
(1)网络服务层,为计算节点的VM提供网络服务,比如DHCP、Router Service,且可以利用多个namespace,在每个namespace中开启DHCP和Router。
(2)外部服务层。外部服务层包含br-ex,严格来说还包含的Router,毕竟Router才是连接外部的主体,而br-ex不过是将Router对接到网络节点的物理网络。