春节快要过去了,这几天可以收起心思来好好总结一下过去半年中的工作,读研的第一个半年,接触了一个开源IaaS项目–OpenStack。目标是在几台服务器上搭建一个私有云,管理平台虚拟机的使用。做完一件事总结一下挺重要,首先证明你至少干过;今后如果有类似的工作可以回头再参考,好记性不如烂笔头;当然有可能最好能抛砖引玉。
我的搭建过程最初是根据一个Github上的开源项目的指导来的,由于实际需求的差异、环境硬件限制、以及自己的实践,某些细节我做出了改进。当然我的改进只适合我的需求,如果项目有异还需要做出不同的更改,希望我的工作能给新的项目一些小小的启发。

我对IaaS的了解比较有限,开始这个项目之前,我对这个领域的了解也仅仅只有作为一个Amazon Cloud用户对亚马逊云了解那么多(我在EC2上有一个VPS)。整个部署过程下来我有一种感受,要用好它真的挺不易。Linux环境需要十分了解(C/C++,make,bash),各种网络工具非常熟悉(OpenVSwitch,router table,等等),对Linux的虚拟化技术十分了解(kvm,qemu),还要懂Python,要是对Web熟悉就更好了。现在有一个词比较热门,叫做“全栈式工程师(Full Stack Engineer)”。所谓全栈式工程师就是自己一个人搞定所有前端到后端,上层到底层所有问题的超级优秀工程师。如果让一个人去搞定OpenStack部署维护等等所有事宜,这个人应该可以被称为全栈式工程师了吧,哈哈。
当然对我这种小屌丝,搞完了还是一知半解,这个系统大部分还是个黑盒子,大致明白一点工作原理,要是长期维护,恐怕还是要承受不小的压力,生产环境鬼知道会出什么问题。
有一个和OpenStack类似的开源项目,叫做“CloudStack”,虽然OpenStack受大公司支持力度非常大,但是CloudStack也获得了不小的关注度。就我的体验来说,打个买电脑的比方,CloudStack就是买品牌机,买来一个牌子的电脑,插上电源,开机,就能使用了。OpenStack就是买组装机,把大大小小的部件采购回来,自己一件一件安装,最后插上电源,开机。两个项目各有优劣,我觉得没有说谁非要战胜谁,组装机麻烦,但是技术达人就是喜欢自定义,这样的电脑更适合自己。
闲话不说了,本文及后续文章将介绍一个多节点部署案例,需要使用若干台服务器(至少一台),如果你还是新手,建议先从 All-in-One 的例子开始(OpenStack 入门指南:Ubuntu 下 All-In-One 搭建范例)。开始动手之前,首先从整体了解一下最终完成的私有云架构和网络拓扑结构。
首先看第一种部署架构,下图可以从本文末参考资料中找到。

