前言
云计算架构作为一种基础设施服务几乎已经成为了现代Web开发的标配,它显著地降低了 DevOps
(Development and Operations)的门槛,通过云服务商提供的管理平台,Web应用开发人员可以轻松地在云上搭建自己的系统。作为一名云时代的全栈开发工程师,了解云计算架构背后的机制可以让我们更好地利用这个强大的基础设施,在设计、开发、部署和维护应用程序时做出更明智的决策。同时云计算是互联网技术的延伸,通过学习云计算架构,可以更深入地掌握互联网基础知识,这对于个人的技术水平也是一个很大的提升。
为了对云计算有一个全面的了解,最近在读 《图解云计算架构——基础设施和API》 一书,这本书主要以OpenStack
和AWS
为例,通过API来重点讲解IaaS云服务的本质。下面是边读边整理的学习笔记,一方面可以随时回顾,另一方面希望通过输出来促进自己思考。
(一)API在云计算中的作用
API就是云计算的本质
与传统环境相比,在云上搭建和管理基础设施时,根本的变化在于用户能够使用API来控制基础设施,并能够将基础设施抽象化。从这个角度来说,API就是云计算的本质。
1.1 云计算简介
- ”云计算“实现了什么?
简单通俗地说,云服务就是IT资源的自动售货机,提供了各种IT资源能够即需即用的环境。
- 云服务的分类
市面上的云服务可以从”谁使用服务“和”提供什么服务“这两个角度来分类。
-
根据”谁使用服务“来分类:公有云和私有云
- 私有云:仅限于企业内部用户使用
- 公有云:由多个企业的用户共享
在使用成本上,公有云的使用成本随着资源使用量的增加而线性增长,而私有云由于每当资源不足的时候就要增加一定数量的硬件资源,所以成本随硬件增加次数而呈阶梯式增长。
-
根据“提供什么服务”来分类:IaaS、PaaS、SaaS
- IaaS:Infrastructure as a Service, 基础设施即服务。提供虚拟化的基础设施(服务器、网络、存储、操作系统)
- PaaS:Platform as a Service, 平台即服务。提供开发环境、运行环境(中间件、框架)
- SaaS:Software as a Service, 软件即服务。提供应用程序。
SaaS和PaaS可以为各租户分别提供”应用程序功能“而无须进行基础设施的虚拟化,而IaaS为各租户分别提供”基础设施功能“,需要对底层的基础设施进行虚拟化。所以IaaS的一个显著特点就是它提供的资源脱离了物理环境并虚拟化了,而对于经过虚拟化抽象出的资源而言,使用API操作发挥了至关重要的作用。
1.2 云带来了基础设施的标准化
- 云带来搭建过程的标准化
IaaS云服务在云上看到的是经过标准化的虚拟资源,使用时无须关注个别物理设备的配置方法和功能的差异,硬件的升级也不会改变云的使用方法,只要按照同样的方式就可以搭建出跟原来类似的环境。这使得我们可以轻松将系统迁移到性能更高的新的云环境上,通过利用云来淘汰旧硬件,升级新硬件。
- 云带来组件的抽象化
物理设备所提供的功能受限于本身的硬件结构,而云上的组件不受这种限制。比如在云上准备虚拟机时,用户只需要根据使用目的,从预设的菜单中挑选”优先考虑CPU性能“或”优先考虑内存容量“的合适的实例类型,而无须关注具体的规格数值。
- 通过API充分利用云计算
云的操作方法:用户可以通过Web控制台(GUI)来操作云,也可以通过命令、程序或者云环境提供的自动化工具操作云。不管使用哪个操作方法,背后都是通过云API来进行操作的,这意味着整个搭建过程可以充分自动化。云API就是操作云的”最小单位“,只有理解了云API,才能理解云的基本功能。
(二)云上具有代表性的组件
2.1 基本概念
云环境是由“租户”、“区域”和“可用区”三大框架构成的。
1. 租户
- 分别计量每个租户的总资源使用量,在公有云中分别向每个租户收取使用费。
- 只有同一租户下的虚拟网络、虚拟实力、虚拟存储才能相互连接。
2. 区域
AWS为地理位置上比较远的不同地方提供称作“区域”的云基础设施,比如用户可以选择“东京区域”、“悉尼区域”等“区域”,从而指定云基础设施所在的国家和地区。使用OpenStack搭建私有云时,也可以将国内的多个数据中心的云基础设施作为不同的区域加以管理。
- 各区域的环境是独立的,所以不支持跨区域搭建虚拟网络的操作
- 对于每个区域而言,账户和租户信息并不是隔离的,每一个租户都可以访问多个区域。比如可以在“东京区域”和“悉尼区域”搭建相同的应用程序环境,并将悉尼区域作为灾难恢复环境使用。在切换区域时,需要将东京区域的数据复制到悉尼环境。
3. 可用区
AWS会为每个区域提供独立的云基础设施,当前使用的区域决定了启动虚拟机实例的地区。构成一个区域的云基础设施会分散部署在相应地区的多个数据中心,每个数据中心被视为一个”可用区“(AZ
,Available Zone)。
使用OpenStack搭建虚拟私有云时,还可以以更小的单位划分可用区,比如以同一数据中心的不同楼层或不同架构为单位划分。当多个Web服务器分散在不同楼层的多个可用区时,即使某一楼层的所有服务器都断电故障了,也不会出现所有Web服务器都停机的情况,这样就可以利用多可用区实现冗余。
对于AWS:
- 启动虚拟机实例或虚拟存储卷(Volume)时,可以指定使用哪个可用区。
- AWS的虚拟网络会为每个可用区提供子网,相当于虚拟交换机。
- AWS无法跨可用区连接虚拟机实例和虚拟存储。
对于OpenStack:
- OpenStack的虚拟网络可以跨多个可用区使用
- 在带宽不足的情况下,跨可用区连接可能导致数据传输速度很慢,最好避免跨可用区连接。
2.2 网络资源
在由多个区域构成的云环境中,需要为每个区域搭建独立的虚拟网络。本节介绍为各个区域搭建虚拟网络的组件。
1. 路由器
在AWS中,每个独立的虚拟网络称为VPC
(Virtual Private Cloud,虚拟私有云),每个区域内可配备多个VPC。在OpenStack中,每个租户只能在每个区域内拥有一个虚拟网络。
就像家庭局域网的私有网络一样,通常情况下,每个虚拟网络都会部署一台虚拟路由器,用于连接租户内的虚拟网络和外部网络。
2. 交换机(子网)
在OpenStack中,虚拟机实例上的虚拟NIC(Network Interface Controller)要连接到虚拟交换机上。每台虚拟交换机都会被分配到一个子网(私有IP地址的范围)。搭建网络时,要先定义“虚拟交换机”,然后再分配“子网”。在AWS中,没有虚拟交换机的概念,可以直接创建子网。我们不妨把AWS的子网看作“虚拟交换机”+“子网”。
定义了虚拟交换机后,还要将其连接到虚拟路由器上,这样就能跟外部网络通信了。
在物理网络环境中,可能会出现网络交换机上的连接端口数不足,需要级联多台交换机的情况。在云环境中的虚拟交换机无法级联,但是虚拟交换机可以无限增加连接端口,所以不会出现端口数不足的情况。连接端口在定义虚拟交换机的时候并不存在,直到要连接虚拟机实例时,OpenStack才会添加连接端口,然后把虚拟机实例的虚拟NIC连接到端口上。
可用区和虚拟交换机的关系:
- AWS的虚拟交换机(子网)需要部署在每个可用区内
- OpenStack的虚拟交换机可以跨区域内的可用区使用
3. 公有IP地址
虚拟网络中使用私有IP地址,在与外部网络通信时,需要通过虚拟路由器的NAT功能将稀有IP地址转换为公有IP地址。转换时可以采用下述两种方式:
- IP伪装(IP masquerade):虚拟机实例连接外部网络时共享虚拟路由器上的公有IP地址。家庭局域网也是采用这个机制。通过这个方式,我们可以从虚拟机实例连接到外部网络,但是无法从外部网络连接到虚拟机实例。
- 弹性IP(elastic IP):将某个公有IP地址分配给虚拟机实例。具体操作步骤:现在各租户申请能用作弹性IP的公有IP地址,然后将其中之一分配给某台虚拟机实例。这样就可以通过分配到的公有IP地址从外部网络连接到虚拟机实例。由于各区域的虚拟网络是独立的,所以要分别为各区域单独申请弹性IP。在OpenStack中,这种机制称为浮动IP(floating IP)。
4. 安全组
安全组(Security group)提供了对出入虚拟机实例的网络数据包进行过滤的功能。安全组指定允许通信的数据包要满足的条件,然后就可以应用在虚拟机实例上。过滤处理是在虚拟机实例和虚拟机交换机的连接端口进行的。
一台虚拟机实例可以指定多个安全组,比如可以先指定通用安全组,允许SSH连接等最基本的连接,再增加Web服务器安全组,以允许HTTP、HTTPS等用于扩展功能的连接。
2.3 服务器资源
在启动作为服务器资源的虚拟机实例时,需要指定若干个配置项。本节介绍这些配置项。
1. 模板镜像
虚拟机的启动离不开已安装好子操作系统的启动盘镜像。一旦指定了模板镜像,它的副本就会作为启动盘被连接到虚拟机实例上。
模板镜像的来源:除了云服务供应商提供的镜像,还可以使用用户上传注册的公有镜像或私有镜像。
2. 实例类型
实例类型(instance type)用于指定虚拟机的“规格”,包括虚拟CPU的数量、虚拟内存的容量、虚拟磁盘的容量等。在启动虚拟机实例前,需要从预设菜单中选择实例类型,以此来决定虚拟机实例的配置。
3. 连接网络和安全组
在将虚拟机实例接入网络时,需要指定要连接的虚拟交换机和要应用的安全组。若指定多台虚拟机,则要为每台目标虚拟交换机分别准备一个虚拟NIC。过程:
- 先在要接入的虚拟交换机上创建指定了IP地址的连接端口
- 然后虚拟机实例指定连接端口进行连接,特定的IP地址就分配给了虚拟NIC
4. 用于登录认证的密钥对
当用户登录虚拟机实例上的子操作系统时,云环境将采用标准的SSH公钥认证来认证用户的身份。
公钥认证的配置过程:
- 各租户的用户先创建专用的密钥对(公钥和私钥),并将公钥注册到云环境中(保存到用户信息数据库)
- 云环境将子操作系统的认证方式设置为使用公钥认证,并将cloud-init工具提前安装到以模板镜像形式提供的子操作系统中,在子操作系统首次启动时接收指定的公钥,进行SSH的认证配置。
- 用户使用私钥进行认证。
2.4 块存储资源
虚拟存储作为块存储资源提供了永久的存储数据的空间,即使虚拟机实例被停止或销毁,里面的内容也不会丢失。
虚拟存储在AWS中称为EBS
(elastic block store,弹性块存储),在OpenStack中称作块存储,或卷
(Volume)
1. 虚拟存储的基本使用方法
- 创建新的卷:指定容量,创建新的卷
- 连接到虚拟机实例上作为数据区使用:子操作系统会识别为新增的磁盘设备
- 创建快照:将卷从虚拟机实例上断开后,就可以创建快照来
- 通过复制快照来创建新的卷:然后再把新建的卷连接到虚拟机实例上
2. 从虚拟存储启动
启动虚拟机实例时,除了使用从复制模板镜像而生成的根磁盘,还可以从作为虚拟存储的卷启动子操作系统。这个功能在AWS中称为EBS Boot
,在OpenStack中称为Boot from Volume
。
好处:即使虚拟机实例被停止或销毁,操作系统区的卷依然完好无损。只要从该卷启动新的虚拟机实例,就能以旧虚拟机实例停止运行前的配置恢复子操作系统的使用。
启动过程:
- 通过复制模板镜像创建卷
- 启动虚拟机实例时,指定该卷作为启动卷
- 连接到虚拟机实例,启动子操作系统
- 快照:创建快照,然后复制快照将其副本作为新的卷
2.5 对象存储的基本功能
对象存储是以文件为单位存储数据的数据存储区,提供了可以通过HTTP或HTTPS协议来存取文件的类似于文件服务器的功能。
1. 基本功能
提供以文件为单位的存储数据的功能。不支持局部修改,需要先将文件取出,然后再把修改后的文件存储进去。可用性高,吞吐量大,适合存储大量的视频图片等文件。有时我们也称存储在对象存储中的文件为“对象”。
对象存储既支持从虚拟机实例上的子操作系统存取文件,也支持从外部网络直接存取文件。因此,对象存储可支持跨区域或跨可用区使用。
容器:
- 在对象存储中存储文件时,要先创建用来存放对象的“容器”。比如AWS中的S3存储桶就相当于容器。
- 容器类似于Linux系统中的目录。容器中不能再创建容器,但是可以在存取文件时加上目录名。
- 对文件设置存取权限时,要以容器为单位。
2. 版本控制和托管静态网站
版本控制功能会为每个存储在容器内的对象分配版本号。当覆盖同名文件时,会用新的版本号存储新文件,同时保留旧文件。这样就可以将文件内容还原为旧版本了。
托管静态网站:只要将容器的访问权限设置为公开,然后存入静态的HTML文件,就可以把对象存储用作简单的Web服务器。
3. 虚拟存储的备份
用作虚拟存储的卷能被备份到对象存储中。备份时,整个卷被分割成若干个大小固定的块,然后每个块分别作为一个文件被存储到对象存储中。另外,由于对象存储支持跨区域和跨可用区访问,对象存储还可以用于在多个区域或可用区之间复制卷的内容。过程:
- 区域A:将虚拟磁盘分块存储到容器中
- 区域B:从容器中还原
这样就实现了跨区域的虚拟磁盘复制。
2.6 应用
使用多可用区实现冗余架构:
- 采用多个可用区构成的主备架构,兼顾灾难恢复:比如AZ1作为主可用区,AZ2作为备可用区
- AWS会为每个可用区创建虚拟交换机(子网),OpenStack会为每个区域创建虚拟交换机
- 切换备可用区:AWS的可用区属于不同的子网,所以需要修改DNS记录或使用负载均衡来切换流量;OpenStack可以直接将浮动IP分配给新可用区的Web服务器虚拟机实例,不需要改变外部访问系统的IP地址。
使用虚拟存储实现数据保护:
- 把虚拟存储的卷连接到DB服务器的虚拟机实例上,用于持久化存储数据
- 对卷的内容定期备份:备份过程中需要把卷从虚拟机实例上断开,这会导致数据库在备份期间无法使用。因此可以先对卷创建快照,然后再对快照进行对象存储。获取快照比创建对象存储快,可以减少断开的时间。另外,还可以在虚拟机实例上连接一个专门用于存储备份数据的卷,通过数据库软件功能将备份文件输出到这个卷上,然后再对卷进行对象存储。
- 备份恢复,复制数据:AZ1中的卷无法直接连接到AZ2的虚拟机实例上,所以切换可用区时要将数据从AZ1的卷复制到AZ2中的卷,再连接到AZ2的虚拟机实例。可以通过对象存储的容器实现跨区复制,也可以直接用DB数据库自带的replication同步功能复制。
(未完待续)