jincm 2015-08-25
前言
前阵子听到IT圈内的朋友聊到,IaaS相关领域的软件工程师应该是当前IT产业中待遇最高的一批人。云计算作为IT基础产业,已经获得国内外IT界的高度投入。当前只要是大型的互联网公司,不论是做门户的、视频的、搜索的,还是电商的、社交的、游戏的公司都在云计算上投入巨额的人力物力,以期望占领Iaas的制高点。他们通常是以自身业务需求为起点,来部署IaaS。一旦成功部署,也可以利用IaaS来创建新的业务领域。此外,这两年因IaaS而获得风投的创业企业也颇多,他们手上有大笔的现金,不惜以重金和高股票来笼络软件人才。不过,相比于各大公司对云人才的渴求,这个市场上真正合格的IaaS软件研发工程师却非常少。主要原因大概是因为IaaS系统本身涉及的内容比较广泛,需要软件开发人员对IT领域有一定的积累。前阵子,我造访了电子科技大学,和计算机专业的大学生进行了一些交流。发现同学们对云计算技术非常感兴趣,但是对它的具体功能和原理很难准确描述。
本人从10年前开始玩虚拟化,之后由于工作和兴趣,也对云计算有了一些了解。个人感觉IaaS并没有像云一般难以琢磨和理解,并非需要很高深的计算机知识,有很多方面也是很多基本的计算机概念组成。于是在回上海的飞机上就有了要写一点关于介绍基本的IaaS概念和基础的想法。希望能帮助对IaaS感兴趣的人能够了解和进入这个领域,也希望有更多的人能加入IaaS软件的开发中来,让这个潮流技术尽快普及。
虽然IaaS并不一定需要虚拟化,但是通常来说虚拟化被认为是IaaS的基础,本篇短文将会主要介绍IaaS环境下各种资源是如何被虚拟化的。
IaaS的基本概念
IaaS (Infrastructure as aService)基础架构即服务,是云计算的一种类型,它是PaaS(Platform as a Service 平台即服务)和SaaS(softwareas a service软件即服务)的基础。IaaS软件通常用于管理大规模的物理硬件(IaaS可以管理小到一台物理主机,多到成千上万的物理服务器)并把客户所需的软硬件资源(CPU,内存,网络,存储等)以“主机”的形式提供(这里的主机可以是一台独立物理主机,但更多的情况是虚拟机,VirtualMachine, 简称VM)。
IaaS的根本目的在于计算资源的池化、统一的、智能的(如按需)管理调度。计算资源的池化,也就是把所有的资源放在一个大池子里并按照较小的单元进行管理。例如把100个1TB的硬盘放在存储池中,这个池子便有了100TB的容量,分配存储的时候,不再是以1TB这样的独立硬盘单元进行分发,而是可以分发一个较小的容量(例如10GB,具体的分配的单元可以由IaaS进行配置)。IaaS的Service,现在普遍都是以WebService的形式来提供,因为非常容易操作。
IaaS所提供的虚拟机通常都会至少包含一个可以连上网络的操作系统(如Linux,Windows)。用户通过网络可以登录并操作虚拟机并按照虚拟机的资源配置和使用时间来付费。用户在虚拟机上进行的操作就同操作一台本地刚刚安装好操作系统的电脑一样,他可以在虚拟机上安装更多的软件(如Apache,MySQL,SQL-Server,Python,GCC等等)。他还可以加载自己的程序以完成更多的功能(例如搭建一个网站,或者VPN服务器)。用户还可以灵活的按需申请存储空间。由于这些提供给用户的功能都是最基础的计算机功能,所以这种服务形式也就被形象的称为基础架构即服务。
虽然讲了IaaS的基本概念,大家对为什么需要IaaS也许还有疑问。IaaS软件提供的功能和传统的不使用IaaS软件相比,究竟有什么好处呢?我们来举一个例子,在传统方式里,当客户由于业务(开设一个社交网站)需要搭建一个小型服务器,在搭建上层服务软件之前,他还需要购买硬件和安装操作系统,这往往都需要至少一天的时间,由于直接购买硬件会导致一次性产生大量的花费,而且用户需要对软硬件提供日常的保养维护。相反,IaaS软件通常可以在分分钟就提供客户所需的全部资源,而且是按需(使用的时间和空间)收费。这不仅节省了用户的时间,还节省了客户初期的投资,也降低了客户构建服务器的门槛(很多人往往需要花费大量的时间来调查购买什么样的服务器,安装什么样的操作系统。当使用了IaaS软件后,用户可以在业务开始之初只申请配置较小的虚拟机,当业务需求提高后,再升级到更高配置的虚拟机)。此外IaaS软件还会提供全方位的安全保障,用户不必担心自己在云上的数据会因为普通的硬件故障而导致丢失。所以IaaS提供的按需服务,是一种先进的,快捷的,更经济的和更安全的软件服务形式。有了IaaS之后,PaaS和SaaS会更加容易的叠加和部署。
那么谁会使用IaaS软件呢?公有云服务提供商是IaaS概念的发明者(Amazon在2005年推出了最早的公有云AWS服务),也是目前IaaS软件商业使用的主力军。公有云服务提供商,他们拥有海量的物理服务器(数千,到数十万),大规模的网络带宽和稳定的机房环境。要管理这些海量的物理服务器,如果仅仅通过人工方式来进行是不可想象的。IaaS软件可以做到自动的通过网络来管理物理服务器的配置和运行。另外考虑到大量的客户往往只需要比较小的服务器资源,这些小资源的配置往往比单台物理服务器小很多,那么就需要通过软件的方法把单台物理服务器的资源在保证数据安全隔离的情况下分配给不同的用户使用。IaaS软件可以轻松的把一台服务器的资源划分成几个或几十个虚拟机的形式提供给客户(IaaS软件也可以把一台服务器的全部资源做成一个虚拟机;或者不采用任何虚拟化技术而直接使用物理服务器,通常这种形式被称为Baremental)。这种降低了单个客户成本的方式,扩大了客户量,也就大大提高了公有云服务提供商的营收。除了公有云提供商外,私有云和混合云是IaaS软件的主要使用者。使用私有云的企业往往是中大型的公司,他们内部有大量的服务器需要管理,这点和公有云服务商的类似,他们也需要高效的自动化IaaS软件来帮助管理这些大量的服务器。当采用了IaaS来管理私有云之后,企业的业务模式也可以发生拓展,在内部私有云超负荷的情况下(例如当节日促销活动时,客户服务的需求量可能是平时的十几甚至几十倍),可以和公有云组建混合云,这就让企业的服务能力变得无限。目前IaaS软件还没有在家庭用户中直接使用,不过未来个人云创新后,家庭用户可能可以直接使用IaaS软件的衍生产品。
目前最主流IaaS软件有亚马逊的AWS,微软的Azure和开源的OpenStack。其中前两个都是闭源的仅供内部使用,想参与开发,只能加入亚马逊或者微软了。OpenStack是目前最火的开源软件,已经有183家公司和3386名开发人员参与研发。据分析,到2018年OpenStack将会拥有33亿美元的云市场。国内超过一半的IaaS研发公司都在使用OpenStack。因为开源,OpenStack非常有利于学习和研究IaaS的基本概念。
IaaS的基本资源
IaaS把众多的物理资源进行划分和重组,提供给用户。IaaS具体管理的物理资源,可以分为三大类:计算资源(CPU加内存),存储资源和网络资源。从计算资源角度来讲,IaaS软件管理的最小的物理单元为一个物理服务器(Host)。根据需求,服务器上会被创建多个虚拟机。若干配置相同(相同的虚拟化软件Hypervisor和网络设备以及拓扑结构)的物理服务器会组成一个集群(Cluster),要求配置相同的主要原因是因为需要支持虚拟机动态迁移。通常一些集群还会组成更大规模的区域(Zone)。某些IaaS软件,还能支持由若干Zone组成的地区(Region)。集群、区域的划分会体现在对网络和存储不同配置。例如一个集群可以共享相同的网络主存储,以支持虚拟机的动态迁移。一个区域可以共享相同的网络备份存储,可用来存放共享的虚拟机镜像文件。
虚拟机和存储服务是IaaS提供服务的最基本单元。通常存储服务是和虚拟机紧密相关的,这是因为用户主要是通过虚拟机来访问IaaS的存储资源(这点和PaaS和SaaS不同)。IaaS依赖于软硬件虚拟化技术(现在主要是硬件虚拟化)在一个服务器上创建多个VM,所以虚拟化(Virtualization)常被称为是云计算的基础。所以如果要了解IaaS,我们就不得不认识一下虚拟化技术。虚拟化技术上也并不神秘,它通过时空复用的技术让资源可以被划分和共享。
IaaS的基本资源的虚拟化
CPU虚拟化
首先我们来看一下CPU是如何虚拟化的。对于当代的CPU来说,它具有极高的计算调度能力,它能在一秒钟内可以运算上千万条指令。另外,由于客户的虚拟机往往运行的并不是计算密集型的应用程序(如浏览网页,访问数据库,存储文件等等),换句话说它的程序功能可以在很短时间(毫秒级别)内计算完成,当计算完成或等待其他网络、硬盘等IO操作时,如果没有其他计算任务,CPU便会进入空闲(IDLE)状态。经过统计,通常情况我们的CPU繁忙的时间很短,例如CPU有95%的时间都处于空闲状态。如果我们让CPU在等待的时候,也能给别人提供服务,便可以让资源利用率最大化,所以CPU的虚拟化技术的本质就是以分时复用的方式,让所有的虚拟机能够共享CPU的计算能力。因为CPU运算的速度非常快,而且这种分时的单元非常的小,以至于用户完全不会察觉到自己的虚拟机是在CPU上轮流运算的,所以在宏观的世界里,这些虚拟机看起来就是在同时工作的。当然IaaS软件还需要通过一些手段保证每个虚拟机申请的CPU可以分到足够的时间片。这是一个比较简单的便于理解的对于CPU虚拟化的描述,但是CPU虚拟化内幕是非常精巧和复杂的,为了实现高效准确的CPU虚拟化能力,世界上顶尖的软硬件工程师已经为此付出超过十年的努力。
内存虚拟化
如果我们说CPU虚拟化是一个时间之旅,那么内存虚拟化就是一个空间之旅。内存是用来存放CPU要运行和计算的数据和代码。我们知道,物理内存在计算机上通常是一段以零地址开始以全部内存空间为截止地址的空间。例如4个8GB内存条组成的32GB内存,它在物理服务器上看起来就是0~32GB的空间(可以在BIOS和系统启动后看到)。内存地址就好比门牌号码,CPU在访存的时候,只要提供对应的内存地址,就可以拜访对应地址内的数据。对于每个虚拟机来说,不论它分配了512MB的内存,还是分配了4GB的内存,它通常都是认为自己的内存是从零地址开始的一段空间(至少虚拟机的用户是这样认为的)。但是实际上,它们都会被映射到物理机上不同的空间段,有的可能是从1G开头的,有的可能是从10G开头的。而且不仅仅是内存的起始地址在物理机上不同,通常连虚拟机的内存在物理机内存上的分布也不是连续的。他们可能会被映射到不同的内存区间。虚拟机管理程序(Hypervisor)负责维护虚拟机内存在物理内存上的映射。当虚拟机访问一段自己的内存空间(例如1073741824,也就是1G)的时候,会被映射到真实的物理地址(例如6442450944)。这种映射对虚拟机的操作系统来说可以是完全透明而高效的。因为一台物理机上运行了多个虚拟机,所以虚拟机管理程序需要保证,不论在任何时候,来自虚拟机A的访存请求不能到达虚拟机B的内存空间。这也就是资源的隔离。现有的虚拟机管理程序甚至支持分配的虚拟机内存空间的总和大于物理内存,这种技术叫做超分(overcommit)。KVM里面使用KSM(KernelSamePage Merging)就可以让在不同虚拟机里使用相同数据的页(例如使用相同的内核)共享一份内存来保存。这就是内存虚拟化带来的好处。
存储虚拟化
IaaS虚拟存储资源的方法和虚拟内存类似,主要也是通过把一个大的存储空间划分成多个小的存储空间分配给虚拟机使用。但是与内存虚拟化不同的是,存储虚拟化通常并不是直接发生在硬盘的寻址层面,也就是不会在具体访问硬盘驱动的时候才转化访问的地址。存储虚拟化是以文件为单位来进行资源的存储和隔离的。这个文件不是虚拟机里看到每个具体文件,而是在物理机上用于模拟虚拟机硬盘的一个超大文件,对硬盘地址的访问就是对文件的某个偏移量的访问。这点看似复杂,其实更容易理解。例如一个大小为20GB的独立文件,可以被看成是一个20GB的硬盘空间,当需要访问0地址的时候,也就是访问文件的开头,当需要访问3G这个地址的时候,也就是访问文件的3G偏移量的地方。使用这种灵活分配的方法,理论上可以让一个2TB的物理硬盘,化身身成接近100个20GB或者接近20个100GB的硬盘。需要说明的是,看似一个完整的20GB文件,它在硬盘上可能并不是连续存放的,这完全取决于虚拟机管理程序的文件系统是如何分配硬盘空间的。当然虚拟机本身并不会意识到这点,具体访问硬盘的时候,会由虚拟机管理程序的文件系统来保证访问的准确性。有些虚拟机管理程序用一个文件来模拟一个虚拟机硬盘,有些则支持多个文件合并模拟一个虚拟机硬盘。使用多个文件来模拟虚拟机硬盘的方法更加灵活,并且有利于实现硬盘快照功能。
网络虚拟化
与之前讲的CPU、内存、硬盘等物理资源相比较,计算机网络虚拟化的内容和实现要相对复杂一些。通常用户通常熟悉的计算机网络概念包含,网卡、IP地址,主机名等等。例如在一台物理机上,可能有一个或几个网卡,每个网卡在工作的时候会分配不同的IP地址,对外可能有一个或多个网络主机名。网络连接速度取决于网卡的能力以及网络接入(例如交换机)的能力。在网络上通过IP地址或者网络主机名可以连接不同的物理主机,所以在一个可以路由的网段内IP地址和主机名必须是唯一的。在每个网卡上,还有一个MAC地址,用来标识在相同网段上不同的网卡。用户通常不会注意MAC地址,因为它并不需要用户手动配置。那么什么是网络虚拟化呢?假如原本的物理机只有一个网卡,那么它有一个MAC地址,并且可以分配一个IP地址,其他机器就可以通过IP地址访问这个物理主机。当创建N个虚拟机后,每个虚拟机都需要有独立的网络配置,以便他们可以像物理机一样的处理各种网络连接。但是这个时候物理机上依然只有一个网卡,N个虚拟机通过这一个物理网卡都能进行顺畅的网络连接的过程即为网络虚拟化。
虚拟机上的网络概念和物理机一样。在一个物理机上创建多个虚拟机,就是要创建多份虚拟机的虚拟网卡,并且保证它们能够正确的联通到网络上。这是如何做到的呢?这主要是通过虚拟机管理程序在虚拟层面创建了一个虚拟的网桥(Bridge)。这个网桥就和我们我们看到的交换机一样,上面有很多“接口”可以连接不同的虚拟网卡,当然物理机的真实网卡也需要连在这个网桥上,并且设置了一种特殊的混杂模式(可以允许不论该物理网卡是否为网络包的目的地址都能通过该网卡接收或者发送)。在同一个网桥上的不同虚拟机之间进行的网络通信,只会在本网桥内发生。只有当虚拟机的网络通信的对象不在本机(比如物联网上的其他主机)上的时候,他们就会通过物理机的网卡向外进行传输。由于物理机的网卡带宽能力是固定的,所以在一个网桥上的虚拟网卡也是分时共享相同的网络带宽(如果网络包的交换之发生在本网桥内,速度不会受到物理网卡的影响)。虽然他们在自己传输的时间段内是独占全部带宽(例如1Gbps),但是同时会导致其他虚拟网卡暂时无法传输数据,以至于在宏观范围(秒)来看,虚拟机是没有办法在共享网络的时候占用全部带宽的。如果假设有4个虚拟机都在进行大规模的网络操作(例如大文件的下载和上传),那么理论上他们的实际连接速度最多就只能达到250Mbps。由于网络速度对云计算中虚拟机的能力非常重要,芯片公司也在不断推出各种针对网络连接的硬件虚拟化解决方案(例如SR-IOV,VMDq等等)。
如果物理机去上只有一个物理网卡,那么不同的虚拟机的网络都是通过同一个网卡连接出去,这是会导致网络安全问题的。例如一个虚拟机可以监听整个网络上的所有数据包,并分析截获感兴趣的别的虚拟机的网络数据。为了解决这个问题,计算机网络提供了一种叫做VLan的技术。通过对网络编辑指定的VLan编号,一个物理网卡可以拓展多达4095个独立连接能力。例如,如果原本的物理网卡为eth0,VLan1的网卡设备在操作系统就变成eth0.1,VLan1000的网卡设备就是eth0.1000,eth0.1和eth0.1000之间都无法看到对方的网络包。有了VLan的支持,在相同物理机上的虚拟机就可以分配不同的VLan编号的网络设备,从而进行了网络隔离。