【编者按】Neutron是OpenStac环境的核心组件之一,了解Neutron的功能和部署方式,是企业OpenStack系统的规划、部署和运维需要修炼的内功。在本文中,Neutron“大师兄”龚永生为我们详细介绍了Neutron的技术原理和发展方向,主要涉及使用、部署和运维三个层面的内容。
一、Neutron功能介绍
作为OpenStack网络模块,Neutron是分布式的OpenStack Iaas环境核心组件之一。Neutron,或者是Neutron的前身,是为了在分布式环境下面给虚拟机提供网卡,这是它的最基本的要求。此外,Neutron还要虚拟化网络功能的其它元件,比如抽象交换机,抽象负载均衡器,抽象防火墙,抽象NAT。Neutron这个团队是先做API,做模型,先把API画下来,达成比较一致的时候才能往下实现,实现数据库和相关agent等其他的东西。Agent一般会是Linux里面的相关技术来完成。
有了网络元件的虚拟化之后Neutron还要完成把这些虚拟网络元件连起来。大家分散在这儿能干嘛,什么东西都不能干。这是Neutron要干的事情,而且这个在以后会大量的占用Neutron社区人员的工作。
对Neutron来说,图1-1所示
图1-1
我们先看的是虚拟化网络组件,网络端口,ACL,或者是交换机,或者是路由器等等,再是它们之间的互联形成的虚拟网络拓扑,这是最终用户或者是我们在虚拟化看到的景象。在物理层看到外部网络,物理机,交换机,路由器,连接各种网络的网线等。虚拟化网络最终还是要通过物理层面承载,所以我们部署的时候必须要掌握物理之间它们怎么互联,物理网络方面必须快速,稳定。这样我们在Neutron构建虚拟化的网络拓扑的时候才能有一个可靠的承载手段。
总的来说,Neutron要做的事情包括:虚拟化网卡,虚拟化各种网络部件,在虚拟化元件之间互联,把虚拟化和物理网络上打通,这样虚拟化的东西才能走。
二、Neutron体系结构
Neutron主要是用来做模型的,如图1-2所示
图1-2
Neutron这个TEAM的首要工作是定义API,API的核心是它的数据模型。端口在数据模型中占有重要位置。端口首要是作为虚拟机的网卡,然后是路由器端口,端口上面还绑安全组,形成规则来提供端口的访问控制。端口是绑在每个网络上面的,网络能给端口跟别的网络上的端口提供隔离。端口的IP地址从子网来获取。浮动IP是在公网上可以访问的一个IP,在绑定到某个端口之后,这个端口就可以从外界访问了。除了上图显示的一些模型外,防火墙、负载均衡器等都是Neutron模型的一部分。
Neutron的功能组件里头,Neutron Server用来绑定所有的模型。它通过消息队列和所有的agent进行通信,后者真正地把网络模型物理落地。Neutron Server保存的是虚拟网络TOP的模型,今后的版本要把Neutron Server劈开,一半来实现API,另一半和agents进行交互。
网络,端口,子网模型由核心API实现,另外一些API通过扩展实现。如图1-3所示
图1-3
整个OpenStack是插件式,Neutron Server也是如此。Neutron中有核心插件和服务插件的区分,这有社区的实现,也有各个厂商的实现。
部署OpenStack先要定义这些网络:管理网络,数据网络,存储网络,公有网络,甚至内部网络。不管是Nova API,还是Neutron Server,都在控制节点上部署。如图1-4,图1-5和图1-6所示。提供三层网络服务的我们称之为网络节点,防火墙,路由器和DHCP agent等等都在网络节点上。你要访问虚拟机,你要是公有网。我们看部署方案二,它把计算和存储合二为一。因为计算节点服务器可能有很多槽,这些槽不要浪费了,做一个分布式存储,这样把存储节点合并起来,但是网络节点还在这儿。为什么把网络节点分开?网络节点还是有它的好处,网络安全等等是有特殊性要求,在这上面单独部署还是挺好。方案三中进一步把网络节点上的功能也并入到计算节点上,这种部署方案可以简化云计算方案中的硬件规范,但是需要做好隔离,这样网络、存储和计算不会互相竞争CPU,内存和IO资源。
图1-4
图1-5
图1-6
三、Neutron的管理员特权
在Neutron中有两种角色,一个角色是管理员,另一个角色是普通用户。
由图1-3 Neutron的层次图来看,上面是API,有核心API和扩展API。命令neutron ext-list可以看到这个系统有哪些扩展,每个扩展大概是什么意思。因为有了扩展才会有相应的功能。还有超级管理员比较常见的就是neutron agent list,这个命令很关键。还有网络绑定,也只有管理员才能看见,如图1-7所示
图1-7
图1-7上标注部分只能管理员看到,用户看不到。网络绑定是指虚拟网络在物理网络上面是什么类型。一般的支持五种网络类型,Gre,vxlan,vlan,flat,local。Physical_network对于vlan,flat类型,指定桥接的bridge。创建一个虚拟网络,这些字段系统会给普通住户填写,但是如果想创建成某个类型,创建到某个物理网络上面去,管理员是有特权的。用这个特权我们看看创建外部网络和子网。如图1-8所示
图1-8
我们在部署完一个云之后,管理员上去的第一个任务就是创建它的外部网络,网络类型是local。管理员还要从网络部门拿到一部分的IP地址段和网关,再来创建外部网络子网。
四、Neutron的普通用户工作流程
普通用户的工作流程大概有7步。如图1-9,图1-10和图1-11所示
图1-9
图1-10
图1-11
我们脑袋里面有这个图,对运维来说很关键。我们就知道大概在物理世界会产生什么问题,会起到什么效果。第一步是创建虚拟网络,Neutron会把它绑定到某个隧道,第二步是创造子网,指定IP地址段、网关,这时在物理上就会有DHCP服务器起来。第三个创建路由器,系统就会把它绑定到某个节点。第四步就是把这个路由器和子网连起来,这个虚拟路由器就有一个端口会连到虚拟网络,第五步是设置路由器的外部网关,这时网络节点上就有一个虚拟设备把虚拟路由器和外部网络连接起来。第六步就是做安全规则,第七步就是利用安全组和子网创建虚拟机。整个链条如果很熟悉,排除故障就很简单。
五、Neutron运维
运维人员很多时候是必须要有管理权限,管理人员就是运维。如果我们定义清楚,也可以定义出自己的角色来,把Neutron的角色分工细分一下。下面我们介绍几个在运维中常出现的问题和排错手段。
1. 节点down了,如图1-12所示
图1-12
刚刚部署完了,一看上去全部是down掉了,down掉了怎么办?我要查整个部署。一查没有部署这个没有部署那个,这时日志很关键。所以在部署的时候要统一日志收集,你在上面就可以看到各种日志。看Rabbitmq,文件句柄太少了,或者是硬盘太小了,都会影响到rabbitmq接受agent的连接。还有检查Server,看Neutron Server是不是出问题了。最后就是不要出现时间不同步的问题。
2. floatingip不通,如图1-13所示
图1-13
先看看VM是否分配到了固定IP, 是否能通到VM网络的网关。再查询它的安全组规则,看看是否阻止了某种网络流量。再看看这个IP所在的ROUTER是什么,再看看router所在的网络节点,进入这个路由器所在的名字空间,察看floatingip是否存在。软件方面有时候重启也是能解决问题的。
3. L3节点错误,如图1-14所示
图1-14
L3出错了怎么办?这时可能需要迁移。首先我们把这个L3 agent设为down,down完之后看看这个节点上所有的router。 接着把所有router的管理状态设为down, 然后又设为up, 这时系统就会重新绑定router到其它网络节点。这个过程很复杂,人工去做会影响比较长的时间。现在很多友商用监控,如果L3 agent出错, 启动自动脚本进行迁移。 在Kilo版中, HA router也是一个不错的选择。
4. 还有一个端口绑定失败,如图1-15所示
图1-15
这是经常遇到的一个问题。在我的产品中,如果出现绑定失败,就直接抛出错误,这样问题就会第一时间暴露出来。如果不这样做,直接把“binding_failure”写在数据库里面,虚拟机就拿不到IP。怎么解决呢?在Neutron里面只要把这个host_id先置一下,再置回去,这时候能让Neutron agent重新绑定端口,设置正确的TAG.
5. 要注意TAG 4095端口,如图1-16所示
图1-16
我们确认port不在Neutron Server中,然后删除ovs port。如果在Neutron Server中有,就要重新改一下,让它的binding重新做。
做OpenStack运维,整个网络流程是必须掌握的。我们看Neutron链路分析,如图1-17所示
图1-17
有观点说,对虚拟机的启动过程进行详细分析后就掌握一半的OpenStack,我认为,把上图分析透了就掌握一半以上的Neutron。
在运维方面,我一直在想能不能有像一个机器人一样的东西。有个知识库,发现问题报告出来,甚至能自动修复,这也是我经常做梦想实现的。其实网络方面还有很深的水,这里只是讲了一部分。SDN,NFV或者是DVDK,都是有意思的东西。(责编/周建丁)
作者简介:龚永生,九州云架构师。多年Linux系统开发,J2EE产品和云计算相关技术研发经验。目前活跃在OpenStack社区的各个项目上,主要技术方向是虚拟网络项目Neutron,是Neutron项目早期的主要贡献者之一。