面向 AWS 专业人员的 Google Cloud 指南:计算

更新时间:2017 年 11 月 21 日

比较 Amazon Web Services (AWS) 和 Google Cloud 在各自的云环境中提供的计算服务。计算服务通常有以下四种服务模式:

  • 基础设施即服务 (IaaS):这种模式下,用户可以直接按需访问虚拟机以及一套相关服务,从而自动执行常见任务。
  • 平台即服务 (PaaS):这种模式下,机器层完全被抽象化,用户通过使用高级服务和 API 与资源进行交互。
  • 函数即服务 (FaaS):一种无服务器计算模式,可让您单独运行各个函数以响应各种触发器。
  • 容器即服务 (CaaS):是 IaaS/PaaS 的混合,它将机器层抽象化,但保留了 IaaS 模式的大部分灵活性。

本文重点介绍 Google Cloud 和 AWS 提供的 IaaS、PaaS、FaaS 和 CaaS 服务。

IaaS 的比较

在 IaaS 方面,AWS 提供了 Amazon Elastic Compute Cloud (EC2),Google Cloud 则提供了 Compute Engine。Google 和 Amazon 采用相似的方法来实现 IaaS 服务。Amazon EC2 和 Compute Engine 均:

  • 是他们各自云环境的基本组件。
  • 用于运行其平台中几乎所有类型的客户工作负载。

概括来讲,Amazon EC2 与 Compute Engine 在术语和概念方面的对应如下所示:

特性 Amazon EC2 Compute Engine
虚拟机 实例 实例
机器映像 Amazon 系统映像 映像
临时虚拟机 Spot 实例 抢占式虚拟机
防火墙 安全组 Compute Engine 防火墙规则
自动实例调节 Auto Scaling Compute Engine 自动扩缩程序
本地附加磁盘 临时磁盘 本地 SSD
虚拟机导入 支持的格式:RAW、OVA、VMDK 和 VHD 支持的格式:RAW、OVA、VMDK 和 VHD
部署位置 地区 地区

虚拟机实例

Compute Engine 和 Amazon EC2 虚拟机实例具有许多相同的特性。通过这两种服务,您都可以:

  • 从存储的磁盘映像创建实例。
  • 按需启动和终止实例。
  • 不受限制地管理您的实例。
  • 标记您的实例。
  • 在您的实例上安装各种可用的操作系统。

机器访问

Compute Engine 和 Amazon EC2 处理机器访问的方式稍有不同:

  • 如果您希望终端访问实例,Amazon EC2 要求您添加自己的 SSH 密钥。
  • Compute Engine 让您可以在需要时创建密钥,即使您的实例已在运行也是如此。
  • 您可以使用 Compute Engine 基于浏览器的 SSH 终端,该终端在 Google Cloud Console 中提供,无需在本地机器上存储密钥。

实例类型

Amazon EC2 和 Compute Engine 都提供各种预定义的实例配置,包括特定数量的虚拟 CPU、RAM 和网络。

  • Amazon EC2 将这些配置称为实例类型
  • Compute Engine 将它们称为机器类型
  • Compute Engine 允许您脱离预定义配置,根据自己的工作负载自行定义实例的 CPU 和 RAM。

预定义实例可以按其预期用途大致分类,具体如下表所述:

机器类型 说明
共享核心

在单个物理 CPU 上占用一部分资源运行的机器。

适用于不需要大量资源但需要长时间保持在线状态的任务。

标准

提供平衡的计算、网络与内存资源的机器。

适用于大多数无特殊资源需求的一般应用。

高内存

内存与 vCPU 之比高于标准比率的机器。

适用于计算要求不高的内存密集型应用。这种应用的示例包括高性能数据库应用、必须保留大量数据缓存的应用,以及诸如企业管理系统等所有大型数据驱动型应用。

高 CPU

vCPU 与内存之比高于标准比率的机器。

适用于没有巨大内存需求的计算密集型应用。此类应用的示例包括数据转换软件(例如视频编码)、用于科学和工程的模拟软件,以及高流量 Web 服务器。

GPU

包含独立图形处理单元 (GPU) 的机器。

适用于需要高强度数学处理的应用。机器学习是一个典型的示例,但还有很多其他任务能够受益于 GPU 先进的数学处理提供的高效率。

SSD 存储

具有本地固态硬盘 (SSD) 存储设备的机器。

适用于依赖高吞吐量存储的应用。SSD 存储提供比磁存储速度更快的数据访问。

密集存储

具有高容量磁介质存储设备的机器。

适用于在本地磁盘上保留大量数据的应用。在许多情况下,具有大量存储要求的应用可以将数据存储在其他 Web 服务中,而不是存储在附加到虚拟机的磁盘上。

下表列出了截至 2016 年 5 月这两种服务所具有的实例类型。

