申明:本文主要观点引用自cloudman:http://blog.51cto.com/cloudman,感谢cloudman的分享。

OpenStack主要是通过NovaNeutronGlanceCinderKeystoneHorizon等模块对计算、网络和存储资源进行管理的.

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

Nova:管理VM的生命周期,是OpenStack中最核心的服务。

Neutron:为OpenStack提供网络连接服务,为VM提供虚拟网络和物理网络连接。

Glance:管理VM的启动镜像,Nova创建VM时将使用Glance提供的镜像。

Cinder:为VM提供块存储服务。

Glance可以将镜像存放在Swift中;Cinder也可以将Volume备份到Swift中。

Keystone:为OpenStack的各种服务提供认证和权限管理服务。

Horizon:为OpenStack用户提供一个Web的自服务Portal

OpenStack本身是一个分布式系统,不但各个服务可以分布部署,服务中的组件也可以分布部署。这种分布式特性让OpenStack具备极大的灵活性、伸缩性和高可用性。控制节点(Controller Node)管理OpenStack,其上运行的服务有KeystoneGlanceHorizon以及NovaNeutron中管理相关的组件。控制节点也运行支持OpenStack的服务,例如SQL数据库(通常是MySQL)、消息队列(通常是RabbitMQ)和网络时间服务NTP。网络节点(Network Node)其上运行的服务为Neutron。为OpenStack提供L2L3网络。包括虚拟机网络、DHCP、路由、NAT等。 存储节点(Storage Node)提供块存储(Cinder)或对象存储(Swift)服务。计算节点(Compute Node)其上运行Hypervisor(默认使用KVM)。同时运行Neutron服务的agent,为虚拟机提供网络支持。

Keystone

Keystone主要负责:1)管理用户及其权限;2)维护 OpenStack Services Endpoint3Authentication(认证)和 Authorization(鉴权)。

Keystone中有如下基本概念:

User指代任何使用OpenStack的实体,可以是真正的用户,其他系统或者服务;

CredentialsUser用来证明自己身份的信息,可以是:1.用户名/密码;2.Token3.API Key4.其他高级方式;

AuthenticationKeystone验证User身份的过程,User访问OpenStack时向Keystone提交用户名和密码形式的CredentialsKeystone验证通过后会给User签发一个Token作为后续访问的Credential

Token是由数字和字母组成的字符串,User成功Authentication后由Keystone分配给UserToken用做访问ServiceCredentialService会通过Keystone验证Token的有效性,Token的有效期默认是24小时;

Project用于将OpenStack的资源(计算、存储和网络)进行分组和隔离,资源的所有权是属于Project的,每个User(包括admin)必须挂在Project里才能访问该Project的资源,一个User可以属于多个Project

Endpoint是一个网络上可访问的地址,通常是一个URLService通过Endpoint暴露自己的APIKeystone负责管理和维护每个ServiceEndpoint

安全包含两部分:Authentication(认证)和Authorization(鉴权)Authentication解决的是“你是谁?”的问题Authorization解决的是“你能干什么?”的问题,Keystone是借助Role来实现Authorization的。

客户想查询某种数据,首先需要向Keystone认证,认证通过后,再获取该用户的权限,然后获取对应服务的Endpoint,通过该Endpoint访问服务,发向服务的请求,服务会先向Keystone进行身份验证,然后查看用户是否有使用这项服务的权限,校验完成,返回结果。

下面是创建一个虚机的流程:

 openstack基础架构 随笔 第1张

 

可以看出来keystone在各个组件间扮演着一个中间人的作用,每个服务于服务间使用或者某个用户与服务间的使用,都要先到keystone这里来认证。

Glance

Glance是一种提供发现,注册,和下载的镜像服务,也是一个提供虚拟机镜像的集中式仓库。通过GlanceRestful API,可以查询镜像元数据下载镜像,虚拟机的镜像可以很方便的存储在各种地方。它通过提供一个虚拟磁盘映像目录和存储库,为Nova的虚拟机提供镜像服务。

Glance有以下几个组件:

glance-apiglance-api是系统后台运行的服务进程。对外提供RESTAPI,响应image查询、获取和存储的调用。glance-api不会真正处理请求。如果是与imagemetadata(元数据)相关的操作,glance-api会把请求转发给glance-registry;如果是与image自身存取相关的操作,glance-api会把请求转发给该imagestore backend

glance-registryglance-registry是系统后台运行的服务进程。负责处理和存取imagemetadata,例如image的大小和类型。

Database:存储镜像元数据,Imagemetadata会保持到database中,默认是MySQL

