一、前言

      计算是最核心的云服务,对于用户来说,取之不尽,用之不竭。按需使用的算力正是云计算的最主要的优势之一。

       从云计算架构发展历程看,经历了基于XEN,KVM,VMware和Hyper-V为核心的虚机技术,再到后来以Docker为代表的容器技术,以及目前流行的无服务器技术几个阶段,AWS计算服务也基于这几个阶段提供对应的服务,如基于虚机的EC2,基于Docker容器的ECS,以及无服务器的Lambda服务。

下面我们就来具体介绍这三种计算服务。

二、EC2

当我们开发一套管理系统程序,进行私有环境(非云环境)部署并运行起来,需要做哪些准备呢。

  1. 购买硬件服务器,其内存,硬盘,CPU等配置需要能支持管理系统的运行。
  2. 安装合适的操作系统,比如linux,windows。
  3. 进行网络配置,比如公网ip,端口,域名等。

等这些都准备就绪,就可以部署管理程序了,完成这些工作,没有个三五天很难搞定的。

    但对于EC2实例,只需要在AWS控制台轻松点击配置,就可以在几分钟内完成上面复杂的步骤。

     那么EC2是什么呢,其实质就是AWS提供的基于虚机的云服务器,其虚拟化架构开始采用的是成熟的XEN技术,2017年后,开始使用自研的Nitor架构,使得实例具备更高的性能以及更低的虚拟花销。对于用户来说,申请和配置一台EC2实例,就可以作为专属的服务器使用了。

1、EC2配置

       下面我们就来介绍配置EC2云服务器的几个重要步骤,包括镜像选择,实例配置,存储配置,网络和安全配置。

(1)镜像(AMI)配置

     镜像是一种模板,包含启动实例所需的软件配置(操作系统、应用程序服务器和应用程序)。

amazon云计算平台技术架构 amazon云计算技术原理_架构

      AWS提供了多种镜像来源。有来自社区开源的操作系统镜像,如centos,ubuntu,也有应用商店提供付费版本的镜像,如window,redhat等。当然我们还可以制作自己的镜像。

      比如前面管理系统程序的例子,当我们配置和部署一台EC2后,可以通过镜像导出工具,制作该EC2的镜像,后续EC2就可以直接使用该镜像进行部署,大大简化了程序部署和安装调试的工作。

      AMI一个重要属性就是根设备类型,它决定了使用该AMI创建的EC2实例的根存储类型,分为实例存储类型和EBS类型,在后面详情介绍。

(2)实例类型配置

       购买服务器时,我们需要选择合适的硬件配置,EC2也提供了多种实例类型配置的云服务器,用户可以根据其计算需求和场景,进行选择。

实例类型

描述

适合场景

系列

通用类型

提供平衡的计算、内存和网络资源,可用于各种不同的工作负载

应用程序服务器,微服务,中小型数据库等


M系列,T系列(突发型)

计算优化型

适用于需要高计算能力的应用场景

高性能 Web 服务器,高性能计算 (HPC),科学建模,分布式分析和Machine Learning 推理

C系列

内存优化型

处理内存中的大型数据集的工作负载实现快速性能

内存数据库,如Redis,Memcached 

R系列,X系列

存储优化型

用于需要对本地存储上的极大型数据集进行高性能顺序读写访问的工作负载

Hadoop 分布式计算、大规模并行处理数据仓库以及日志处理应用程序等

D系列,H系列,I系列

加速计算

使用硬件加速器或协同处理器来执行浮点数计算和图形处理等功能

点数计算、图形处理或数据模式匹配

G系列,P系列

       每种实例类型提供了多种系列,系列中又分为多种型号,为用户提供了丰富的选择。当然配置越高,租用的价格也越高。

        比如对于redis,可以选用计算优化型,在根据内存的负载以及网络要求,选择对应的型号。如果作为一般的缓存使用,可以选择R5系列;如果作为内存数据库,需要大内存的场景中,可以选择x1系列。

     在实际的工程中,一般预选几款进行基准测试,根据测试结果,再结合价格,区域等因素选择合适的机型。

(3)存储配置

    存储的选择就是为EC2服务器选择存储卷类型和容量,其中卷类型包括根设备卷和附加设备卷。

  1. 根设备卷

    当启动一个实例时,根设备卷 就是包含用于启动该实例的映像(AMI)。上面讲到,它的存储类型取决于所使用的AMI的根设备类型,包括实例存储和EBS存储。我们分别来看这两种类型的区别。

  • 实例存储