机器类型 Elastic Compute Cloud Compute Engine
共享核心 t2.micro - t2.large f1-micro
g1-small
标准 m3.medium - m3.2xlarge
m4.large - m4.10xlarge
n1-standard-1 - n1-standard-64
高内存 r3.large - r3.8xlarge
x1.32xlarge
n1-highmem-2 - n1-highmem-64
高 CPU c3.large - c3.8xlarge
c4.large - c4.8xlarge
n1-highcpu-2 - n1-highcpu-64
GPU g2.2xlarge
g2.8xlarge
大多数机器类型可添加 GPU
SSD 存储 i2.xlarge - i2.8xlarge n1-standard-1 - n1-standard-64
n1-highmem-2 - n1-highmem-64
n1-highcpu-2 - n1-highcpu-64*
密集存储 d2.xlarge - d2.8xlarge 不适用

*虽然 Compute Engine 提供的机器类型与这些 AWS 实例类型并不完全匹配,但将 SSD 本地存储附加到其他机器类型可以得到相同功能的机器。

有几种高层级实例类型是 Compute Engine 和 AWS 都具有的,这包括标准、高内存、高 CPU 和共享内核。但是,Compute Engine 没有将使用本地 SSD 存储的实例划入特定类别 - 所有 Compute Engine 的非共享实例类型都支持添加本地 SSD 磁盘。请参阅本地连接存储,了解每种环境中如何实现本地连接的 SSD 的详细比较。

Compute Engine 目前不提供大型磁存储。

临时实例

临时实例是在分配给其他进程的资源的空闲周期运行的虚拟机。其结果是该虚拟机的可用性无法预测,但成本低于使用专用资源创建的虚拟机。临时实例非常适用于:

  • 可以中断而不丢失工作的作业。
  • 无需在特定时间内完成的低优先级作业。
  • 可用时,可以从提高计算能力中获益的作业的额外资源。例如,渲染视频。

Amazon EC2 提供的临时实例称为 Spot 实例,Compute Engine 提供类似的实例,称为抢占式虚拟机。两者提供的功能类似,但它们的定价模式不同。

Spot 实例和抢占式虚拟机均具有下列特点:

  • 可用实例类型和机器映像少于常规的按需实例。
  • 运行时能够达到按需实例的性能。
  • 运行时完全可控。

Amazon EC2 Spot 实例分为两种:

  • 常规 Spot 实例
    • 在 Spot 市场上竞价。
    • 出价被接受时开始运行。
    • 一直运行,直到您终止它们或 AWS 中断它们。
  • Spot 块
    • 具有固定价格,该价格低于常规按需费率。
    • 最多按折扣价运行 6 个小时。

Compute Engine 抢占式虚拟机在下列方面与 Spot 实例不同:

  • 价格固定。抢占式虚拟机的价格可以打折至接近按需费率的 80%,具体取决于机器类型。
  • 如果 Compute Engine 没有收回它们,抢占式虚拟机最多运行 24 小时,然后自动终止。
  • 如果您使用的是有许可费的付费操作系统,使用抢占式虚拟机时您仍需要支付全额许可费用。

机器映像

Compute Engine 和 Amazon EC2 都使用机器映像创建新实例。亚马逊将这些映像称为 Amazon 系统映像 (AMI),而 Compute Engine 只是简单地将它们称为映像。

Amazon EC2 和 Compute Engine 非常相像,以致于您可以在这两个平台上使用相同的工作流程来创建映像。例如,Amazon EC2 AMI 和 Compute Engine 映像都包含操作系统。它们还可以包含其他软件,例如 Web 服务器或数据库。此外,两种服务中都可以使用由第三方供应商发布的映像或为专用目的而创建的自定义映像。

Amazon EC2 和 Compute Engine 以不同的方式存储映像。在 AWS 上,您将映像存储在 Amazon Simple Storage Service (S3) 或 Amazon Elastic Block Store (EBS) 上。如果您基于存储在 Amazon S3 中的映像创建实例,则创建过程中延时将高于使用 Amazon EBS 中的映像。

在 Google Cloud 上,映像存储在 Compute Engine 中。 如需查看可用映像或者创建或导入映像,您可以访问 Cloud Console 映像页面或使用 Cloud SDK 中的 gcloud 命令行工具。

与 Amazon EC2 不同的是,Compute Engine 没有公开映像的机制,也没有可供用户从中提取可用映像的社区存储库。但是,您可以将映像导出到 Cloud Storage 并将其公开,从而以非正式方式共享映像。

Amazon 的机器映像仅在特定地区内提供。而 Compute Engine 的机器映像则为全球提供。

公共映像

Amazon EC2 和 Compute Engine 都提供带有常用操作系统的各种公共映像。在这两个平台上,如果您选择安装所带操作系统需要许可的付费映像,那么除了正常的实例费用外,您还需要支付许可费。

在这两种服务上,您都可以访问机器映像以获得最常见的操作系统。如需 Compute Engine 上所供映像的完整列表,请参阅公共映像列表

Amazon EC2 支持 Compute Engine 不作为公共映像提供的某些操作系统映像,例如:

  • Amazon Linux
  • Windows Server 2003(付费映像)
  • Oracle Linux(付费映像)

自定义映像导入

Amazon EC2 和 Compute Engine 都提供了将现有机器映像导入各自环境的方法。