Store backendGlance自己并不存储image。真正的image是存放在backend中的。

Nova

Compute Service Nova OpenStack最核心的服务,负责维护和管理云环境的计算资源。OpenStack作为IaaS的云操作系统,虚拟机生命周期管理也就是通过Nova来实现的。Nova处于Openstak架构的中心,其他组件都为Nova提供支持:GlanceVM提供imageCinderSwift分别为VM提供块存储和对象存储;NeutronVM提供网络连接。

1、组件

Nova的架构比较复杂,包含很多组件:

nova-api:接收和响应客户的API调用;

nova-scheduler:虚机调度服务,负责决定在哪个计算节点上运行虚机;

nova-compute:管理虚机的核心服务,通过调用Hypervisor API实现虚机生命周期管理;

nova-conductornova-compute经常需要更新数据库,比如更新虚机的状态,出于安全性和伸缩性的考虑,nova-compute并不会直接访问数据库,而是将这个任务委托给nova-conductor

nova-console:用户可以通过多种方式访问虚机的控制台:nova-novncproxy,基于Web浏览器的VNC访问、nova-spicehtml5proxy,基于HTML5浏览器的SPICE访问、nova-xvpnvncproxy,基于Java客户端的VNC访问;

nova-consoleauth:负责对访问虚机控制台请求提供Token认证;

nova-cert:提供x509证书支持;

Database:Nova有一些数据要存放到数据库中,一般使用MySQL,数据库安装在控制节点上。

Message QueueNova包含众多的子服务,这些子服务之间需要相互协调和通信,为解耦各个子服务,Nova通过Message Queue作为子服务的信息中转站,OpenStack默认是用RabbitMQ作为Message Queue

OpenStack是一个分布式系统,可以部署到若干节点上,对于Nova,这些服务会部署在两类节点上:计算节点和控制节点,计算节点上安装了Hypervisor,上面运行虚拟机,所以nova-compute需要放在计算节点上,其他子服务放在控制节点上的,控制节点上也可以运行了nova-compute,也就意味着控制节点也可以作为一个计算节点。

1、nova-scheduler

Filter schedulernova-scheduler默认的调度器,先通过过滤器(filter)选择满足条件的计算节点(运行nova-compute),然后通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建Instance,同时openstack允许使用第三方scheduler

Filter

Scheduler可以使用多个filter依次进行过滤,过滤之后的节点再通过计算权重选出最适合的节点,常用的filter有:

RetryFilter:刷掉之前已经调度过的节点;

AvailabilityZoneFilter:可用域过滤,过滤掉不属于指定AvailabilityZone的计算节点;

RamFilter:将不能满足 flavor 内存需求的计算节点过滤掉;

DiskFilter:将不能满足 flavor 磁盘需求的计算节点过滤掉;

CoreFilter:将不能满足 flavor vCPU 需求的计算节点过滤掉;

ComputeFilter:保证只有 nova-compute 服务正常工作的计算节点才能够被 nova-scheduler调度;

ServerGroupAntiAffinityFilter:尽量将 Instance 分散部署到不同的节点上;

ServerGroupAffinityFilter:尽量将 instance 部署到同一个计算节点上;

    Filter可以在Nova.conf配置文件中配置。

Weight

经过前面一堆filter的过滤,nova-scheduler选出了能够部署instance的计算节点,Scheduler会对每个计算节点打分,得分最高的获胜,目前nova-scheduler的默认实现是根据计算节点空闲的内存量计算权重值:空闲内存越多,权重越大。

2、nova-compute

nova-compute在计算节点上运行,负责管理节点上的instanceOpenStackinstance的操作,最后都是交给nova-compute来完成的;nova-computeHypervisor一起实现OpenStackinstance生命周期的管理。

nova-compute通过Driver架构支持多种Hypervisornova-compute为这些Hypervisor定义了统一的接口,Hypervisor只需要实现这些接口,就可以Driver的形式即插即用到OpenStack系统中,单个计算节点上只会运行一种 Hypervisor

nova-compute的功能可以分为两类:定时向OpenStack报告计算节点的状态;实现instance生命周期的管理。每隔一段时间,nova-compute就会报告当前计算节点的资源使用情况和nova-compute服务状态,nova-compute可以通过Hypervisordriver拿到计算节点的资源信息。

