openstack学习之白话Openstack


Openstack是一个IaaS的开源实现。IaaS的核心是虚拟化,而虚拟化功能是由各种各样的虚拟化软件实现。常用的虚拟化软件有:Linux平台的Xen,qemu; Windows平台上的Oracle VirtualBox, VMWare Player(免费非商业用途产品,还有其他的付V费商用版,Workstation等)。本文就来比较一下Openstack和这些虚拟化软件有什么不同。不了解虚拟化软件的同学,可以尝试VirtualBox,因为它免费,易用。不同的解虚拟化软件其提供的功能基本相似。

从本质上说,Openstack就是在这些虚拟化软件上做了两件事:一是自动化某些功能,二是功能扩展。从以下几方面描述:
虚拟机管理
包括创建、删除、启动、关闭等。openstack nova项目实现虚拟机管理功能。Openstack和虚拟化软件差别不大,Openstack功能都是通过调用虚拟化软件接口来实现。

libvirt:
libvirt是由Redhat定义开发的一套虚拟机管理标准接口,支持Xen,qeum,vmware esxi等产品(hypervisor)。

操作界面
每个虚拟化软件都提供的自己操作界面,基本是命令行(Command Line Interface, CLI,多在Linux上提供)或是图形界面(GUI,多在Windows上提供)。

Openstack提供了两种界面CLI和GUI。CLI由各个pythonclient(python-cinderclient,python-novaclient,python-neutronclient等)项目实现;GUI采用基于网页的方式,由Horizon项目实现。

Openstack还提供了基于Rest的对外接口,上述的两种界面实现就是用了这个Rest接口。Openstack有详细的官方文档描述这些Rest API。

Openstack的优势是提供了统一的操作界面,即使底层采用的是不同的虚拟化产品,但对外的操作界面还是一直的。

镜像管理
镜像一般指虚拟磁盘镜像(Virtual disk image)。虚拟磁盘是被虚拟机使用的磁盘设备,对虚拟机来说这个磁盘s和物理机使用的物理磁盘没有区别。都是一个提供基于块(block)存储模型的存储设备。虚拟机软件一般以操作系统文件来实现一个虚拟磁盘。虚拟磁盘的实现技术和虚拟软件相关,各不相同。这就产生了不同的虚拟磁盘格式(virtual disk format,即虚拟机如何在操作系统文件上保存虚拟磁盘的内容),主流的虚拟磁盘格式有qcow2(qemu的格式),VDI(virtualbox的格式),VMDK(vmware虚拟产品的格式),VHD(微软虚拟产品格式)。每种格式可能在支持的功能,性能,使用场景上有所不同。当前的虚拟化软件一般会支持多种虚拟磁盘格式,如virtualbox支持VDI,VMDK及VHD。还有一种raw格式,及将磁盘中的内容逐位拷贝到文件上,这种格式最简单,缺点就是不能提供某些高级功能。


磁盘镜像常用高级功能:
容量按需动态扩展:比如创建1个20G的虚拟磁盘,实现文件的大小可以只有几M。当后面写入虚拟磁盘的数据逐渐增加时,实现文件可以自动调整尺寸。
创建磁盘快照(snapshot):制作一个当前虚拟磁盘的拷贝(包含了磁盘上的所有数据),后面可以随时恢复到某个特定的快照。这个功能类似于还原点(check point)

磁盘磁盘镜像就是虚拟磁盘的一份拷贝(copy),可以保存在文件系统中,数据库中或是基于键值(key-value)模型的存储系统中,如amazon S3, openstack swfit等。

磁盘磁盘镜像的内容就是虚拟磁盘中的内容:可以是
1)不包含任何数据,空白磁盘。
2)包含了操作系统,可以用来启动一台虚拟机。
3)包含数据,但不包含操作系统。这种磁盘镜像不能用来启动虚拟机,但可以添加(attach)到一台运行的虚拟机上,通过这台虚拟机即可使用该磁盘上的数据。

一般虚拟化软件只能在某个虚拟机中运行一个虚拟磁盘镜像,并不提供虚拟磁盘镜像的管理。Openstack的glance项目及提供了虚拟磁盘镜像的管理。glance中的 虚拟磁盘镜像内容都是属于第二种,及包含了操作系统的磁盘镜像。1)3)种类的磁盘镜像保存在openstack cinder中。
镜像管理的主要功能:镜像的增加,删除,查找及修改(CRUD)等。openstack还提供了一些用来定制磁盘镜像内容的工具。
glance中会存储这些镜像,glance提供了多种方式来存储这些镜像(本地文件系统,swift,SAN storage等),具体可以参考openstack配置文档。

虚拟机创建与glance
在openstack中创建一台虚拟机需要指定image id,通过这个image id就可以找到glance中存储的实际虚拟磁盘镜像。一般来说每个虚拟机会在本地创建一份镜像的拷贝,然后使用这份本地拷贝来运行虚拟机。(实际上如果这个镜像支持snapshot,每个计算节点上只会有一份镜像的拷贝,节点上的所有虚拟机都会在这份拷贝上创建一个snapshot并用这个snapshot运行虚拟机)