Amazon EC2 提供的服务称为 VM Import/Export。此服务支持许多虚拟机映像类型(例如 RAW、OVA、VMDK 和 VHD),以及许多操作系统,包括各种 Windows、Red Hat Enterprise Linux (RHEL)、CentOS、Ubuntu 和 Debian。如要导入虚拟机,您可以使用命令行工具捆绑虚拟机映像,并将其作为 AMI 上传到 Amazon Simple Storage Service (S3)。

将机器映像导入 Compute Engine 的流程和要求与 Amazon EC2 的对应流程和要求类似。就像虚拟 Import/Export 一样,Compute Engine 导入工具支持 RAW、OVA、VMDK 和 VHD 映像类型,以及 Windows、RHEL、CentOS、Ubuntu 和 Debian 操作系统。如需导入虚拟机,请将映像上传到 Cloud Storage,然后使用 gcloud 命令行工具或 Cloud Console 完成将映像导入 Compute Engine 的流程。如需详细了解如何将映像和其他虚拟资源导入 Compute Engine,请参阅选择导入方法

如果您构建自己的自定义操作系统并计划在 Compute Engine 上运行它们,请确保它们满足自定义映像的硬件支持和内核要求

除了在 Amazon S3 或 Cloud Storage 中存储映像的费用之外,AWS 和 Google Cloud 各自的导入服务都不收取其他费用。

实例自动扩缩

Compute Engine 和 Amazon EC2 都支持自动扩缩功能,从而根据用户定义的政策创建和删除实例。自动扩缩功能可用于在任何给定点维持特定数量的实例,或者根据某些情况调整容量。它还可以根据用户定义的模板创建自动扩缩的实例。

Compute Engine 和 Amazon EC2 实现自动调节功能的方法类似:

  • Amazon 的 Auto Scaling 扩缩中的实例。自动调节程序根据您选择的扩缩方案来创建和移除实例。它根据启动配置创建组中的每个新实例。
  • Compute Engine 的自动调节程序可在托管实例组内扩缩实例数量。自动调节程序根据自动扩缩政策来创建和移除实例。它根据实例模板创建实例组中的每个新实例。

Amazon 的 Auto Scaling 支持三种调节计划:

  • 手动:您手动指示 Auto Scaling 向上或向下调节。
  • 按计划:您对 Auto Scaling 进行相关配置,使其在预定时间向上或向下调节。
  • 动态:Auto Scaling 根据政策进行调节。您可以根据 Amazon CloudWatch 指标或 Amazon Simple Queue Service (SQS) 队列创建政策。

相比之下,Compute Engine 的自动调节程序则仅支持动态扩缩。您可以根据平均 CPU 利用率HTTP 负载平衡传送容量Cloud Monitoring 指标来创建政策。

内部网络

Compute Engine 和 Amazon EC2 中的新实例都自动连接到默认的内部网络。此外,您还可以在这两种服务中创建备用网络并在该网络中启动实例。如需查看 Google Cloud 网络和 AWS 网络的完整比较,请参阅网络一文。

防火墙

Amazon EC2 和 Compute Engine 都允许用户配置防火墙政策,以选择性地允许和拒绝流量流入虚拟机实例。默认情况下,两种服务都会屏蔽从网络外传入的所有流量,为了使数据包能够到达实例,用户必须设置防火墙规则。

Amazon EC2 和 Amazon Virtual Private Cloud (VPC) 使用安全组网络访问控制列表 (NACL) 来允许或拒绝传入和传出的流量。Amazon EC2 安全组保护 Amazon EC2-Classic 中的实例,而 Amazon VPC 安全组和 NACL 保护 Amazon VPC 中的实例和网络子网。

Compute Engine 使用防火墙规则来保护 Compute Engine 虚拟机实例和网络。您可以指定源 IP 地址范围、协议、端口或表示虚拟机实例源组和目标组的用户定义标记,从而创建规则。

块存储

Amazon EC2 和 Compute Engine 都支持联网和本地连接的块存储。有关其块存储服务的详细比较,请参阅块存储

费用

本节比较 Compute Engine 和 Amazon EC2 的价格模式。

按需计价

Compute Engine 和 Amazon EC2 采用相似的按需计价模式对运行的实例进行计费:

  • Amazon EC2 按秒收费,一分钟起收。Windows 或 RHEL 等付费操作系统按小时收费,舍入到下一个小时。
  • Compute Engine 按秒计费,一分钟起收。

这两种服务都允许您无限期地运行实例。

折扣价格

在 Compute Engine 和 Amazon EC2 上,您获得折扣价格的方式非常不同。

在 Amazon EC2 中,您可以通过配置预留实例获得折扣价格:

  • 您必须承诺使用特定数量的实例一年或三年。
  • 您以较低的价格获得这些实例。
  • 三年期承诺的折扣大于一年期承诺。
  • 预付费用越多,折扣越大。
  • 预留实例在购买时绑定特定的实例类型和可用地区。
  • 您可以切换可用地区,并可将预留实例调换为同一系列中的不同实例类型。

您可以获得使用 Compute Engine 实例的持续使用折扣

  • Compute Engine 会根据实例在给定月份的运行时间自动对您的实例应用折扣。
  • 您在给定月份使用实例的时间越长,折扣越大。
  • 持续使用折扣可以为您节省多达 30% 的标准按需费率。