amazon云计算平台技术架构 amazon云计算技术原理_Lambda_02

     实例存储就是EC2服务器自带的存储,可以类比笔记本的自带的硬盘。AMI文件存储在S3上,当EC2实例启动时,从S3复制到实例存储。

     只要实例正在运行,实例存储卷上的所有数据便会存在,但是在实例终止时或是实例失败时(例如底层硬盘有问题时),会删除这些数据。所以实例存储支持的实例失败或终止后,该实例不能被恢复。

  • EBS存储

amazon云计算平台技术架构 amazon云计算技术原理_Lambda_03

      EBS是AWS提供的块存储,可以类比笔记本的外接硬盘或者U盘,当EC2实例启动时,使用的 AMI 所引用的Amazon EBS 快照创建 Amazon EBS 卷,根设备附加到该EBS卷上。

      可以看到,EBS卷是与实例分开的,所以由 Amazon EBS 提供支持的实例可以停止然后再重新启动,附加的卷中存储的数据不会受影响。

2、附加设备卷

      如果将根设备卷类比系统盘C盘,那么还可以根据所需容量,为EC2服务器添加附加的设备卷(类比D盘,E盘),附加的设备卷也可以选择实例存储卷和EBS卷,需要看所选的实例支持哪些类型,实例存储卷和EBS卷的特点可以参考根设备卷。

(4)网络和安全配置

关于网络的配置,主要有网络,子网,分配公有IP,DNS域名等。

关于安全配置,主要是安全组。

这部分内容我们将在AWS云计算技术架构探索系列之五-网络具体介绍。

2、EC2实例生命周期

      EC2实例从启动一直到其终止,将经过不同的状态转换,下图显示实例状态之间的转换。

amazon云计算平台技术架构 amazon云计算技术原理_amazon云计算平台技术架构_04

  • pendinig,实例正准备进入 running 状态。实例在首次启动时进入 pending 状态,或者在处于 stopped 状态后启动。
  • running, 实例正在运行,并且做好了使用准备。
  • stopping,实例正准备处于停止状态或休眠停止状态。
  • stopped,实例已关闭,不能使用。可随时启动实例。
  • shutting-down,实例正准备终止。
  • terminated,实例已永久删除,无法启动.

       需要注意的两点,对于stop,只有EBS卷类型实例才支持,实例存储类型实例是不支持的;一旦终止,实例存储类型的数据将丢失,而EBS卷类型的数据可以保留(通过设置保留)。

3、Auto Scaling

     在了解Auto Scaling之前,我们先来看一个场景,假设有一家游戏公司开发了一款游戏,白天用户量较低,保持3台服务器就够用了,晚上8:00-12:00是流量高峰期,需要10台服务器才能满足,如何设计容量来满足需求,有以下几个方法:

  1. 保持最低容量运行,3台服务器,流量高峰期进行限流,这样能保持成本最低,但是高峰期会影响用户体验。
  2. 保持最高容量运行,10台服务器,这样能支撑高峰期流量,但是显然不能做到成本最低。
  3. 弹性运行,通过脚本或者人工的方式,8:00之前扩容,12:00之后缩容,这种方式虽然兼顾成本和用户体验,但是方案较为复杂。

AWS提供了一套完整的可伸缩性解决方案,这就是Auto Scaling服务。

amazon云计算平台技术架构 amazon云计算技术原理_amazon云计算平台技术架构_05

         如上图所示,一组Auto Scaling服务下,管理多个EC2实例,可以配置实例范围(最小实例量,最大实例量),固定的实例数,以及扩展策略。

  1. 实例范围,确保组中的实例永远不会低于最小数量,也不会超过最大数量。当低于或者超过时,自动添加或者移除EC2实例。
  2. 固定实例数,Auto Scaling 监控其启动的每个 Amazon EC2 实例的运行状况。如果发现实例运行状况不佳,它将终止该实例,并启动新实例。
  3. 扩展策略,根据策略,调整实例数 。
  • 手工扩展策略,对于Auto Scaling组中的实例,可以手动添加或者移除。
  • 动态扩展策略,基于目标跟踪,比如CPU值,超过50%,扩展实例数,低于20%,缩减实例数。
  • 计划扩展策略,预先知道流量的变化周期,指定时间计划来调整,比如前面游戏公司的例子,就可以采用该策略。
  • 预测扩展策略,与计划扩展策略有点类似,区别在于它是根据指定的历史数据,以及算法,预测未来的值,从而调整实例数。

        Auto Scaling是支持跨可用区的(注意,不支持跨区域),在可用区之间实现EC2实例数的负载均衡。在工程实践中,Auto Scaling与ELB一起配合使用,实现实例运行状况的检查和流量的负载均衡。这部分将在网络部分详细介绍。

4、购买选项

    用户在购买EC2实例,不仅仅考虑实例的类型,还会考虑计费的模式,比如对于一些定时批处理任务,只需要在某一段计划时间内使用,其他大部分时间不需要持有。针对这些场景,AWS也提供了多种EC2的购买选项。