openstack中有一个概念叫empheral storage(临时存储设备),其实就是这种虚拟磁盘镜像的本地拷贝。虚拟机运行时,这个拷贝就是该虚拟机的boot设备(加载操作系统的磁盘),对该磁盘的修改只会保存在本地拷贝中(不会同步到glance中的原始磁盘镜像中)。在销毁虚拟机后,该拷贝会被删除,对其上的修改也就消失了。所以这种设备叫做empheral storage,和虚拟机的生命周期一致,虚拟机不在了,它也就不在了。如果在虚拟机中保存数据(如数据库系统),一定要保存在另外的存储设备上,如cinder中提供的block storage,它的生命周期是独立于虚拟机的。


块级(block)存储管理
openstack cinder项目提供了基于block的存储设备,cinder中的最小管理单元叫做volume(卷)。每个volume其实就是一块磁盘,可以被添加到任意虚拟机中。虚拟软件中也可以给一个虚拟机增加磁盘,但不提供最这些磁盘的统一管理。

volume管理的主要功能:volume的增加,删除,attach(加入磁盘到虚拟),deatch(从虚拟删除磁盘), resize(调整磁盘大小)等。

volume中的内容:
1)不包含任何数据,空白磁盘。新创建的volume就是这种
2)包含了操作系统,可以用来启动一台虚拟机。openstack可以创建含有操作系统的volume(bootable volume)。这种类型的volume可以用来启动虚拟机,对其上的数据修改也可以持久保存,这个 不同于基于glance image启动的虚拟机(ephmeral storage)
3)包含数据,但不包含操作系统。新创建的volume经过使用后。

cinder volume上保存的数据是独立于虚拟机的。一个volume可以被添加到不同的虚拟机中(非同时)。cinder volume的概念类似于传统SAN storage的LUN.

cinder volume的主要作用是可以实现虚拟机的动态迁移(live migration)。
动态迁移是将一个计算节点上的一台虚拟器转移到另一个计算节点上运行。通常实现是在另一个计算节点上启动一个虚拟机,将之前虚拟机上的磁盘设备加到该新虚拟机上,既可实现磁盘设备的迁移。当然虚拟机迁移还涉及到其他设备状态的迁移(如内存中的内容,网络的状态,操作系统的状态等)

使用volume也可以保证数据安全。如本地硬盘损坏,并不会影响volume上的数据。数据通常是用户最重要的资产。

volume内容的存储方式:
cinder通过driver的方式可以支持多种存储方式(及将volume中的实际内容存储到哪里,以什么形式存储等)。cinder中主要存储方式是SAN(storage area network),支持不同的SAN协议:ISCSI,FibreChannel(FCoE不确定是否已经支持)
除了传统的SAN,cinder还可以使用其他存储方式:NFS,AoE(ATA over Ethernet),glusterfs,SheepDog等。

cinder支持的存储方式种类繁多,每种方式都有自己的特点及使用场景。在选型的时候需要根据自己的需要、业务特点来选型。

键值(key-value)存储
openstack swift提供了基于键值模型的存储系统,这个系统实现了类似amazon S3的功能。这个功能是虚拟化软件没有的,也不需要虚拟化软件的支持。


网络管理
这里的网络指虚拟网络。虚拟网络,同虚拟机一样,开始并不存在,要经过创建后,才存在。虚拟网络主要是用来连接虚拟机。虚拟机可以分布在不同的计算节点上,虚拟网络要能够连接分布在不同计算节点上的虚拟机。

虚拟化软件本身提供了对网络的支持,以virtualbox为例,支持如下网络拓扑:
NAT,network address translation
bridge模式
host only
internal
虚拟化软件中提供的网络模型是比较简单的,很难支持很多复杂的网络拓扑结构。openstack的网络功能则要强大的多。

openstack neutron项目用来提供虚拟网络功能。neutron中的网络主要有:
1)物理网络
虚拟网络底层需要物理网络来实现,就像虚拟机最终由物理CPU还执行一样。一台物理机器通过多块网卡可以接入多个物理网络。

2)虚拟网络
虚拟网络由openstack管理员(admin)或用户(user)建立,用来实现不同的网络拓扑结构。

provider虚拟网络
虚拟网络的一种,通常由openstack admin建立。与系统中的物理网络对应,针对一个物理网络,管理员会建立一个provider网络。provider网络可以利用物理网络实现对外通信。如果物理网络可以访问Internet,则该provider网络就可以访问Internet,同时所有接入该provider网络的虚拟机就可以访问外部网络。

tenant虚拟网络
虚拟网络的一种,通常由openstak用户自行建立。一个用户通常会有多台虚拟机,就可以创建一个tenant网络连接这些虚拟机。一个用户也可以建立多个tanant网络,每个tenant接入不同的虚拟机。一台虚拟机也可以接入多个tenant网络。