生命周期的管理包括instancelaunchshutdownrebootsuspendresumeterminateresizemigrationsnapshot等,以launch为例,nova-compute首先会根据指定的flavor依次为instance分配内存、磁盘空间、vCPU和网络资源,资源准备好之后,nova-compute会为instance创建镜像文件,首先将imageglance下载到计算节点,通过qemu-img转换成raw格式,然后将其作为backing file通过qemu-img命令创建instance的镜像文件,镜像文件指的是instance启动盘所对应的文件,image不会变,而镜像文件会发生变化,然后创建instanceXML定义文件,虚拟网络设备,最后启动实例。

从组件协作方面,用户向APInova-api)发送请求:“帮我创建一个Instance”;API对请求做一些必要处理后,向MessagingRabbitMQ)发送了一条消息:“让Scheduler创建一个Instance”;Schedulernova-scheduler)从Messaging获取到API发给它的消息,然后执行调度算法,从若干计算节点中选出节点ASchedulerMessaging发送了一条消息:“在计算节点A上创建这个Instance”;计算节点AComputenova-compute)从Messaging中获取到Scheduler发给它的消息,然后通过本节点的Hypervisor Driver创建Instance;在Instance创建的过程中,Compute如果需要查询或更新数据库信息,会通过MessagingConductornova-conductor)发送消息,Conductor负责数据库访问。

 openstack基础架构 随笔 第2张

 

其他几种生命周期操作需要申请资源的就会走scheduler,否则不需要经过scheduler,直接交由nova-compute处理。

其他几种生命周期操作:soft reboot只是重启操作系统,不需要调度;hard reboot是重启instance,相当于关机之后再开机,不需要调度;终止实例是删除指定的实例,镜像文件,网络资源等,不需要调度;Pause是将实例状态保存到内存,短时间停止实例,不需要调度;Resume是从内存中读回instance的状态,然后继续运行instance,不需要调度;Suspend操作将instance的状态保存到宿主机的磁盘上,不需要调度;Snapshot,是对instance的镜像文件(系统盘)进行全量备份,生成一个类型为snapshotimage,然后将其保存到Glance上,不需要调度;Rebuild会用snapshot替换instance当前的镜像文件,同时保持instance的其他诸如网络,资源分配属性不变,不需要调度;Shelve会将instance作为image保存到Glance中,然后在宿主机上删除该instance,不需要调度;unshelve的过程其实就是通过该image launch一个新的instancenova-scheduler也会选择合适的计算节点来创建该instance,需要调度;migrate会将原节点的实例停止,镜像文件上传到目的节点,然后在新节点启动instance,需要调度;Resizemigrate类似,只是在启动新instance时采用不同的flavor,需要调度;Live Migrate先将instance的数据迁移过来,主要包括镜像文件、虚拟网络等资源,源节点暂定instance,目标节点Resume instance,再将原节instance删除,InstanceLive Migrate的整个过程中不会停机,需要调度。

Cinder

操作系统获得存储空间的两种方式,一为通过某种协议(SAC,SCCI,SAN,ISCSI等)挂接裸硬盘,然后分区、格式化,创建文件系统,这叫做块存储;二是通过NFSCIFS等协议mount远程文件系统。

OpenstackCinder提供Block Storage Service来管理volume的生命周期,主要包括:1)提供RESTAPI来管理volume2)提供scheduler调用volume3)通过driver架构支持多种backend,如LVM,NFS,Ceph等。

Cinder包含几个组件:1cinder-api,接受用户的api请求,调用cinder volume2cinder-volume,管理volume的生命周期。3cinder-scheduler,通过调度算法选择最合适的存储节点创建volume4volume provider,存储设备,为volume提供物理存储空间。5RabbitMQCinder各个子服务通过消息队列实现进程间通信和相互协作。

下面通过一次创建volume操作来说明cinder工作流程:

 openstack基础架构 随笔 第3张

 

1、向cinder-api发送创建volume请求。

2cinder-apiRabbitMQ发送了一条消息。

3cinder-schedulerRabbitMQ获取到消息,然后执行调度算法,从若干计存储点中选出节点。

4cinder-schedulerRabbitMQ发送让存储节点创建volume消息。

5、存储节点的cinder-volumeRabbitMQ中获取到消息,通过drivervolume provider上创建volume

Neutron

Neutron管理的网络资源包括Networksubnetportnetwork包含local, flat, VLAN, VxLANGREsubnet是属于某个networkip段;port可以看做虚拟交换机上的一个端口。

Neutron 构成:

Neutron Server:对外提供网络API,接收请求,并调用Plugin处理请求。

Plugin:处理Neutron Server发来的请求,维护OpenStack逻辑网络的状态,并调用Agent处理请求。