FaaS 的比较

在 FaaS(函数即服务)方面,Amazon 提供了 AWS Lambda,而 Google Cloud 提供了 Cloud Functions。这两种服务的服务模式类似:

  • 它们都是无服务器计算平台,可让您单独运行各个函数以响应各种触发器。
  • 您只在函数运行时才需要付费。
  • 它们为使用模式不均匀的服务提供了一种经济的托管方式。

服务模型比较

以下是 AWS Lambda 与 Cloud Functions 在术语和概念方面的对应:

特性 AWS Lambda Cloud Functions
代码提取 Zip 上传在线 IDE、桌面 IDEAmazon S3 Zip 上传、在线 IDE、Cloud Storage、GitHub
代码更新延时 通常在几秒钟内 通常不到 2 分钟
最大并发执行数量 默认情况下每个区域 1000 个 默认情况下每个函数 1000 个
部署大小上限 50 MB 压缩,250 MB 未压缩 100 MB 压缩,500 MB 未压缩
触发器 S3DynamoDB、Kinesis StreamsFirehoseSNSSESCognitoCloudFormationCloudWatchCodeCommit预定事件AWS 配置更改Amazon EchoAmazon LexAPI 网关 (HTTP)IoT ButtonCloudFront HTTPCloud StoragePub/SubFirebaseCloud Logging
支持的语言 Node.js、Java、Python、C#、Go Node.js 6Node.js 8Python
内存分配 128 MB 到 1.5 GB,每次增量为 64 MB 128 MB、256 MB、512 MB、1 GB、2 GB
超时限制 1 秒到 5 分钟 1 秒到 9 分钟
版本控制 内置 通过 Cloud Source Repositories
自动扩缩
日志记录 Amazon CloudWatch Cloud Logging
部署位置 区域 区域
价格模式 每个请求、执行时间(以 0.1 秒为单位)加上数据传输。执行时间费用随内存使用量而增加。 每个请求、执行时间(以 0.1 秒为单位)加上数据传输。执行时间费用随内存和 CPU 使用量增加。

启动与扩缩

AWS Lambda 和 Cloud Functions 的很多特性相同。两者都提供无服务器代码执行以响应各种触发器,并根据需要自动调节。两者都提供简单的部署、调节和故障恢复。此架构启动一个带有代码副本的计算容器,并自动调整实例数以处理您的请求负载。部署该功能后,无需调节任何配置或管理。

Google 采用抢占式映像生成架构,从而显著缩短任何新实例上第一批请求的延时。对于实时应用或应用必须非常快速扩展的情况而言,这可能是一个重要的优势。

支持的语言和触发器

Lambda 的推出时间长于 Cloud Functions,因此支持的语言和触发器类型更多。Cloud Functions 支持 Firebase 触发器、Google Cloud 的操作套件日志和 Pub/Sub。利用这些工具,您可以从几乎任何其他 Google Cloud 服务或事件触发 Cloud Function。

运行时限制

由于 FaaS 平台采用纯事务性设计,基于每个请求部署实例,因此您不能指望它们执行初始请求之后继续执行代码。您应该将应用设计为无状态的短期运行。Lambda 和 Cloud Functions 都是如此:

  • AWS 在 5 分钟后终止执行。
  • Cloud Functions 在 9 分钟后终止执行。

部署 FaaS

Amazon 和 Google 在部署 FaaS 方面采用的方式稍有不同。AWS Lambda 支持从 zip 或 jar 文件或通过 CloudFormation 或 S3 进行部署。除了 zip 文件,Google Cloud 的 Cloud Functions 还可以从 GitHub 或 Cloud Source Repositories 中的 Git 代码库进行部署。Git 支持将 Cloud Functions 与您的部署过程紧密联系。您甚至可以基于网络钩子配置自动更新

费用

AWS Lambda 价格包含每个请求的基本费率和基于 RAM 分配和计算时间的可变费率。AWS Lambda 按照标准 EC2 费率收取数据传输费用。

Cloud Functions 除了收取调用费率之外,还根据内存量和配置的 CPU 收取可变费率。Cloud Functions 与 AWS Lambda 一样,收取标准出站带宽费,但不收取入站流量费。

如需了解详情,请参阅 Cloud Functions 价格页面。如需估算您的具体工作负载需要多少费用,请尝试使用 Google Cloud 价格计算器

PaaS 的比较

在 PaaS 方面,AWS 提供了 AWS Elastic Beanstalk,而 Google Cloud 则提供了 App Engine。两种服务的功能类似:

  • 您可以通过将代码推送到托管的平台服务来发布应用。
  • 该服务管理以下方面:
    • 底层基础架构。
    • 自动调节。
    • 应用版本控制。

服务模型比较

AWS Elastic Beanstalk 配置并部署一套底层 AWS 资源,例如 Amazon EC2 实例或 Amazon RDS 数据库,以根据您的输入配置为应用创建相应的运行时。