1、按需实例,按秒计费,其启动和停止完成由用户控制,随启随停。这也是最常用的实例类型,适用于短期不可预知且不能中断的应用程序负载。

2、Spot实例,价格要低于按需实例,最多节省90%的成本。这种实例有点类似期货,需要为spot实例指定一个可以接受的最高报价,如果这个时刻(按小时),spot的实际价格低于你的报价,且又有容量,则启动实例;反之,如果spot实际价格要高于你的报价,则停止实例。所以也称之为竞争价格。实例的启停是无法预知和控制的,所以一般应用于可以随时终端且无影响的应用程序,如批处理,大数据计算等。

3、预留实例,承诺使用1年或者3年,来得到较高的折扣。

  • 标准预留实例,可以修改一些属性,比如实例大小(同一系列),可用区。
  • 可交换预留实例,可以与具有不同配置的其他 可转换预留实例(包括实例系列、操作系统和租期)进行交换。
  • 计划预留实例,以一年为期限购买具有指定的开始时间和持续时间,并且每日、每周或每月重复一次的预留容量。

4、专用实例,没有其他的客户共享你的硬件实例,在单租户硬件上运行。

5、专用主机,EC2实例容量完全专供你使用的物理服务器,这种价格也是最昂贵的。一般用于现有软件需要基于特殊的许可,比如硬件加密卡。

三、ECS

     在讲ECS前,我们先来了解下Docke容器技术。

1、Docker技术

     Docker容器技术从2015年后开始大火,很多公司甚至跳过了虚机阶段,而直接使用了Docker容器技术,关于Docker技术对比虚机技术的优势,网上有非常丰富的资料,这里大概总结下:

  • 更小的运行损耗,虚机的架构臃肿,每一层都有资源开销,而docker更加的轻量化,开销较小。
  • 更快的启动速度,虚机的启动在分钟量级,而docker启动在秒级,甚至毫秒级。
  • 更高效的迁移,对于docker,每个程序和依赖环境打包成一个镜像,运行在容器中,能快速迁移。

amazon云计算平台技术架构 amazon云计算技术原理_aws_06

 2、ECS

      ECS(Amazon Elastic Container Service),是一个有高度扩展性的容器管理服务。它可以轻松运行、停止和管理集群上的Docker容器,你可以将容器安装在EC2实例上,或者使用Fargate来启动你的服务和任务。

      借助 Amazon ECS,您无需操作自己的集群管理和配置管理系统,也无需担心扩展管理基础设施。配置一个ECS服务,需要完成以下内容。

(1)容器/镜像/注册表

       要在 Amazon ECS 上部署应用程序,必须构建应用程序组件以在容器中运行,容器就类比一个集装箱,在集装箱里面有软件应用程序运行所需要的一切,包括了代码、运行环境、系统工具、系统函数库等,而将这些内容打包在一起,就是Docker镜像(Docker Image),类似于EC2的AMI。

       这些镜像文件通常会通过Dockerfile来构建,并且最终存放到注册表(ECR)内。这个Registry可以理解为摆放集装箱的码头,我们在需要某个类型的集装箱的时候就到码头去取。

amazon云计算平台技术架构 amazon云计算技术原理_架构_07

 (2)任务定义

       任务定义是一种 JSON 格式的文本文件,这个文件定义了构建应用程序的各种参数,包括启动类型(EC2,Fargate)应使用哪些容器、打开哪些端口以及任务中的容器应使用哪些数据卷等等。

     ECS任务定义有点类似AWS的CloudFormation。

(3)服务

    你可以定义一个服务(Service)来运行和管理一定数量的任务,通过调度,负责将任务放置到集群中。

  • 保证了一定数量的任务持续地运行,如果任务失败了会自动进行重新调度
  • 保证了任务内会注册一个ELB给所有容器

amazon云计算平台技术架构 amazon云计算技术原理_Lambda_08

(4)集群

     当使用Amazon ECS运行任务时,你的任务会放在到一个逻辑的资源池上,这个池叫做集群(Cluster)

    如果你使用EC2的启动类型,那么你的集群会是一组容器实例。

     如果你使用Fargate启动类型(后面重点介绍),那么ECS将会管理你的集群资源,你不需要管理容器的底层基础架构。

特点:

  • 集群包含了多种不同类型的容器实例
  • 集群只能在同一个区域内
  • 一个容器实例只能存在于一个集群中
  • 可以创建IAM策略来限制用户访问某个集群

(5)容器代理

     容器代理 在 Amazon ECS 群集内的每个实例上运行,代理向 Amazon ECS 发送有关资源的当前正在运行的任务和资源使用率的信息,同时接收来自 Amazon ECS 的请求时启动和停止任务。