Agent:处理Plugin的请求,负责在network provider上真正实现各种网络功能。

network provider:提供网络服务的虚拟或物理网络设备,例如Linux BridgeOpen vSwitch或者其他支持Neutron的物理交换机。

QueueNeutron ServerPluginagent之间通过Messaging Queue通信和调用。

 openstack基础架构 随笔 第4张

 

Neutron Server

Neutron Server主要做两件事:提供 API 服务和运行 PluginCore PluginService Plugin)下面是其基本分层结构:

 openstack基础架构 随笔 第5张

 

 

ML2 Core Plugin

ML2作为新一代的core plugin,提供了一个框架,允许在OpenStack网络中同时使用多种Layer 2网络技术,不同的节点可以使用不同的网络实现机制,解决了传统的core plugincore plugin agent一一对应的问题以及编写传统的core plugin需要编写大量重复和类似的数据库访问的代码的问题。

ML2对二层网络进行抽象和建模,引入了type drivermechansim driver。每一种网络类型都有一个对应的ML2 type drivertype driver负责维护网络类型的状态,执行验证,创建网络等;每一种网络机制也都有一个对应的ML2 mechansim drivermechanism driver负责获取由type driver维护的网络状态,并确保在相应的网络设备(物理或虚拟)上正确实现。

Service Plugin

Service Plugin 及其 Agent 提供更丰富的扩展功能,包括路由,load balancefirewall

 openstack基础架构 随笔 第6张

 

openstack网络类型:

local network

不会与宿主机的任何物理网卡相连,也不关联任何的VLAN ID,用于内部测试,local网络的流量只能局限在本节点之内。

 openstack基础架构 随笔 第7张

 

flat network

是不带tag的网络,要求宿主机的物理网卡直接与linux bridge连接,所以每个flat network都会独占一个物理网卡。

 openstack基础架构 随笔 第8张

 

vlan network

tag的网络,在物理网卡上创建了带vlanidvlan interface,连接到lingux bridgeinstance通过该vlan interface发送到的数据包就会打上该接口的tag,每个vlan network有自己的bridge,从而也就实现了基于vlan的隔离。

 openstack基础架构 随笔 第9张

 

Vxlan network

    VXLAN全称Virtual eXtensible Local Area Network,由于VXLAN的数据包在整个转发过程中保持了内部数据的完整,因此VXLAN的数据平面是一个基于隧道的数据平面。它是一种将二层建立在三层上的网络,通过将二层数据封装到 UDP 的方式来扩展数据中心的二层网段数量。VXLANIDVNI或者VNID)用24-bit标记,支持16777216个二层网段。

    VXLAN 定义了一个MAC-in-UDP的封装格式。 在原始的Layer 2网络包前加上VXLAN header,然后放到UDPIP包中。 通过MAC-in-UDP封装,VXLAN 能够在Layer 3网络上建立起了一条Layer 2的隧道。

 openstack基础架构 随笔 第10张

 

VXLAN使用VXLAN tunnel endpoint(VTEP)设备处理VXLAN的封装和解封。 每个VTEP有一个IP interface,配置了一个IP地址。VTEP使用该IP封装Layer 2 frame,并通过该IP interface传输和接收封装后的VXLAN数据包。

VXLANVTEP间建立隧道,通过Layer 3网络传输封装后的Layer 2数据。

 openstack基础架构 随笔 第11张

 

  这里发现数据时以UDP的形式发送的,那么TCP怎么办?这里其实是UDP封装的TCP连接,UDPTCP将做为两个独立的协议栈各自工作,相互之间没有交互。虚机始终认为自己是在用TCP交互。

  为了实现VLANVXLAN之间互通,VXLAN定义了VXLAN网关。VXLAN网关上同时存在两种类型的端口:VXLAN端口和普通端口。当收到从VXLAN网络到普通网络的数据时,VXLAN网关去掉外层包头,根据内层的原始帧头转发到普通端口上;当有数据从普通网络进入到VXLAN网络时,VXLAN网关负责打上外层包头,并根据原始VLAN ID对应到一个VNI,同时去掉内层包头的VLAN ID信息。

  在openstack上基本结构与vlan类似:

openstack基础架构 随笔 第12张

 

router

物理router或者虚拟router为我们提供跨subnet互联互通功能,在router上分别配子网的网关,就可以完成数据的路由。opestackl3 agent为每个router创建了一个namespace,通过veth pairTAP相连,然后将Gateway IP配置在位于namespace里面的veth interface上,每个namespace拥有自己的路由表,这样既可以隔离不同租户的网络,从而支持网络重叠,又可以完成路由。

 openstack基础架构 随笔 第13张

 