App Engine 采用相同的模式。但是,App Engine 提供了两种不同的环境:App Engine 标准环境和 App Engine 柔性环境,每种环境设计时都考虑了特定的用例。

  • App Engine 标准环境中,您的代码部署到 Google 基础架构上运行的容器实例中。由于 App Engine 标准环境不依赖底层 Compute Engine 虚拟机实例,因此它比 App Engine 柔性环境的调节速度更快。但是,在自定义选项方面,App Engine 标准环境比 App Engine 柔性环境更受限制,您必须从服务预定义的一组运行时环境中选择一种进行使用。
  • App Engine 柔性环境中,您的代码将部署到 Compute Engine 虚拟机实例上运行的 Docker 容器中,这些容器由 App Engine 进行管理。它支持的运行时多于 App Engine 标准环境,您可以从中选择一种,也可以创建部分或完全自定义的运行时。但是,在高流量峰值期间,您应用的扩缩速度可能比在 App Engine 标准环境中要慢。如需了解哪种 App Engine 环境最能满足您的需求,请参阅选择 App Engine 环境

Elastic Beanstalk 可以与以下服务集成:

  • Amazon DynamoDB:完全托管的 NoSQL 数据库,可以存储和检索任意数量的数据。
  • Amazon RDS:由 MySQL、PostgreSQL、MariaDB、Amazon Aurora、Oracle、Microsoft SQL Server 提供支持的托管关系型数据库服务。
  • 自动扩缩和负载平衡。
  • 具有 SQS 集成的 Worker Tier 环境,允许处理后台和周期性任务。
  • 与其他 AWS 服务和 API 集成。

两种 App Engine 环境可以使用同一套平台服务,例如:

  • Firestore:支持查询、排序和事务的永久性存储空间。
  • Cloud SQL:由 MySQL 或 PostgreSQL 提供支持的关系型数据库(目前处于测试阶段)。
  • 自动扩缩和负载平衡。
  • 用于执行请求范围之外的工作的异步任务队列。
  • 用于在指定时间或按固定时间间隔触发事件的计划任务。
  • 与其他 Google Cloud 服务和 API 集成。

关键组件

AWS Elastic Beanstalk 和 App Engine 赖以运行的关键组件类似。从开发者的角度来看,AWS Elastic Beanstalk 包含以下关键组件:

  • 应用版本:开发者提交的可部署代码的已命名/已标记迭代。
  • 环境:部署在 AWS 资源上的特定应用版本的运行实例。
  • 环境配置:一系列参数和设置,用于控制 Elastic Beanstalk 如何为与特定环境关联的特定应用版本部署和配置底层 AWS 资源。
  • 应用:一系列环境、环境配置和应用版本的逻辑存储分区。

App Engine 包含以下关键组件:

  • 版本:开发者提交的可部署代码的已命名迭代,以及指定如何在 App Engine 上部署此代码以创建服务的配置文件。
  • 服务:App Engine 应用由一项或多项服务组成,每项服务都可以进行配置,以使用不同的运行时,并采用不同的性能设置执行操作。每项服务都包含源代码和配置文件。
  • 服务配置文件:指定网址路径与请求处理程序和静态文件的对应关系的文件。此文件还包含有关应用代码的信息,例如应用 ID 和最新版本标识符。
  • 实例:运行服务的底层计算资源。在 App Engine 柔性环境中,实例是 Compute Engine 虚拟机实例上的 Docker 容器。在 App Engine 标准环境中,实例是在 Google 基础架构上运行的容器。
  • 应用:包含一项或多项服务的逻辑存储分区。您可以对此存储分区进行配置,以使用不同的运行时,并采用不同的性能设置执行操作。

概括来讲,两个平台可以进行如下比较:

特性 AWS Elastic Beanstalk App Engine 标准环境 App Engine 柔性环境
支持的语言运行时 Java、PHP、.NET、Node.js、Python(2.6、2.7、3.4)、Ruby、Go Python 2.7、Java 7、PHP 5.5、Go 1.6 Python (2.7, 3.5)、Java 8、Node.js、Go 1.8、Ruby、PHP (5.6, 7)、.NET
自定义运行时环境
自动扩缩
可用免费层级 有(基于底层 AWS 资源的免费层级) 有(每天 28 个实例小时)
存储选项 Amazon S3、Amazon RDS、Amazon EFS、Amazon ElastiCache、Amazon DynamoDB Cloud Storage、Cloud SQL、Memcache、Firestore Cloud Storage、Cloud SQL、Memcache、Firestore
IAM 角色
可用位置 美国;欧洲、中东和非洲;亚太地区 美国;欧洲、中东和非洲;亚太地区 美国;欧洲、中东和非洲;亚太地区
应用用户身份验证和授权 无,必须在应用中开发 有,使用 Firebase(多个身份提供商)、Google Cloud Identity、OAuth 2.0 和 OpenID 有,使用 Firebase(多个身份提供商)、Google 和 G Suite 帐号、OAuth 2.0 和 OpenID
任务和消息队列 有,使用 SQS 有,使用 Pub/Sub 和 Task Queue API 有,使用 Pub/Sub 和 Task Queue API
应用升级和 A/B 测试 滚动更新,基于后端容量进行扩缩,蓝/绿部署,一次性流量交换。使用基于 DNS 的方法实现加权轮询。 有,在版本之间进行细粒度流量拆分 有,在版本之间进行细粒度流量拆分
监控 有,运行状况报告、实例日志和环境事件流 是,使用 Google Cloud 的操作套件(请求/响应和活动日志)、正常运行时间检查 是,使用 Google Cloud 操作套件(请求/响应和活动日志)、正常运行时间检查、自定义指标和基础 Compute Engine 资源提醒
网络 可以布置在 VPC 中 没有网络控制,仅向互联网公开 IP 端点 可以布置在 VPC 网络中
价格 基于底层 AWS 资源的费用 基于所选实例的时数 价格由 3 个参数组成:
  • vCPU(每核心小时)
  • 内存(每 GB 小时)
  • 永久性磁盘(每 GB 每月)