这个架构中设计了一个控制节点和一个网络节点,计算节点图中只画了一个,但是实际上计算节点可以是任意多个,扩展的计算节点按照和画出来的那个计算节点相同的方法接入到网络。
从计算节点开始讲解。我之前还未接触过服务器,当我第一次看到这图的时候有点小惊讶,为啥有两个以太网接口 eth0,eth1 ,特意跑去实验室的机柜看,果然每台服务器都有3个网口,后来我知道,服务器上并排的两个网口是正常提供使用的,而第三个似乎是提供系统维护的,操作系统似乎检测不到,不去管它,2个就够用了。不过那时我脑子还是没转过弯,平时搞开发用的都是微机不太会去同时连两个网络,最多一有线一无线,但是实际流量只会走其中一个,服务器连接两个以太网络会是什么样子?不过我立刻联想到路由器,这是一个典型的同时接入两个网络的设备,路由器往往拥有2个IP,一个外网IP用于连接Internet和内网设备,一个内网IP可以方便管理路由器。这么一想就都说得通了,事实上“流量只会走其中一个”这句话并不正确,实际上系统会有路由表或者路由策略,流量真正怎么走是根据路由策略的,服务器可以同时经eth0和eth1发起和不同目标的连接,只要路由策略正确。
计算节点,主要作用就是实际运行虚拟机,所以框图中有Nova服务,所有运行中的虚拟机位于一个虚拟的内部网络,这个网络内部的虚拟机如何访问Internet,以及外部的主机如何访问虚拟网络内部的虚拟机,将在后面的网络节点介绍,这是通过虚拟网桥技术实现的,也就是框图中的OpenVSwitch。继续看计算节点,刚才讲到他接入两个以太网分别是管理网络eth0(10.10.10.0/24)和虚拟机配置网络eth1(10.20.20.0/24)。计算节点可以多余一个,如果要增加新的计算节点,那么新的计算节点也需要加入这两个网络。
注意:一个计算节点上可以运行多个虚拟机实例。
计算节点、网络节点、控制节点都必须加入管理网络,方便控制节点对其他节点的操纵;所有计算节点和网络节点还需要加入虚拟机配置网络,方便网络节点的路由策略可以使外部访问到虚拟机所在的虚拟网络。
注意:虽然虚拟机都是跑在计算节点上的,但是虚拟机所在的虚拟机网络和所有计算节点所在的网络不同。换句话说,若是没有适当的路由规则,计算节点甚至都无法访问跑在自己上面的虚拟机。
网络节点上运行的服务主要为Quantumn,这项服务为OpenStack私有云提供网络路由服务,网络节点只有一个。图上可以看到网络节点有三个网络接口,eth0,eth1,eth2,之前又讲到一般的服务器只有两个网络接口,那么如何处理三个接口的这个网络节点呢?注意到网络节点只运行网络服务,路由服务,所以对硬件性能要求不是非常高,包括之后的控制节点也是如此,所以网络节点可以以虚拟机的形式存在,这样需要虚拟多少个以太网接口都是没问题的。
之前提到OpenVSwitch这个软件,这是一个虚拟网桥软件,可以近似认为就是虚拟一个交换机。所以上文提到内部的虚拟机是如何被外部访问到的呢,其实可以认为虚拟出来的VM都连接到某个虚拟交换机,然后这个交换机在连接到路由器上,这样就建立虚拟机网络与外部网络的联系。事实上eth2就是提供这个用途,向外部暴露内网虚拟机。
其余两个网络接口:eth0和计算节点一样,接入控制网络,便于控制节点调度;eth1接入虚拟机配置网络,和所有计算节点连接,从而与计算节点上的虚拟机连接。
控制节点,顾名思义就是控制调度其他所有节点的,本案例中只有一个控制节点。控制节点上运行着所有服务的Server端(Nova, KeyStone, Glance, Horizon, Quantumn)。对于性能要求也不是十分高,微机或者从高性能服务器上虚拟出来的机器都能胜任。
控制节点有两个网络接口:eth0接入控制网络,调度其他节点;eth1接入外部网络,向外暴露OpenStack的API,包括Horizon服务(Horizon提供一个基于Web的控制台,在这个控制台上可以使用图形界面创建、分配、回收虚拟机等一部分控制节点提供的操作)。控制节点的eth1和网络节点的eth2一起接到一个路由器上,这个路由器需要拥有Internet访问权限。
到这里,回想上文多次提到创建的虚拟机与外部的连接,这里的外部指的是Internet吗?不是,如果没有在路由器上设置恰当的路由规则Internet上的主机是无法访问路由器内部网络的,所以外部指的是这个路由器所在的内网,图上来看控制节点是可以访问创建出来的虚拟机的,但是不是通过管理网络eth0,管理网络可以使控制节点访问计算节点,但是却无法访问计算节点上的虚拟机的,就算是计算节点自己都无法直接访问跑在它自己上的虚拟机,控制节点可以通过网络节点的eth2上的虚拟网桥访问到那些虚拟机,就是这样兜了一个圈子。至于如何使Internet上的主机访问虚拟机,后面会提到一种基于VPN的做法。
分析第一个网络拓扑的时候,还有一些没有解决的问题:比如多于两个以太网接口如何解决;Internet上的主机如何访问虚拟机等等,根据实际情况,需要对上述架构稍作修改,下图即为修改后的方案。

修改后的方案至少需要两台服务器,一台服务器用来部署计算节点,一台服务器用来部署网络节点、控制节点和VPN网关。其中网络节点、控制节点和VPN网关都是以虚拟机的形式存在的,虚拟化技术可以使用VMWare或者Virtualbox,推荐使用VMWare。网络节点增加一个网络接口eth3,桥接到物理主机的eth1,方便访问Internet,因为当eth2配置完虚拟网桥功能后就会丧失访问Internet的能力,所以要增加eth3。VPN网关的作用就是方便Internet上的主机访问云上的虚拟机,VPN网关只需要一个接口eth0即可,桥接到物理主机的eth1上。
其他部分和方案一基本相同,你可能会有疑惑,控制节点、网络节点连接虚拟机配置网络和管理网络的接口通过同一个桥,桥接到了物理主机的eth0上,物理主机的eth0又和交换机相连接,而这个交换机上的接口又连接着计算节点出来的用于连接管理网络和虚拟机配置网络的接口。也就是说交换机上同时存在着两个网络–管理网络和虚拟机配置网络,这样连接是可行的。 ##准备工作
本案例针对的 OpenStack 版本为Grizzly。
虽然只是简简单单几句话,上面这些工作还是需要花不少时间。当所有节点的操作系统准备就绪,网络接口正确连接之后,请继续阅读我的后续文章。
1.Github, OpenStack Grizzly Install Guide
(完)
Master Candidate. Student of SDU. Blogger. Web Developer. Front-end Engineer. Java Programmer. Traveler. Science Fiction Addict. Dancer. Inline Skater. More
About Me
Master Candidate. Student of SDU. Blogger. Web Developer. Front-end Engineer. Java Programmer. Traveler. Science Fiction Addict. Dancer. Inline Skater. More