当租户网络连接到router,通常将router作为默认网关。

router接收到instance的数据包,并将其转发到外网时:

1. router会修改包的源地址为自己的外网地址,这样确保数据包转发到外网,并能够从外网返回。

2. router修改返回的数据包,并转发给真正的instance

这个行为被称作Source NAT

 

如果需要从外网直接访问instance,则可以利用floating IP

1. floating IP提供静态NAT功能,建立外网IPinstance租户网络IP的一对一映射。

2. floating IP是配置在router提供网关的外网interface上的,而非instance中。

3. router会根据通信的方向修改数据包的源或者目的地址。

 

Open vSwitch

 

Open vSwitch的网络设备有:br-ex,连接外部(external)网络的网桥;br-int,集成(integration)网桥,所有instance的虚拟网卡和其他虚拟网络设备都将连接到该网桥br-tun,隧道(tunnel)网桥,基于隧道技术的VxLANGRE网络将使用该网桥进行通信。

 

当我们创建一个子网,Neutron会为该子网启用一个dhcp接口,而每创建一个实例,都会创建一个linux bridge,一端连接实例的tap设备,另一端通过一个veth pair连接到br-int,而每一个子网都有一个tag,因为所有网络都是连接到br-int的,所以该tag是隔离不同网络的标识,local的网络,在ovs里表现如下:

 

openstack基础架构 随笔 第14张

 


    br-int是一个ovs网桥,但是我们可以连接网卡abc。。。,上面讲的所有instance的虚拟网卡和其他虚拟网络设备都将连接到br-int,那该如何区分呢,这就需要我们创建另一个ovs网桥,该网桥通过patch port连接在一起,flat的网络在ovs里表现如下:

openstack基础架构 随笔 第15张

 

ovs如何设置vlan的网络呢,上面提到一个tag,这个tag就是linuxvlan id,但是在ovs这里,这个只是内部idvlan的网络不采用这种方式隔离。OVS通过flow rule(流规则)来指定如何对进出br-int的数据进行转发,进而实现vlan之间的隔离。当数据进出br-int时,flow rule可以修改、添加或者剥掉数据包的VLAN tagNeutron负责创建这些flow rule并将它们配置到 br-intbr-eth1ovs网桥上。比如:

priority=4,in_port=2,dl_vlan=1 actions=mod_vlan_vid:100,NORMAL

priority=4,in_port=2,dl_vlan=5 actions=mod_vlan_vid:101,NORMAL

一般设置在创建的网桥上,就是把内部tag 1转换为vlan 100,内部tag 5转换为vlan 101,而:

priority=3,inport=1,dl_vlan=100 actions=mod_vlan_vid:1,NORMAL

priority=3,inport=1,dl_vlan=101 actions=mod_vlan_vid:5,NORMAL

一般设置在br-int上,就是将vlan 100转为内部tag 1,将vlan 101转为内部tag 5

如果需要访问外网,则需要将br-ex通过patch port连接到br-int,如果为虚机分配外网ip,则配置方式和之前一样,指定或dhcp一个ip地址,然后通过br-ex发出去;如果不为虚机分配外网ip,则需要通过router转发到br-ex

openstack基础架构 随笔 第16张

 

上面提到vxlan通过br-tun进行通信,需要把br-tun连接到br-int上,创建一个vxlan的网络,会在br-tun上创建一个特殊的port用来通信,指定了vxlan隧道本端VTEP和远端VTEP的地址,所以每两个VTEP就会生成一个portvxlan的数据通信都是从这两个port发出。

 openstack基础架构 随笔 第17张

ovsvxlan通信也是采用流规则实现的,br-tun上定义的规则的大致转发如下:

openstack基础架构 随笔 第18张

table 0br-int进来的包转发给table 2处理,将其他VTEP发来的数据转发给table 4处理。

table 2br-int进来的单播包转发给table 20处理,多播包转发给table 22处理。

table 4定义多条vxlan id和内部tag的映射关系,将其他VTEP发来的数据里的vxlan id转换为内部的tag,然后转发给table 10

table 10将包转发给br-int,并往table 20添加一些返程信息。

table 20依赖table 10的学习,学习内容包括vxlan id和内部tag的映射关系,目标的mac地址等,收到发往该mac的消息;或对应tag的消息,则会根据这个学习结果完成id转换和转发,不再发往table 22。如果没有对应规则,则转发到table 22

table 22将内部tag转换为vxlanid并发出。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