调试 有,使用 X-Ray 是,使用 Google Cloud 操作套件 是,使用 Google Cloud 操作套件

自定义运行时

AWS Elastic Beanstalk 和 App Engine 柔性环境都允许您创建自己的自定义运行时。该特性允许您使用其他编程语言或使用平台标准运行时的不同版本或实现。

AWS Elastic Beanstalk 支持通过自定义平台进行自定义,该自定义平台是 Amazon 系统映像 (AMI),包含运行应用所需的二进制文件。您可以使用 Packer 创建自定义平台,Packer 是一种开源工具,可以通过单一源配置为多个平台创建相同的机器映像。您可以使用 Packer 配置模板,自定义操作系统、语言和框架,以及为应用提供服务所需的元数据和配置选项。

App Engine 柔性环境支持通过自定义运行时进行自定义。如需创建自定义运行时,您可以使用所选基础映像创建 Dockerfile,然后添加用于构建所需运行时环境的 Docker 命令。您的 Dockerfile 中可能包含语言解析器或应用服务器等其他组件。您可以利用任何可以处理 HTTP 请求的软件。

在这两种情况下,您负责确保所有组件兼容并具有符合预期的性能。

AWS Elastic Beanstalk 使用 Packer 并允许用户控制整个操作系统映像。App Engine 柔性环境仅构建 Docker 容器,允许用户仅控制应用代码及其依赖项。App Engine 柔性环境不允许用户控制底层虚拟机上的操作系统内核版本等内容。

自动扩缩

AWS Elastic Beanstalk 和 App Engine 都支持自动扩缩。自动扩缩允许您根据应用的资源使用情况自动增加或减少正在运行的后端实例的数量。

AWS Elastic Beanstalk 可以根据以下扩缩选项配置自动扩缩:

  • 启动配置允许您选择调节触发器并描述它们的参数。
  • 手动扩缩允许您设置最小和最大实例数、可用性地区和扩缩冷却期。
  • 自动扩缩允许您设置基于指标的参数。支持的触发器包括:网络输入/输出、CPU 利用率、磁盘读/写操作/字节、延迟时间、请求数、运行状况良好/运行状况不佳的主机数。
  • 基于时间的扩缩允许您根据对周期性或一次性事件的预测来扩缩实例(设置最大、最小和/或所需的实例数)。

App Engine 标准环境提供以下调节选项:

  • 启动配置允许您选择调节选项并描述参数。
  • 手动调节允许您在开始时设置分配给服务的实例数。
  • 基本调节允许您设置最大实例数和空闲时间(即实例在收到最后一个请求后多久关闭)。
  • 自动调节允许您就服务的实例数、延时和并发连接数设置上限和下限。

App Engine 柔性环境提供以下调节选项:

  • 启动配置允许您选择调节选项并描述参数。
  • 手动调节的方式与 App Engine 标准环境相同。
  • 自动调节允许您设置最小和最大实例数、冷却期和目标 CPU 利用率。

应用升级和 A/B 测试

AWS Elastic Beanstalk 和 App Engine 中部署或升级应用的步骤类似:

  1. 在配置文件中描述您的应用。
  2. 使用命令行工具部署新版本。

这两种服务都还能通过它们的管理控制台提供部署。

在 AWS Elastic Beanstalk 上,执行就地更新会导致应用短暂中断。为避免中断,您可以执行蓝/绿部署,将新版本部署到单独的环境中,然后交换环境网址。每个环境只能具有一个活动版本。使用基于 DNS 的方法实现加权轮询。

App Engine 允许您在不停机的情况下进行当前版本的更新,创建并切换到新版本。您还可以将 App Engine 应用配置为根据请求者的 IP 地址或 Cookie 来拆分流量。每个应用的每项服务可以具有多个版本。

调试

为了进行调试,AWS Elastic Beanstalk 控制台允许您在开发环境中的实例上运行 AWS X-Ray 守护进程。该守护进程收集有关服务器请求以及应用与其他服务协作的数据。您可以构建一个服务映射,帮助您排查应用中的问题,并找到优化它的可行方法。