tenant网络默认只能连接同在一个计算节点上的虚拟机。如果有2台虚拟机运行在不同的计算节点上,即使把他们加入了同一个tenant网络,他们也是不能通信的。为了联通这2台虚拟机,需要把这个tenant网络连入一个provider网络,同时这个provider网络所对应的物理网络连接了这2个计算节点。

连接provider网络和tenant网路在neutron中,可以通过一个路由器完成(openstack中定义的虚拟router)。

openstack中还有另外2个关于网络的概念:
管理网络(management network)
管理网络是一个物理网络:所有构成openstack系统的所有节点(物理机器,上面运行了不同的openstack服务,如计算节点,控制节点,网络节点等)都连入这个网络;只有openstack相关服务才会使用这个网络,如rest API调用,RPC调用,数据库访问等。

数据网络(或者业务网络)
分2层:上层是虚拟网络,及前面说的tenant网络。虚拟机中运行的各种应用都通过相应的tenant网络对外通信。下层是物理网络,为上层虚拟网络提供底层物理连接。通常这个物理网络和前边的管理网络是两个不同的网络,以避免管理和业务流量互相影响。

虚拟路由器(router)
和物理路由器类似,用来连接不同的tenant网络。

openstack中定义的网络拓扑结构:
local:只能连接一个计算节点上的虚拟机。仅作为开发调试使用。
flat:
这种结构相当于只有一个provider网络,所有的虚拟机都接入这个网络。不同tenant之间的虚拟机没有隔离,可以通信。

vlan:
和物理网络中的vlan概念一致。每个tenant网络就是一个vlan,默认不同的tenant之间无法通信。为了实现tenant网络之间互通,需要把它们加入到同一个虚拟路由器中。

gre:
类似与vlan的概念,可以实现tenant网络之间的隔离。和vlan的区别是:vlan最多只能有4096个,而gre没有网络个数的限制。gre底层是通过隧道方式(ip tunnel)来实现,即在IP层(L3)上传输数据链路层(L2)数据。gre在传输数据时有大量的额外开销,性能上会有影响。

vxlan:
也是采用L2隧道技术来解决vlan的个数限制问题,和gre的方法不同。还没有仔细学习过。

通过上述几种基本拓扑结构和虚拟路由器的设置,可以实现更为复杂的网络拓扑结构,满足不同用户的需求。openstack的官方文档中给出了一些典型的参考拓扑。

neutron中还支持floating ip功能。openstack可以给一个虚拟机分配一个外部可访问的IP地址(如Internet IPv4地址),如虚拟机中运行一个web服务器,外部用户可以通过该IP访问这个web服务。floating ip指一个IP地址可以动态的分配给任意一台虚拟机。比如这个web服务器如果运行中出现了故障,则用户可以将这个虚拟机迁移到其他节点上从新运行,并把之前的IP地址分配给这个新的虚拟机。

neutorn只定义了虚拟网络的拓扑,而真正实现这些拓扑的是neutrong中各种不同的plugin。常用的两种是linux bridge和openvswitch。openvswitch功能上要比linux bridge更为强大,支持gre。openvswitch还支持远程管理,支持openflow协议。目前openstack并没有使用openvswitch的远程管理功能。使用openvswitch的远程管理,可以监控整个虚拟网络的运行状态。类似于物理交换机上的远程管理功能。

neutron应该是(or将是)openstack中最为复杂的项目。虚拟机中运行的各种业务,存储设备中的各种数据,最终都将通过 网络展现给最终用户,而网络的管理都通过neutron来实现。从目前网上的信息看,neturon项目似乎还不是很稳定,似乎还没有商业用户采用。

用户管理
IaaS的一个特点就是用户自主服务(self-serviced)。用户可以通过用户界面自己创建所需资源,如虚拟机,volume等。用户管理是IaaS的一个重要组成部门。自助服务是虚拟化软件不提供的功能。

openstack keystone是用户管理的项目,除了用户外,还有另外几个概念:租户(tenant,之前也叫project)、role(角色)和policy。
policy用来决定哪些角色可以使用哪些资源、执行哪些操作;角色分配给每个tenant下的各个用户;可以针对tenant进行资源的配额管理,如允许每个tenant使用的虚拟机上限等。
openstack中有一个管理员用户(admin,类似于unix中的root用户),它的权限不受控制。与他对应的tenant是admn,role也是admin.

其他产品
openstack的这些功能有些产品中其实也都有所实现,如vmware vcloud,vcenter等。openstack有什么优势呢?那就是它的开源和厂商独立性。有很多厂商为openstack贡献各种driver/plugin来支持自家的产品(虚拟化软件,存储设备,网络等),从而使openstack具有强大的兼容并包能力,通吃一切。而其他的厂商专有产品就很难做到如此广泛的适配性。更多的适配性可以让用户有更多的选择,更符合自己的需求。



你可能感兴趣的:(openstack)