amazon云计算平台技术架构 amazon云计算技术原理_amazon云计算平台技术架构_09

3、Fargate

      在任务定义的时候,需要指定启动类型,其中就有Fargate类型,AWS Fargate 是一种适用于容器的无服务器计算引擎,使用 Fargate无需预置和管理服务器,由AWS直接托管,用户仅专注于构建应用程序,是容器的Serverless。

    Fargate可以帮用户省去很多维护和管理成本,当然,如果需要加强对 EC2 实例的控制或支持更广泛的定制选项,那么请使用 ECS 或 EKS,不要使用 Fargate。

4、EKS

     Amazon EKS 是一项托管服务,对 Kubernetes进行了集成和管理,借助EKS用户无需安装和操作 Kubernetes 控制面板或工作线程节点。

      Kubernetes 由两大组件构成:运行容器的工作线程节点群集和管理容器在集群上的启动时间和位置并监控容器状态的控制面板。

    如果用户原来就采用Kubernetes管理,可以利用EKS快速迁移,当然也可以基于EC2自己安装Kubernetes。

四、Lambda

   Serverless在这几年云计算技术体系中非常火热,其主要有以下几个优点:

  • 节约资源成本,无需购买和持有硬件资源,大部分资源的利用率都是在50%以下。
  • 减少维护投入,没有服务器,也就不存在管理和维护基础设施了。
  • 天然高可用和高扩展性,不需要担心算力不够,随时自动扩容。

       Lambda是AWS提供的无服务器(Serverless)计算服务,用户仅需要考虑业务逻辑代码实现(Lambda函数),而无需关心这些代码的部署,以及支撑代码运行的资源,包括计算,存储,网络。

     1、Lambda能做什么

     Lambda函数能与AWS其他的服务集成,通过事件调用的方式触发函数的执行,实现业务逻辑的处理。

    常见的一个场景是,图片上传到S3存储桶,触发Lambda函数,生成该图片的缩略图存储到S3,通过将图片的元数据信息存储到DynamoDB。如下图所示。

amazon云计算平台技术架构 amazon云计算技术原理_架构_10

 哪些服务能与Lambda集成,常见的有:

amazon云计算平台技术架构 amazon云计算技术原理_Lambda_11

Lambda就像胶水一样,通过事件调用,将相关的服务集成到一起。

 2、Lambda使用有什么限制

     Lambda作为无服务器计算,虽然无需考虑其运行的计算资源,可用性以及扩展性,但是在对于函数的运行有一定的限制。

  • 内存,128M至10G。
  • CPU,与配置的内存成正比的线性分配CPU处理能力,比如256M内存的CPU处理能力是128M内存的两倍。内存为1792M时,函数拥有一个完整的vCPU处理能力。
  • 运行时间,不超过15分钟。
  • 存储空间,/tmp目录,不超过512MB空间。
  • 部署程序包大小,最大支持250MB。
  • 并发数,最大支持1000,可以申请提高。

3、Lambda如何确保安全

      Lambda承担胶水层的作用,即是被调用者,又是调用者,如上面的例子,对于存储原图的S3来说,Lambda是被调用者;对于DynamoDB来说,Lambda是调用者。

   对于第一种,可以为Lambda创建基于资源的策略,明确委托人(调用者),如上例中为S3存储桶资源对象。当然委托人除了设置是AWS服务,也可以是账户。

  对于第二种,可以为Lambda授予执行角色,明确调用的目标资源,如上例中为具体的DynamoDB资源。

五、总结

本篇介绍了AWS的三种计算服务,EC2,ECS以及Lambda。

1、EC2,是最常用的计算服务,提供基于虚机技术的计算实例。通过控制台,进行镜像配置,实例选择,存储配置以及网络和安全配就能完成一台实例的配置。

     其中EC2根据使用的场景,提供了多种系列和型号的实例供用户选择;同时也提供了多种计费模式的购买选项,如果预留实例,竞争实例等,满足用户的实际需要。

   AutoScaling可管理多个实例,根据策略配置,实现实例的弹性能力。

2、ECS,是一个有高度扩展性的容器管理服务,ECS服务包含容器镜像,任务定义,服务调度,集群配置等。

    Fargate是一种基于容器的无服务器的计算引擎,无需预置和管理服务器,由AWS直接托管,用户仅专注于构建应用程序。

   EKS是AWS托管的Kubernetes服务。

3、Lambda,是AWS提供的无服务器(Serverless)计算服务,通过事件触发,将相关的服务集成一起。

   使用Lambda,用户仅需要考虑Lambda函数逻辑代码实现,而无需关心这些代码的部署,以及支撑代码运行的资源,包括计算,存储,网络。