在 Google Cloud 上,您可以使用 Cloud Debugger 在任意代码位置检查 App Engine 应用的状态,而无需使用日志语句,也不必停止或减缓应用速度。调试期间您的用户并不会受到影响。在生产环境中使用该调试程序,您可以捕捉本地变量和调用堆栈,并将那些变量链接回源代码中特定的行位置。借助 Debugger,您可以分析应用的生产状态,并了解代码在生产中的行为。

监控

AWS 管理控制台上的 AWS Elastic Beanstalk 环境监控功能包含基本指标,如 CPU 利用率和网络输入和输出。Amazon CloudWatch 为底层实例添加了“环境运行状况”以及基本的 EC2 监控指标。用户还可以针对各项指标添加警报。所有 EC2 实例都会生成日志,供您用于排查应用出现的问题。

通过在 Google Cloud Console 信息中心中监控 App Engine 应用,您可以查看总请求、CPU 和内存利用率、延迟时间和实例正常运行时间等参数。Google Cloud 的操作套件允许您创建针对不同参数的提醒并存储日志。

网络

AWS Elastic Beanstalk 允许您管理环境所用 AWS 资源的连接。您可以提示 Elastic Beanstalk 将 EC2 虚拟机连接到特定 VPC,并在这些实例上配置安全组。这允许 Elastic Beanstalk 应用实现与 App Engine 柔性环境类似的网络连接透明度水平。

App Engine 标准环境完全抽象化网络配置。您必须进行的唯一网络相关设置应用于您的应用外部地址的负载平衡和自定义域名。您还可以使用 dos.yaml 文件建立网络“黑名单”,从而应用 DOS 防护服务。与应用一起部署时,它会提示 App Engine 显示错误页面以响应来自禁止 IP 范围的请求。

App Engine 柔性环境使用 Compute Engine 虚拟机在 Docker 容器中托管您的应用。您可以:

  • 配置由 App Engine 柔性环境管理的虚拟机以连接到 VPC 网络。VPC 网络可以与 Flex 应用驻留在同一个项目中,也可以跨多个项目进行共享。
  • 配置其中包含 App Engine 柔性环境实例的 VPC 网络,以使用 Cloud VPN 连接到其他目标。
  • 使用实例标记将防火墙设置应用于 App Engine 柔性环境实例。
  • 将 Flex 实例上的网络端口映射到 Docker 容器端口以进行调试和分析。

在您构建的 App Engine 柔性环境应用需要与 Google Cloud 或在其外部(本地或其他云环境)运行的其他服务透明连接时,该灵活性将有所帮助。

费用

AWS 不会对 Elastic Beanstalk 收取任何额外费用。您只需为底层 EC2 实例和其他资源付费。

App Engine 标准环境按实例运行的分钟数收费。计费从实例启动时开始,在手动关闭实例 15 分钟后或在基本实例处理完最后一个请求 15 分钟后结束。如果空闲实例数量超出“性能设置”中所设的最大空闲实例数,系统不会计费。自动扩缩模块还有每天 28 个免费实例小时,基本和手动扩缩模块则为每天 9 个免费实例小时。

App Engine 柔性环境会对您指定的虚拟机类型的资源收费。费用根据参数的使用量决定:

  • vCPU(每核心小时)
  • 内存(每 GB 小时)
  • 永久性磁盘(每 GB 每月)

这些费用按分钟收取,十分钟起收。

如需了解详情,请参阅 Compute Engine 价格页面。如需估算您的具体工作负载需要多少费用,请尝试使用 Google Cloud 价格计算器

CaaS 的比较

在 CaaS 方面,AWS 提供了 Amazon EC2 Container Service (ECS),Google Cloud 则提供了 Google Kubernetes Engine。

GKE 和 Amazon ECS 采用的服务模式非常相似。在每种服务中,您都创建容器节点集群。每个节点都是一个虚拟机实例,每个节点都运行一个节点代理,以表明它包含在集群中。每个节点还运行一个容器守护进程,例如 Docker,以便该节点可以运行容器化应用。您创建一个 Docker 映像,其中包含应用文件和运行应用的说明,然后在集群中部署应用。

Amazon ECS 由 Amazon 开发和维护。Google Kubernetes Engine 基于开源容器管理系统 Kubernetes 构建而成。

概括来讲,Amazon ECS 与 GKE 在术语和概念方面的对应如下所示:

特性 Amazon ECS GKE
集群节点 Amazon EC2 实例 Compute Engine 实例
支持的守护进程 Docker Docker 或 rkt
节点代理 Amazon ECS 代理 Kubelet
容器组 任务 Pod
部署规模调整服务 服务 副本控制器
命令行工具 Amazon ECS CLI kubectlgcloud
可移植性 仅在 AWS 上运行 在 Kubernetes 运行的任何地方运行

平台组件

集群

在 Amazon ECS 和 GKE 中,集群是虚拟机节点的逻辑分组。Amazon ECS 中的集群采用 Amazon EC2 实例作为节点。如需创建集群,您只需提供集群名称,Amazon ECS 即可创建集群。但是,默认情况下,此集群是空的。您必须先把容器实例启动到集群中,然后才能启动应用。

