博主QQ:819594300
博客地址:http://zpf666.blog.51cto.com/
有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!
云计算的部署类型
云计算可以分成三种不同的类型进行部署,分别是私有云、公有云、混合云。
私有云指的是部署在一个封闭和特定环境(网络封闭或者服务范围封闭)中的一个云计算系统。该系统的系统边界明确,仅对指定范围内的人员提供服务。该范围以外的人员和系统无法使用该云,比如非服务区域或者非指定内部网络的人不能使用私有云上的云服务。
公有云指的是部署在一个开放环境中,为所有具备网络接入能力的人和系统提供服务。用户通过互联网访问和使用公有云的服务,但不拥有云也不管理云。
混合云指的是以私有云为基础,能够在业务负载超越私有云自身能力或其它指定的情况下,把部分业务负载透明地分流到其它云上进行处理,使得私有云和部分其它云的资源整合在一起形成的一个系统。
云计算的服务类型
云计算的服务类型可以分为:
基础设施即服务(IaaS)
应用平台即服务(PaaS)
软件即服务(SaaS)
三个层次。
基础设施即服务(IaaS)对云计算系统的软硬件和网络等基础设施进行集中管理和调度,并且把这些基础设施以一种可以通过网络进行访问和使用的形式进行封装,并对外以服务的方式提供这些封装好的IT能力。
应用平台即服务(PaaS)在云基础设施上运行的应用软件支撑平台,其提供业务软件开发所需的业务接口和公共基础处理的支持,方便开发人员开发特定业务的云服务;同时,应用平台即服务(PaaS)为业务软件的运行提供运行时刻的语言运行、网络交互、进程通信、同步控制以及调度等支持,使得云服务能够高效可控地运行。
软件即服务(SaaS)指在云计算平台上,通过互联网直接为用户提供软件服务。软件即服务(SaaS)使得用户不用再购买软件,而是向提供商租用通过互联网即可使用的软件来管理企业经营活动,且用户无需对软件进行维护。
1.1. Openstack的历史:
2010年,美国国家航空航天局联手Rackspace,在建设美国国家航空航天局的私有云过程中,创建了openstack的项目,之后他们邀请其他供应商提供组件,建立了一个完整的开源云计算解决方案。
注:Rackspace (NYSE:RAX)全球三大云计算中心之一,1998年成立,是一家全球领先的托管服务器及云计算提供商。
2010年诞生的第一个版本Austin,只包含Rackspace和美国国家航空航天局的组件。之后发布的版本包含了已加入该项目的供应商开发的附加组件。最初Rackspace独立管理openstack项目,随着openstack的不断发展,在2012年创建了openstack基金会,该基金会又选举产生的董事会监管。Openstack的技术委员会由每个核心的软件项目和项目领导组成。
目前openstack有来自87个国家或地区的850个基金会成员,白金会员提供最高水平的支持,其次是黄金会员,赞助企业和个人会员。
支持openstack项目的主流供应商
X86服务器供应商 | HP(惠普) | DELL(戴尔) | IBM |
Linux供应商 | Redhat | Suse | Canonical |
路由器供应商 | Cisco | Juniper network | Alcatel-luceent |
刀片服务器供应商 | HP | Cisco | IBM |
交换机供应商 | Cisco | HP | Juniper network |
存储供应商 | Emc | IBM | NetApp |
Hypervisor供应商 | Vmware | Kvm | Xen |
1.2. Openstack的功能与作用
当今的数据中心,许多服务器都遇到过同样的问题,即计算,电源,网络带宽等资源的利用率不足。例如,某个项目可能会需要大量的计算资源来完成计算,而一旦完成了计算任务,将不再需要那么多的计算资源。当用户想要一种灵活的,按需供给计算资源的服务,通过自动化或很少的人工干预就能使用时,那么云计算就是最好的选择之一。云计算通常包含了一个服务责任,表示云计算服务提供商承诺的性能,规格,可用率等。云计算服务让用户通过一个共享的计算资源,网络带宽,存储池,运行应用程序或服务来完成计算工作,并按资源的使用来计费。
关于云计算服务的主要特点如下:
按需自助服务:用户可以提供自己的需要订购所需的计算、存储和网络资源,而几乎无需人工干预。
网络访问:可以通过网络使用任意类型的异构计算能力,通过标准化的机制调用计算资源而不受限于具体的访问设备
资源池:多个用户可以同时访问和使用云计算提供的计算服务,服务提供商根据消费者的计算要求或实际使用量和分配实际的计算资源。
弹性:可根据需要不停机或短暂停机后迅速垂直或横向扩展
计量或测量服务:按照使用的时间,传输或存储的字节数支付云计算服务,并提供消费者具体的资源消费图表。同时,他也可以根据消费者的不同需求提供定制化的计费模式
Openstack具有建设这样资源池的能力,通过openstack的各种组件多种模式的排列组合,可以搭建成各种规模的云,这些云可以是私有云,公有云,混合云。
Openstack具有三大核心功能,即计算,存储,网络,分别对应相应的项目Nova,Cinder等。其中Nova提供了计算资源的管理,可以管理跨服务器网络的vm实例。同时Nova还提供了对多种Hyperviosr的支持,如KVM,QEMU,Xen,LXC,Vmware,Hyper-V,Powervm等。Cinder提供了存储资源的管理,可以管理各个厂商提供的专业存储设备。
1.3. Openstack关键组件
服务名称 | 项目名称 | 描述 |
Dashboard | Horizon | 基于openstackAPI接口使用django开发的web管理 |
Compute | Nova | 通过虚拟化技术提供计算资源池 |
Networking | Neutron | 实现了虚拟机的网络资源管理 |
Storage存储 | ||
Object Storage | Swift | 对象存储,适用于“一次写入,多次读取” |
Block storage | Cinder | 块存储,提供存储资源池 |
Shared server(共享服务) | ||
Identity | Keystone | 认证管理 |
Imageservice | glance | 提供虚拟机镜像的注册和存储管理 |
Telemetry[t'lemtr] | Ceilometer [si'lmt] | 提供监控和数据采集,计量服务 |
Higher-level service(高级服务) | ||
Orchestration[,ks'tren] | Heat | 自动化部署的组件 |
DatabaseService | Trove | 提供数据库应用服务 |
Mysql:
Openstack所使用的数据库,包括nova,glance,cinder等在内的组件都会建立自己的数据库,保存一些必要的数据。
Keystone:
Openstack的用户认证组件,它的功能主要是建立管理项目的用户和各种服务端口,以及进行用户的身份认证,若要使用openstack的任意的API,第一步就必须通过keystone的验证。
keystone的主要功能是提供认证和编录服务
keystone提供了两种认证方式:token,identify backend
token(令牌,实际是一个随机字串,在认证时直接使用),主要用于内部各组件之间
identify(账号,密码),需要用户登陆时,如用户通过horizon访问云资源
catalog(编录):保存当前openstack架构中的调用接口(ip地址,端口,url信息),openstack各个组件之间交互通过api接口,openstack架构各个组件通过http的restful机制(一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制)远程过程调用,基于URI输出。
policy:管理策略,如与用户管理、虚拟机实例管理有关的策略
Glance:
用来存放管理虚拟机镜像和快照的服务,这也是一个最小架构中必须有的服务。
Glance:存放镜像的元数据的
registry:调用数据库的接口,检索接口
database:映像文件的存储位置等
swift:分布式存储
Neutron:
网络服务,用来提供虚拟机网络通信的组件,负责接收对网络的调用请求。
Nova:
Nova是个至关重要的组件,也是个相对庞大的组件,其中有很多服务,它是进行生成虚拟机工作的主要服务。
Nova计算节点,是openstack的最核心的节点,运行虚拟机实例,分配cpu、内存,nova-compute本身并不能运行虚拟机,是要通过hypervisor,nova-compute通过api调用hypervisor(又称也虚拟机监视器),nova-compute支持哪种hypervisor,api就可以调用哪种hypervisor,如nova-compute支持libvirt。api就可以调用libvirt支持的hypervisor(如kvm),xenapi可以调用xen
Cinder:块存储
用来创建,删除及管理volume(虚拟磁盘卷),以及给volume做快照等服务的组件
Swift:分布式文件系统,用来存储镜像文件模板
Horizion:
Openstack 的web管理页面,使用django框架开发。Web管理页面包含了日常使用的大部分功能,提供给用户一个最直观的展现方式。很多简单的二次开发都是从Horizon开始的。
Rabbitmq:
在openstack中,各个服务之间是通过消息来交互的,因为openstack使用AMQP作为消息传递的技术,所以rabbitmq,qpid,zeromq等支持AMQP的软件都是被openstack所支持的。Rabbitmq是第一个被openstack所使用的消息传递软件。Openstack通过AMQP实现RPC服务,来保证不同组件之间的通信,rabbitmq是控制节点中的一个非常关键的服务。
虚拟机运行在nova节点上的,所有组件都围绕vm(虚拟机)工作
1.4. keystone概述
keystone是openstack的组件之一,用于为openstack家族中的其他组件成员提供统一的认证服务,包括身份验证、令牌发放和校验、服务列表、用户权限定义等。其中服务列表体现在用户登录openstack系统后能够使用的计算,网络,存储等服务的列表。通过下面的图可以看出openstack中所有组件的认证,都需要keystone的参与,所以keystone自身的高可用也非常重要。
keystone服务主要有两个功能
1. 实现用户管理:主要是认证和授权
Keystone实现认证的方式有两种:token认证,用户名密码认证
1. 实现服务管理:openstack集群中每一个服务都有可能在独立的节点上,这些节点的IP地址,监听的端口,访问路径uri都要在Identity中进行注册,部署identity后,只需向外输出一个identity的路径就可以查找到其他组件(image,nova,compute…)的访问路径了。即存储所有可用服务的信息,包含其API的访问入口(API endpoint路径)。
keystone的关键术语:
User:一个user可以关联至多个tenant
Tenant(租户):一个tenant对应一个project(项目)或一个组织,一个租户相当于一个公司或一个项目,openstack是可以实现公有云的,每一个项目中也有可能会包含多个虚拟机实例,项目也可以是一个tenant
Tenant的另一种解释:Project(Tenant):可以理解为一个人、或服务所拥有的资源集合。在一个Project(Tenant)中可以包含多个User,每一个User都会根据权限的划分来使用Project(Tenant)中的资源。比如通过Nova创建虚拟机时要指定到某个Project中,在Cinder创建卷也要指定到某个Project中。User访问Project的资源前,必须要与该Project关联,并且指定User在Project下的Role。
Role:角色主要实现向User授权的,openstack有几个内置的角色,admin,member等
Token:定义了令牌的有效时间和令牌中用户的权限,项目等基本信息
Service:对应业务模型服务,如计算(compute),存储(volume),镜像(Glance)等
Endpoint:服务的访问入口每个服务都会有自己的访问入口,也称之为访问端点。
Endpoint:一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL。比如,当Nova需要访问Glance服务去获取image 时,Nova通过访问Keystone拿到Glance的endpoint,然后通过访问该endpoint去获取Glance服务。我们可以通过Endpoint的region(范围)属性去定义多个region。Endpoint 使用对象分为三类:
admin url –>给admin用户使用,Post:35357
internal url –>OpenStack内部服务使用来跟别的服务通信,Port:5000
public url –>其它用户可以访问的地址,Post:5000
创建完service后创建API EndPoint. 在openstack中,每一个service都有三种endpoints. Admin, public, internal。 Admin是用作管理用途的,如它能够修改user/tenant(project)。 public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。internal是openstack内部调用的。三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放internal通常只能对安装有openstack服务的机器开放。
用户--角色--服务的交互图解:
keystone的逻辑架构图:
1. 可以使用kvs或memcached实现令牌(token)后端存储。Token后端存储用来存储基于token认证相关的token信息
2. Identity backend(用户名和密码的认证方式),实现方式有:kvs,pam,sql,ldap,etc.
3. Catalog backend(编录服务后端),keystone可以直接连接到memcached中,将token保存下来,事实上keystone没有memcached也可以正常工作,因为keystone的token backend可以基于keystone自己的存储提供。实现方式有kvs,sql,etc
4. Policy kackend(存储策略):存储访问时使用的规则及自定义的其他规则。
keystone验证流程:以创建虚拟机的流程为例
keystone的工作流程总结:
用户向keystone发送用户名和密码,通过验证后,keystone会返回一个临时token和一个service catalog(服务目录)的列表。
用户用这个临时的token向catalog列表中keystone的endpoint请求用户对应的tenant信息,keystone验证token通过后会返回用户对应的tenant列表。
用户从列表中选取tenant,再次向keystone请求,keystone验证通过后,返回与该tenant相关的catalog(目录)信息和token。
用户用该token以及tenant/user信息向catalog中的nova服务器端点请求开启虚拟机服务。nova向keystone请求验证:<1>.token是否合法<2>.这个租户和用户是否有权限来向nova请求服务?
keystone返回给nova:
<1>.租户-用户具备访问nova权限。
<2>.token合法
<3>.token属于该租户-用户。
nova根据自己的规则判断用户是否具备开启虚拟机的权限,如果具备,启动虚拟机,并向用户报告状态。
Keystone 认证流程:
1. 用户alice登录keystone系统(password或者token的方式),获取一个临时的token和catalog服务目录(v3版本登录时,如果没有指定scope,project或者domain,获取的临时token没有任何权限,不能查询project或者catalog)。
2. alice通过临时token获取自己的所有的project列表。
3. alice选定一个project,然后指定project重新登录,获取一个正式的token,同时获得服务列表的endpoint,用户选定一个endpoint,在HTTP消息头中携带token,然后发送请求(如果用户知道project name或者project id可以直接第3步登录)。
4. 消息到达endpoint之后,由服务端(nova)的keystone中间件(pipeline中的filter:authtoken)向keystone发送一个验证token的请求。(token类型:uuid需要在keystone验证token,pki类型的token本身是包含用户详细信息的加密串,可以在服务端完成验证)
5. keystone验证token成功之后,将token对应用户的详细信息,例如:role,username,userid等,返回给服务端(nova)。
6. 服务端(nova)完成请求,例如:创建虚拟机。
7. 服务端返回请求结果给alice。
2.1. Glance概述
glance是openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找、注册和检索等操作。
glance提供restfulapi可以查询虚拟机镜像的metadata(元数据),并且可以获得镜像
通过glance,虚拟机镜像可以被存储到多种存储上,比如简单的文件存储或者对象存储
glance在Openstack中的位置:
Glance基本概念:
imageidentifiers:就是image URI,格式:<Glance ServerLocation>/images/<ID>全局唯一
Image status:
queued:镜像ID已经被保留,镜像的metadata已经被写到数据库中,但镜像还没有上传
saving:镜像正在被上传
active:镜像可以使用了
killed:镜像损坏或者不可用
deleted:镜像被删除
Disk format(磁盘格式)
raw:raw不是一种真正的磁盘格式,而是代表虚拟机所使用的原始镜像;它并不存储元数据,因此可以作为保证虚拟机兼容性的候选方案,然而也正因为它不存储元数据,因此不能支持某些高级特性,比如快照和压缩等。所以raw性能较好,如果初始创建的虚拟磁盘是10GB,就在文件系统占10G的存储空间。
vhd:vmware,xen,microsoft,virtualbox支持的格式
vmdk:commonformat 开源社区通用的,规范化的磁盘格式
vdi:virtualbox,qemuemulator这两类hypervisor支持的格式
iso:optical disc光盘镜像,主要用来做归档之用。
qcow2:qemuemulator主要用于qemu类型的虚拟机上,特点在于虚拟磁盘大小是动态扩展,如果初始创建的虚拟磁盘大小是10G,但在文件系统不会占10G空间,用户写入多少就占多少空间。即随着实际的使用空间,虚拟磁盘的物理使用空间会动态变化,但性能比起raw格式会差一些,但qcow2格式支持对虚拟机做快照。
aki:Amazonkernel image
ari:Amazonramdisk image
ami:Amazonemachine image
Container format(容器格式):
上文中提到了磁盘的格式,但是若要创建一个虚拟机不能仅仅是定义磁盘格式,还要去定义虚拟机使用了多少个CPU,内存是多少,所支持的操作系统的架构是什么样的等等元数据信息,Containerformat可以使用的选项有:
Bare
ovf
aki
ami
ari
image-create命令至少要接收三个参数:--name 、--container_format、--disk_format。其中--disk_format用于指明磁盘镜像文件的格式,包括raw,qcow2,vhd,vmdk,iso,vdi,aki,ari,ami等。--container_format用于表明镜像文件是否包含了虚拟机的元数据信息,然而,目前compute服务并未使用此信息,因此,在不确定的情况下可以将其指定为bare,而常用的格式主要有bare(没有container或元数据信息)、ovf、aki、ari或ami几种。
Glance的基本架构:
GlanceAPI:对外提供镜像接口服务,包括镜像的上传和下载,更改信息以及虚拟机、云硬盘快照管理等接口服务。
GlanceRegistry(注册服务):存储镜像元数据信息与数据库交互实现镜像基础信息存储
storeadapter(存储适配器):镜像本身的存储,提供多种存储适配,支持亚马逊云存储S3(Simple Storage Service简单存储服务),openstack自由的swift(对象存储)以及常用的文件存储系统,当然也可以自行开发拓展到其他存储上。
store-Adapter
S3
Swift
Filesystem:默认后端存储
RBD:Ceph的Randosblock device(RBD)
HTTP:通过http在internet上读取可用的虚拟机镜像。
其他分布式存储,比如sheepdog等
2.2. Nova概述
Nova是什么?
openstack是由Rackspace和NASA共同开发的云计算平台,类似于Amazon EC2和S3的云基础架构服务,nova在openstack中提供计算服务。nova服务由多个组件共同组成,这些组件用于提供API,Compute核心组件、网络功能、控制台接口,命令行客户端及其他组件
nova在openstack中的位置
nova的架构:
Compute服务有多个组件共同组成,这些组件用于提供API,Compute核心组件、网络功能、控制台接口,命令行客户端及其他组件
核心组件:
nova-api:接收并响应终端用户对compute api接口调用的服务,除了支持openstack compute API还兼容amazon ec2 api以及专用于特权用户执行管理工作的admin API。另外nova-api还用于管理instance,以及强制生效指定的策略等。
Nova-api-metadata服务:接收并响应有instance发起的metadata调用请求,仅用于nova-network的multi-host模型中。
nova-compute:主要功能是借助于Hypervisor的api(KVM,QEMU,Vmware api)启动及终止虚拟机实例的。主要作用就是在对应的Hypervisor中启动或停止虚拟机的进程,但是他的工作过程主要是从队列中接收操作请求并执行相应的操作,如启动虚拟机操作,在数据库中更新其虚拟机的状态等等。
nova-scheduler:Nova-scheduler进程:compute中最简单的组件,负责从队列中取出一个instance的请求并决定由哪个compute server来运行之。
nova-conductor:是一个模块,位于nova-compute和数据库的中间层,用来避免多个nova-compute与数据库直接进行交互,导致数据库直接暴漏给nova-compute的。所以nova-compute启动虚拟机实例完成以后,对于更新数据库状态的请求操作不是直接由nova-compute向数据库发起的,而是扔回到对列中,再在由Nova-conductor取回之后执行相关更新操作。
网络功能:
Nova-network守护进程:类似于nova-compute,它负责从队列取出网络相关的任务并执行相关的操作,包括设定桥接接口及修改iptables规则等。不过,此功能已经由openstack中专用的组件neutron来实现。
Nova-dhcpbridge脚本:通过dnsmasq的dhcp-script来跟踪IP地址租约并记录与数据库中,目前已经由专门的服务组件neutron来实现。
控制台接口:控制台接口的作用是,当我们在openstack中启动了虚拟机实例以后,这些实例有可能运行在不同的nova-compute节点(计算节点)上,用户连接openstack访问虚拟机实例时,尤其是在没有配置网络接口地址,也不知道在那一台计算节点,用户是无法连接到虚拟机实例的,此时只能通过控制台实现。
在openstack中每一个虚拟机实例启动之后,可以监听在一个VNC的接口上,当用户使用openstack的dashboard图形界面接口中可以对虚拟机进行启动,停止,网络相关的配置,而在这个接口中基于python web打开了一个VNC的客户端工具,VNC的客户端工具本身就支持基于浏览器远程浏览,此时虚拟机是不需要配置IP地址,只需通过VNC协议基于浏览器打开控制台的方式连接虚拟机。
nova-consoleauth:认证由consoleproxies(控制台代理)传入的用户认证token
nova-novncproxy:向经由vnc接口连入各instance的请求提供代理服务,支持基于浏览器的
Nova-x***vncroxy守护进程:向经由vnc接口连入个instance的请求提供代理服务,支持基于专为openstack设计的java客户端 接口
nova-cert:管理x509格式的证书。
Client:
nova-client:向nova-api发送请求的client
nova-manage:管理员控制命令,查看和管理包括服务进程,虚拟机,物理主机,套餐,网络,存储等
其他组件:
Queue(AMQP):在各进程间传递消息的消息队列服务,支持rabbitmq,apache qpid以及zeromq
Sql database: 为云基础架构存储构建及运行时的数据,包括可用的实例类型,运行中的实例,可用的网络等信息。理论上,openstack可支持任何SQL类型的数据库管理系统,但实际用的最多是Sqllite,Mysql,Postgresql。
nova内部组件的交互:
为了使得让调用者调用发出请求之后,能立即返回,当被调用者处理结束之后又能通知给调用者,在调用者和被调用者之间需要一个messaging broker(消息代理)负责完成,messaging broker主要是用来实现消息传递及消息存储队列,我们可以把这个消息传递的服务安装一个独立的服务器上面,也可以和控制节点一起部署,当一个调用者需要调用其他主机提供的服务时,调用者只需将请求扔给消息队列服务器,消息队列服务器也能够知道哪些主机能提供相应的服务,所以会把相应的请求在扔给提供服务的主机,当提供服务的主机处理完之后将结果扔回消息队列中,队列服务器将结果返回给请求者。但是很多时候,消息队列的工作机制是这样的,那些能够提供服务的主机为了尽早知道有哪些与自己相关的请求需要进行服务,可以进行订阅与自己相关的消息,这种订阅服务意味着自行向队列注册并监听某一个队列(或者可以认为自己侦听某一类的消息,一旦有相应的消息扔到队列中,订阅者会立即获得相应的消息,并提供相应的服务),而对于发送请求的我们通常称之为消息的生产者,也叫消息的发布者。
openstack中新建云主机的流程
虚拟机启动过程如下:
1. 界面或命令行通过RESTful API向keystone获取认证信息。
2. keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。
3. 界面或命令行通过RESTful API向nova-api发送一个boot instance的请求(携带auth-token)。
4. nova-api接受请求后向keystone发送认证请求,查看token是否为有效用户和token。
5. keystone验证token是否有效,如有效则返回有效的认证和对应的角色(注:有些操作需要有角色权限才能操作)。
6. 通过认证后nova-api和数据库通讯。
7. 初始化新建虚拟机的数据库记录。
8. nova-api通过rpc.call向nova-scheduler请求是否有创建虚拟机的资源(Host ID)。
9. nova-scheduler进程侦听消息队列,获取nova-api的请求。
10.nova-scheduler通过查询nova数据库中计算资源的情况,并通过调度算法计算符合虚拟机创建需要的主机。
11.对于有符合虚拟机创建的主机,nova-scheduler更新数据库中虚拟机对应的物理主机信息。
12.nova-scheduler通过rpc.cast向nova-compute发送对应的创建虚拟机请求的消息。
13.nova-compute会从对应的消息队列中获取创建虚拟机请求的消息。
14.nova-compute通过rpc.call向nova-conductor请求获取虚拟机消息。(Flavor)
15.nova-conductor从消息队队列中拿到nova-compute请求消息。
16.nova-conductor根据消息查询虚拟机对应的信息。
17.nova-conductor从数据库中获得虚拟机对应信息。
18.nova-conductor把虚拟机信息通过消息的方式发送到消息队列中。
19.nova-compute从对应的消息队列中获取虚拟机信息消息。
20.nova-compute通过keystone的RESTfull API拿到认证的token,并通过HTTP请求glance-api获取创建虚拟机所需要镜像。
21.glance-api向keystone认证token是否有效,并返回验证结果。
22.token验证通过,nova-compute获得虚拟机镜像信息(URL)。
23.nova-compute通过keystone的RESTfull API拿到认证k的token,并通过HTTP请求neutron-server获取创建虚拟机所需要的网络信息。
24.neutron-server向keystone认证token是否有效,并返回验证结果。
25.token验证通过,nova-compute获得虚拟机网络信息。
26.nova-compute通过keystone的RESTfull API拿到认证的token,并通过HTTP请求cinder-api获取创建虚拟机所需要的持久化存储信息。
27.cinder-api向keystone认证token是否有效,并返回验证结果。
28.token验证通过,nova-compute获得虚拟机持久化存储信息。
29.nova-compute根据instance的信息调用配置的虚拟化驱动来创建虚拟机。
nova通用部署模式,每个服务部署在单个服务器上
高可用的部署模式:
nova常见错误排查:
401认证错误
检查用户名和密码以及tenant是否正确
检查认证配置是否正确
409错误
nova服务是否正常运行
novalid host错误
查看是不是没有可用的资源
网络不通
查DHCP、查路由、查openvswitch
2.3. Neutron概述
neutron:网络服务,负责接收对网络的调用请求
网络管理和配置是云计算中一项非常重要的功能。nova自带的nova-network实现了一些基本的网络模型,允许虚拟机之间的相互通信及虚拟机对internet的访问。归纳的来讲nova network的主要功能有:
网络模型:novanetwork实现了三种网络模型,允许管理员根据自己的需要进行组网,让虚拟机之间可以相互通信。这三种模式分别是:flat、flatdhcp、vlan,后面会对这三种模型进行更加详细的介绍。
IP地址管理:novanetwork需要管理虚拟机使用的IP地址,这些地址包含两类,一类是fixed ip,在虚拟机的整个生命周期中该IP地址都不会发生变化;另一类是floating ip,是动态的分配给虚拟机的,随时都可以收回。
dhcp功能:在flatdhcp和vlan模式下,虚拟机是通过DHCP来获取其fixed ip的;nova network会启动dnsmasq作为虚拟机的DHCP服务器,该虚拟机分配ip。
安全防护:出于安全的考虑,nova中的虚拟机可以防止IP/MAC洪泛,不能随便修改虚拟机的MAC地址,修改后虚拟机就不能上网了,这项功能主要是通过ebtables/iptables实现的。
openstack早期版本的网络方案:
FLAT
FLATDHCP
VLAN
先看一下FLAT网络部署模式:
flat:平面的,意味着在同一个openstack内部所创建的所有虚拟机实例,无论它们是不是在同一个物理节点上,这些所有的虚拟机实例都是通过同一个桥接网络接口连出来的,而且都在同一个网段内,因此彼此之间没有任何在网络上隔离。这种网络简单,不需要dhcp服务,但需要通过文件注入。
注:基于config drive方式,将配置的网络信息注入到openstack/content/0000文件中,然后虚机启动后,由cloudinit读取此文件数据,由cloud-init中的基础组件进行虚机网络设置。
FLAT网络的特点:
在openstack的网络平台只有一个子网,FLAT模式需要指定一个子网,规定虚拟机使用的IP地址范围。
创建实例时,从有效的IP地址池获取一个IP地址,为虚拟机实例分配,然后在虚拟机启动时候通过外部注入的方式去修改IP相关的配置文件,虚拟机启动后就会拥有IP地址
FLAT模式需要在安装openstack时需要手工配置好网桥(br100),所有的系统实例都是和同一个网桥连接,网桥与连接到网桥的实例组成一个虚拟网络。
网络控制器(nova-network节点)对虚拟机实例进行NAT转换,实现与外部的通信
FLATDHCP模式:
flatdhcp:不需要文件注入,与Flat模式类似,只是少了dhcp的部分而已。
与FLAT模式一样,从IP池取出IP分配给虚拟机实例,所有的实例都在一个子网中。
IP地址的分配不是通过外部注入的方式让虚拟机获取IP地址,而是运行dhcp server的方式监听网桥上的dhcp discover的包的方式为虚拟机分配IP地址,这样做带来了一个非常好的灵活性---无论是哪种类型的操作系统,都可以很轻松的分配IP地址了。其实就是在nova-network服务的节点上运行dnsmasq,作为DHCP服务器监听这个网桥。
在FLATDHCP模式中nova会自动创建网桥,维护已经分配的floating ip,并启动dnsmasq来配置虚拟机的fixed ip,创建虚拟机时,nova会给虚拟机分配一个fixed ip,并将MAC/IP的对应关系写入dnsmasq的配置文件中,虚拟机启动时通过DHCP获取其fixed ip,因此就不需要将网络配置信息注入到虚拟机中了
下图是双网卡多节点OpenStack网络流
dhcp时:
1)网络控制器(运行nova-network服务的节点)一直运行dusmasq作为DHCP服务器监听网桥(br100);
2)实例做一次dhcp discover操作,发送请求;
3)网络控制器把从一个指定的子网中获得的IP地址响应给虚拟机实例。
实例访问外网时:
1)实例经过所在主机的flat_interface(这是一个flat网络),连接到nova-network所在的主机(控制节点);
2)网络控制器对外出网络流进行转发。
外网访问实例时:
1)网络控制器对floating ip进行nat;
2)通过flat网络将流入数据路由给对应的实例。
VLAN模式:
vlan模式比上面两种模式复杂,每个project都会分配一个vlan id,每个project也可以有自己的独立的ip地址段,属于不同project的虚拟机连接到不同的网桥上,因此不同的project之间是隔离的,不会相互影响。为了访问一个project的所有虚拟机需要创建一个***虚拟机,以此虚拟机作为跳板去访问该project的其他虚拟机。与flatdhcp类似,vlan模式下,也会为每个project启动一个dnsmasq来配置虚拟机的fixed ip。
为了满足以上要求重新开发了新的项目:neutron,这个项目早期叫quantum
neutron服务
neutron是一个分层架构,所有的请求都先到neutron server上,neutron server有多个API,如Base API包含刚才提到的network,subnet,port。还有一些扩展的API用来提供neutron的高级功能:安全组,虚拟路由器,防火墙,负载均衡器,***等服务。通过调用这些API来访问neutron提供的功能。用户调用这些接口之后,内部会通过RPC机制调用agent层的一些服务,这些agent有二层、三层的,agent相当于一个中间代理层,agent再会调用设备层相应的驱动来完成用户API所请求的功能。
2.3.1. Neutron基本概念
Openstack的networkingservice代码名称为neutron,它通过软件的方式提供了定义及接入网络的功能。Neutron为使用者提供了整合多个不同的网络技术来最大化发挥网络功能的机制,并提供了通过三层转发及NAT配置和管理网络功能的API以实现负载均衡,边缘防火墙及ipsec ***等。
Networking API
Networking API通过软件方式定义了虚拟网络(network),子网(subnet),port(端口)等抽象层,用来描述网络资源。
网络(network)
Neutron网络目的是划分虚拟网络,在多租户环境下提供给每个租户独立的网络环境。Neutron中“网络”是一个可以被用户创建的对象,如果要和物理环境下的概念映射的话,这个对象相当于一个巨大的交换机,可以拥有无限多个动态可创建和销毁的虚拟端口。
子网(subnet)
子网是由一组IP地址组成的地址池。不同子网间的通信需要路由器的支持,Neutron中子网隶属于网络。
端口(port)
一个端口代表了在逻辑网络交换机上的虚拟交互端口,虚拟机的虚拟接口(可以理解成网卡)连接到这些端口上。当给虚拟机接口分配IP地址,需要将端口关联到子网中,从子网的地址池取出IP地址。
路由器(router)
和物理环境下的路由器类似,Neutron中的路由器也是一个路由选择和转发部件。只不过在Neutron中,它是可以创建和销毁的软部件。
DHCP
为租户网络提供DHCP服务,即IP地址动态分配,另外还会提供metadata请求服务。
DHCP agent
负责处理dhcp请求,为网络分配IP
DHCP agent scheduler
DHCP agent与network的调度,即某个网络的DHCP请求要发向那个DHCP agent,如采用轮询调度算法。
使用neutron完全可以定义出功能丰富的网络拓扑,并且支持每个项目在其内部可创建多个private network并允许其配置使用任何可用的地址,多个项目使用相同的私有地址也不会出现地址冲突的现象,可以利用这样的网络配置,可以开发多层的web应用,并允许应用到迁移到云中,而不改变IP地址。
2.3.2. Neutron典型部署模式
neutron常见的部署模式有:
Single FLATNetwork
Multi FLATNetwork
ProviderRouter with private network
Per-tenantRouters with private network(最常用模式)
所有虚拟机放在同一个网络中,不支持floating ip
类似FlatManager
FlatDHCPManager
不支持floatingip
注:openstack使用“floating ip”指定一个公网ip到一个运行着的虚拟机实例上面,openstack使用NAT分配floating ip到虚拟机实例上
最常见的扁平网络模式图:
上面的图就是一个简单的共享网络,所有的虚拟机租户公用一个大网络,可以理解为FLAT/FLATDHCP模式。该模式的特性就是简单便捷,网络管理方便。
2. Mutiple FLATnetwork(多个扁平网络模式)
类似FlatManager
FlatDHCPManager
不支持floatingip
可以创建多个网络,但还是不支持floating ip,一个租户/项目可以连接不同的网络,在部署虚拟机时候选择具体网络,一个虚拟机可以同时连接两个网络,通过两个网卡(Virtual interface)连接到不同的网络(虚拟交换机)的端口port中。
多个扁平网络的场景应用比较少见,但一个虚拟机属于多个网络的情况非常普遍。从日常普通企业应用来说,扁平共享模式是基本够用。在扁平共享模式中,网络都是共享的,每个租户都可以使用。从安全性角度来说,所有虚拟机互联互通,虽然虚拟机有防火墙机制,但如果防火墙设定漏洞较大,结果还是会存在一定的隐患,那么有没有类似的nova-network中的VLAN模式呢?答案是有的,下面的租户私有网络与VLAN类似,但不是VLAN.
3. providerrouter with private network(租户私有网络单个路由器) ,支持floating IP
neutron允许每个租户拥有多个自己的私有网络network(非共享模式),私有网络通过路由器router连接至外部网络,如下图所示:
所有的租户共享一个虚拟路由器,此时租户还是不能定义自己的网络
这种网络环境下,基本可以理解为类似VLAN,但不是VLAN,不同租户拥有1个或者多个私有网络networks,网络networks通过连接到单个路由器与外部网络互通,私有网络的网关终结在路由器中。
如果虚拟机需要绑定floating ip,那么就要通过路由器将外网的floating ip与私网ip地址绑定,在数据模型上就是虚拟机连接到路由器router上的端口port,该port拥有floatingip。
4. Per-tenantRouters with private network(多路由器私网模式)
在上面的单个路由器模式下,不同网络的子网是不能重叠的(overlapping)的,也就是说不能存在两个10.0.0.0/24网段,在实际的生产环境中也会有该情况发生。假如你管理着跨几个城市的统一云管理平台,就经常出现不同数据中的私网IP地址段都相同的情况,最常见的就是私有网络都是192.168.1.0/24,这种情况下如果采用nova-network是没有办法实现的,而neutron能够支持,在neutron模型上,network和真正的网络subnet分离,从数据模型上就支持了不同的network,拥有相同子网的subnet,如下图所示:
每个租户可以自己定义自己的虚拟路由器和私有网络,为虚拟机绑定floating IP,目前此种部署模式是最常用且先进的。
多路由器私网模式,每个租户/项目拥有自己的路由器,将其多个私有网络连接起来,在图中,10.0.0.0/24在租户tenantA和tenantC中都出现了。这样的好处就是租户/项目的网络可以自行构建,无需担心网络冲突等问题,管理模式更灵活。
部署nova network时至少需要两块网卡,一块作为public network,主要承载公网流量和openstack各个组建之间的流量,要能够访问公网,ip地址可以为内网地址也可以为公网地址;另一块作为internal network,承载虚拟机之间相互通信的流量,不需要为其分配ip地址,只需要保证它们物理上可以互联即可。
novanetwork有两种常见的部署方式,第一种方式是单个nova-network节点,充当所有虚拟机的网关,并维护dhcp服务器。这种方式最大的问题就是单点故障,一旦nova-network节点出问题了,就会影响到所有的虚拟机,需要实施HA方案。另一种方式就是multihost,即在每个计算节点上部署nova-network,每个计算节点上的虚拟机通过本机的nova-network就可以获取ip地址、metadata及访问公网。这样做的优势就是一旦某个节点出现问题,也不会影响到其他节点,而且有很好的扩展性,也是我们目前部署最为广泛一种模式
multihost 模式:
在multihost模式下,首先需要将multi_host设置为True,然后在每个计算节点上都安装好nova-networknova-api-metadata nova-compute。
从下图中可以看到,网桥br100在每个计算节点上都有,通过网桥br100实现子网10.0.0.0/8的互联,虚拟机之间的互访通过网桥br100与虚拟机数据网交换机(private switch)实现连接。如果访问外网,则需通过网络节点上设置的网关,最后通过NAT 映射访问公网。
nova network的主要配置选项有:
network_manager:该选项决定了网络的模式,有三种可选的:nova.network.manager.FlatManager
nova.network.manager.VlanManager
nova.network.manager.FlatDHCPManager
分别对应上面所提到的flat模式、flatdhcp模式和vlan模式
fixed_range:所有虚拟机fixedip所在的网段,通过nova-manage创建网络时,创建的网络应该是该网段的子网。
floating_range:所有可以的floatingip所在的网段
force_dhcp_release:是否在删除虚拟机时立即释放其所占用的ip地址。若为True,则会立即释放,否则需要经过一段时间才释放。默认应该设置为True。
my_ip:nova-network所在的ip地址,不显式设置时该ip是宿主机上一个能访问公网的ip地址。配置时可显式的设置为本机的公网ip。
multi_host:是否启用multihost模式,如果启用,则在每个计算节点上至少要启动nova-api-metadata、nova-network、nova-compute三个服务。默认值为false。启用multihost时,需要将其设置为True。
public_interface:公网的物理接口。nova network会将floating ip配置在该接口上,另外就是在做SNAT时会将其作为参数加入到iptables规则中。
flat_network_bridge:在flat/flatdhcp模式下,使用那个网桥来连接虚拟机,实现虚拟机之间的通信。
flat_interface:虚拟机之间通信的物理接口。在flatdhcp模式下,nova network会将该接口加入到flat_network_bridge中,实现跨宿主机的虚拟机之间的通信。默认为none。
vlan_interface:虚拟机之间通信的物理接口。在vlan模式下,每个project会有一个vlan,不同的vlan和不同的网桥关联,网桥再通过vlan_interface实现跨宿主机的通信
vlan_start:在vlan模式下,最小的vlan id。
2.5. Cinder块存储
存储是虚拟机不可缺少的关键设备,openstack参考了亚马逊的EBS,为虚拟机提供持久化的块设备存储。最常见的示例是为虚拟机增加一个新的硬盘,这个硬盘就是块设备,如果虚拟机是linux操作系统,那么会将硬盘识别为sdb,sdc;如果是windows,则会识别为新的硬盘,此时需要格式化:
存储具体实现机制如图:
nova存储实现机制包括以下几个关键环节:
nova-api调用nova-compute主机接口run_instance。
nova-compute调用存储接口volume-api的create方法,创建存储。
volume-api存储接口将存储信息通过调度方式发送至调度引擎scheduler。
调度引擎scheduler根据一定的算法,选择具体一个存储节点,发指令至该节点cinder-volume
cinder-volume接收到创建云硬盘(create_volume)指令值,创建逻辑卷LV,并发布逻辑单元(LUN)
nova-compute接收到云硬盘创建成功的反馈后,调用其虚拟化实现,如Libvirt Driver的SCSI实现,实现ISCSI initiator连接至对应的存储逻辑单元LUN,将该块设备分配给虚拟机。