GKE 中的集群使用 Compute Engine 实例作为节点。要创建集群,首先要提供设置为所需值的基本配置详细信息,包括:

  • 集群名称
  • 部署地区
  • Compute Engine 机器类型
  • 集群大小

配置集群后,GKE 会在请求的地区内创建集群。

容器组

Amazon ECS 和 GKE 都将相互依赖或相关的容器集合组成更高层级的服务单元。在 Amazon ECS 中,这些单元称为任务,由任务定义进行定义。在 GKE 中,这些单元称为 pod,由 PodSpec 定义。在任务和 pod 中,容器都驻存在同一位置并协同安排,在共享的上下文中运行,具有共享的 IP 地址和端口空间。

容器守护进程

每台节点机器必须运行一个容器守护进程以支持容器化服务。Amazon ECS 支持 Docker 作为容器守护进程。Google Kubernetes Engine 支持 Docker 和 rkt。

节点代理

在 Amazon ECS 中,每个 Amazon EC2 节点都运行一个 Amazon ECS 代理,代表 Amazon ECS 启动容器。同样,在 GKE 中,每个 GKE 节点都运行一个 kubelet,维护节点上运行的容器的运行状况和稳定性。

服务发现

Amazon ECS 不提供原生机制的集群内服务发现。如要在给定集群内实现服务发现,解决方法是配置第三方服务发现服务(例如 Consul)。

GKE 集群实现服务发现的方法是通过默认启用的 Kubernetes DNS 插件。每项 Kubernetes 服务都会分配一个虚拟 IP 地址,该地址会在服务存续期间一直稳定。DNS 服务器会监视 Kubernetes API 以发现新服务,然后为每项服务创建一组 DNS 记录。这些记录允许 Kubernetes pod 自动执行 Kubernetes 服务名称解析。

调度

Amazon ECS 仅支持本机调度程序。

GKE 构建在 Kubernetes 之上,这是一个可插拔架构。因此,GKE 与 Kubernetes 调度程序完全兼容,后者是开源程序,能够在 Kubernetes 可以运行的任何环境中运行。

部署自动化

在 Amazon ECS 上,您可以创建脚本以在每个节点上部署任务。但是,该行为并未内置到服务中。

在 GKE 上,您可以使用 DaemonSet 在集群中的每个节点上运行特定 pod 的副本。在集群中添加或删除节点时,DaemonSet 会自动将 pod 复制到新节点,或者回收旧节点。删除 DaemonSet 时,DaemonSet 会清除它创建的所有 pod。

磁盘管理

由于 Amazon ECS 磁盘具有主机特定性,因此无法将依赖给定具体磁盘的容器移到其他主机。

相反,GKE 可以在节点上动态安装磁盘,并自动将磁盘分配给给定的 pod。您无需在特定节点上运行 pod 即可使用特定磁盘。

身份和访问权限管理

Amazon ECS 与 AWS 身份和访问管理(IAM)服务完全集成。GKE 目前不支持 Google Cloud 的 IAM 服务。

多租户

在 Amazon ECS 中,您可以通过创建单独的集群来实现多租户,然后手动配置 AWS IAM 以限制每个集群的使用。

相比之下,GKE 支持命名空间,从而允许用户对集群进行逻辑分组,并提供范围来支持多租户集群。命名空间允许:

  • 在单个集群上创建多个用户社区
  • 将集群分区的权限委派给可信用户
  • 限制每个社区可以消耗的资源量
  • 将可用资源限制为与特定用户社区相关的资源
  • 将给定用户社区所用的资源与集群上其他用户社区使用的资源隔离开来

运行状况检查

在 Amazon ECS 中,您可以使用 Amazon ELB 运行状况检查来检测故障。Amazon ELB 通过 HTTP/TCP 执行运行状况检查。为了接受运行状况检查,所有容器化服务都必须设置 HTTP 服务器,即使那些不需要监听 TCP 端口的服务也是如此。此外,每项服务都必须绑定到 ELB,即使服务不需要进行负载平衡也是如此。

在 GKE 中,您可以使用就绪和存活探针执行运行状况检查:

  • 就绪探针允许您在初始化期间检查 pod 的状态。
  • 存活探针允许您检测并重新启动已经不能正常运行的 pod。

这些探针包含在 Kubernetes API 中,可以配置为 PodSpec 的一部分。

可移植性

由于 Amazon ECS 代理仅能在 Amazon EC2 实例上运行,因此 Amazon ECS 配置实际上只能在 Amazon ECS 上运行。相比之下,由于 GKE 基于 Kubernetes 构建,Google Kubernetes Engine 配置可以在任何 Kubernetes 设备上运行。

费用

Amazon 对您在部署中使用的 Amazon EC2 实例和 Amazon EBS 磁盘卷收费。Amazon ECS 的容器管理服务并不收取额外费用。

Google Cloud 会对您在部署中使用的 Compute Engine 实例和永久性磁盘收费。此外,GKE 还按小时收取集群管理费用。具有五个或以下节点的集群则免收此费用。如需了解详情,请参阅 GKE 价格

后续步骤

查看其他“面向 AWS 专业人员的 Google Cloud 指南”文章: