AWS 上的无服务器或 Kubernetes

帮您选择

Amazon Web Services(AWS)使客户能够灵活选择策略,以构建符合其业务需求的现代化应用程序。针对在 AWS 上构建现代应用程序制定策略的客户,通常采用以下两种高级方法之一:使用 AWS Lambda 和容器的 AWS 无服务器策略模型,或 AWS 上的 Kubernetes

AWS 旨在针对您的工作负载提供访问适当计算和支持服务(如数据库、消息收发和编排)的权限。AWS 提供了使用事件驱动型计算服务(如 AWS Lambda)和无服务器容器选项(如 AWS FargateAWS App Runner)创建无服务器应用程序的功能。 AWS 提供了使用 Amazon Elastic Container Service(Amazon ECS)和 Kubernetes 选项(如 Amazon Elastic Kubernetes Service(Amazon EKS)、AWS 云端 Red Hat OpenShift 服务(ROSA)及 Amazon Elastic Compute Cloud(Amazon EC2)上的自托管式 Kubernetes)构建容器应用程序的方法。

以下内容将帮助您选择最适用于您环境的方法,并帮助您开始在 AWS 上实施您的方法。

现代应用程序的优势

使用模块化架构模式进行构建,并利用托管服务运营模型。

构建更具环境可持续性、可扩展性和弹性的应用程序。

加速创新、降低风险、加快上市时间,并降低总拥有成本(TCO)。

准备好开始在云中部署生产工作负载,以及明确定义的后续步骤。

步骤 1:确定您的标准

现代应用程序采用模块化架构模式构建,可以利用无服务器运营模型来构建更具可持续性、可扩展性和弹性的应用程序。它们使您能够加速创新、降低风险、加快上市速度,并降低总拥有成本(TCO)。 在构建新的现代应用程序或对现有应用程序进行现代化改造时,架构师和开发人员有大量的构建基块可用 - 其中最重要的构建基块之一是计算服务的选择。AWS 旨在为您提供访问适用于其工作负载的计算服务的权限 - 能为您确定的任何现代应用程序开发策略提供支持的选择,对于满足您的需求很有意义。

在确定应该实施哪种现代应用程序开发策略之前,您需要根据工作负载的大小确定标准。

  • 组织可以选择云,通过对托管服务进行标准化,将运营负担转移到 AWS,从而降低运营成本。更高的抽象级别使开发人员和运营商能够专注于自己独特的增值活动,而不是千篇一律的任务。

    使用 AWS Serverless 进行构建,会使用具有更高抽象级别的服务,将维护基础设施的运营开销转移到 AWS。

    AWS 还为 Kubernetes 提供了多种托管产品。这些产品在组织需要管理的技术层面上有所不同。AWS 还可提供加速器,如插件和 EKS 蓝图,以加速配置。

  • 很多 AWS 客户对受到广泛支持的开源技术进行标准化。开源使组织能够找到合适的技能 - 并避免锁定带来的某些风险。在开源生态系统中做出错误选择,可能会导致陷入抽象和自主集成。此外,使不同开源组件协同工作的责任通常由做出选择的组织承担。组织在维护开源集成上花费过多时间是很常见的现象。

    注意:

    • 在进行此类投资时,请考虑社群来源,以及来自企业或基金会的支持。对这些项目的投资不仅是金融投资。您还需要对您的团队开展有关所用技术的培训和教育进行投资。 
    • 您还可能承担一些技术债务(由于维护这些集成所涉及的工作),因为这些组件和相关集成通常需要更新。
    • 请访问 AWS 开源博客,以了解有关开源实施的想法。
  • 在选择现代应用程序开发策略时,您的策略必须适应各种工作负载模式。通过了解您的工作负载模式,您可以更轻松地做出架构选择。例如,Web 应用程序、基于 API 的微服务、事件驱动型应用程序、流式传输和消息收发、数据管道、IT 自动化等。与其他类型的计算环境相比,某些工作负载在某种计算环境中的性能更好或更经济高效。

    在使用 AWS Serverless 进行构建时,App Runner 和 AWS Batch 等服务旨在随时满足给定工作负载类型的需求。尽管以牺牲灵活性为代价,但使用这种方法的工作负载将更易于构建、性能更好,或更经济高效。

    如果贵组织需要,Kubernetes 可以提供跨云和本地环境的一致性。

  • 工作负载不是孤立存在的。工作负载由数据库、消息收发、流式传输、编排等技术和其他服务提供支持。有效的现代应用程序开发策略需要与这些服务集成。托管式集成既能降低运营开销,又能简化底层基础设施的管理。

    AWS Serverless 选项已深度集成在 AWS 生态系统中。AWS Lambda 可以订阅来自 200 多种其他服务的事件。例如,AWS Lambda 扩展可以实现与监控、可观测性、安全性和治理工具集成。Lambda 可在运行环境中调用给定函数,该环境将提供安全且隔离的运行时系统,函数代码将在其中运行。 

    适用于 Kubernetes 的 AWS 托管产品提供与托管产品的集成。Kubernetes 本身拥有丰富的合作伙伴生态系统,可与许多其他技术集成。

  • 很多客户需要创建实验来验证想法。这些原型可能是新应用程序的想法,和/或如果不成功,可以将其丢弃。能够提供可在其中快速编写、部署和验证想法的环境,对于健康的环境至关重要。在制定现代应用程序开发策略时,这种环境经常被忽视,但公司内部的创新能力可能取决于它。让团队能够使用可用于快速构建、测试和迭代的服务,对于发现新商机至关重要。

  • 很多客户希望确保其应用程序可在其他环境中运行,并可轻松迁移或移动到其他环境。他们希望能够保留移动云提供商或同时在本地和云中运行应用程序的选择权。这通常包括需要支持热门语言框架和开发方案。例如,Java 开发人员可能希望使用 Spring 或 Python,而数据工程师可能希望使用 PyTorch。仅靠选择现代开发应用程序方法是不够的。实现应用程序可移植性需要最佳实践和架构。我们建议在软件架构和建包方面培养能力,这样您能够更轻松地在计算服务之间移植差异化业务逻辑。

    使用某些技术构建的应用程序在某些计算服务上的运行可能比其他计算服务更有效。对于旧式应用程序,容器服务通常是比 Lambda 更好的迁移目标,后者需要更改架构。

  • 应用程序可移植性与自动化可移植性之间应该有明显区别。在大多数情况下,AWS Serverless 或 AWS Kubernetes 之间的选择实际上与应用程序是否可移植几乎无关。相反,基础设施团队和 DevOps 团队使用的工具才是关键因素。在 AWS 上选择 Kubernetes 方法的客户通常都会寻求基础设施和部署工具的可移植性。

  • 在决定是采用无服务器还是基于容器的方法进行现代应用程序开发时,组织的技能是一项主要因素。无服务器和容器都需要对 DevOps 和站点可靠性工程师(SRE)团队进行一些投资。构建自动化管道以部署应用程序对于大多数现代应用程序而言很常见。

    有些选择会提高管理工作量。例如,一些组织拥有运行和管理 Kubernetes 实施的技能及资源,因为他们对强大的 SRE 团队进行了投资,以管理 Kubernetes 集群。这些团队负责处理频繁的集群升级(例如,Kubernetes 每年发布三个主要版本,并且会弃用旧版本)。

    组织规模是一项关键因素,因为规模较小的初创企业可能仅有少量 IT 员工,每位员工都要履行多种角色,而大型企业可能要在生产中同时支持数百个工作负载。

  • 架构决策需要权衡,其中一项因素通常是成本。由于所涉及组件的动态性质,因此通常难以估算现代应用程序的成本。虽然一组固定服务器的成本更容易估算,但即使这些服务器没有增加业务价值,您也需要为它们付费。

    两种方法都提供了多种杠杆,以实现工作负载的成本目标。在各种方法之间进行高级选择时,不仅应该考虑资源方面的成本,还应考虑制定和维护该策略的工作量成本。AWS 定价计算器可以用于了解给定工作负载的成本。

  • 满足安全性和合规性要求是每项工作负载的基础。跨越两种策略的 AWS 服务使您能够满足严格的合规性要求。
     
    使用 AWS Serverless 进行构建,将使您能利用与 AWS Identity and Access Management(IAM)的集成来控制访问权限、原生 AWS 联网构造和来自 AWS 治理工具的支持。
     
    AWS 上的 Kubernetes 需要同时了解 Kubernetes 和 AWS 安全模型,并且可能需要在两种安全策略之间进行映射。Amazon EKS 等托管 AWS 产品可为在 EKS 上安全运行应用程序提供加速器。
  • 同时使用 AWS ServerlessAWS 上的 Kubernetes 进行构建,将使您能构建高性能、可扩展和具有弹性的工作负载。您可以满足所需的技术要求。抽象级别最高的服务可以管理各个 AWS 可用区的放置和环境扩展,从而提高性能和弹性。较低抽象级别将使您能更完善地控制工作负载的扩展方式。主要权衡因素包括成本和管理复杂性。

步骤 2:确定您要管理多少内容

现代化的主要优势之一是能够转移运营职责,使您能够腾出资源来开展更多增值和以创新为导向的活动。在不同的现代化级别中,有一系列责任共担选项,从 Amazon EC2(您可以在其中构建和运行代码,同时管理集成、扩展、安全配置、预置、修补等),到 AWS Lambda 等无服务器功能(您只需在其中管理应用程序代码)。

步骤 3:确定您的应用场景

我们建议您在默认策略中逐个工作负载评估最适用的计算选项:使用 AWS 的无服务器或 AWS 上的 Kubernetes。

AWS 上的无服务器策略的应用场景示例可能包括构建文档处理系统或处理网站工作负载。在该策略中,您可以选择 AWS Lambda 来构建主要由事件驱动的文档处理工作负载,选择 AWS AppRunner 来满足交易网站所需的低延迟和可扩展性。

同时,容器(以及 AWS 上的 Kubernetes)的示例应用场景可能是将现有应用程序迁移到微服务的渐进方法的组成部分。不费吹灰之力即可将很多旧式中间件应用程序修改为容器。

注意:一些组织将支持多个选项或工作负载模式,以允许工作负载或开发人员选择。

在下表中有很多其他应用场景,您在选择计算服务时可能需要考虑。

步骤 4:比较您的工作负载并做出正确选择

AWS 提供不同的容器选项(如 Amazon ECS、使用 AWS Fargate 的无服务器容器,和 AWS App Runner),以及不同的 Kubernetes 选项(如 Amazon EKS、ROSA 和 Amazon EC2 上的自主管理 Kubernetes)。

以下比较表可以帮助您根据工作负载需求确定方法。您可以选择两种方法的要素,也可以选择某种折衷方法,让不同团队使用不同方法。大型企业让各个部门采用不同策略的情况并不罕见。

 

  使用 AWS 的无服务器 AWS 上的 Kubernetes
工作负载 通过针对特定工作负载优化的特定服务,支持一系列工作负载模式。AWS Lambda 可以用于异步工作负载,而 AWS Fargate 则用于同步工作负载。 支持各种工作负载模式,其中首选跨云或本地数据中心的一致部署模型。
架构特征 通过特定服务支持大多数体系结构和模式,这些服务可以优化性能、可扩展性、可靠性和成本。 支持大多数架构,其中首选跨技术堆栈的一致性。提供某些级别的优化,但需要更多集成和管理工作。
集成 AWS Serverless 可以提供与很多托管服务的集成。某些选项(如 AWS Lambda)可以订阅 200 多种服务,并以托管方式接收事件。  很多合作伙伴提供 AWS 集成。 适用于 Kubernetes 的 AWS 托管产品提供与 AWS 服务的集成。Kubernetes 的合作伙伴生态系统非常丰富,并且提供与其他开源技术的集成。很多技术合作伙伴使用 EKS 作为验证其 Kubernetes 集成的首选。
原型制作 AWS Serverless 经过优化,允许客户快速编写、部署和更改代码,使其成为无需预先进行大量选择即可开展快速原型制作工作的有用选项。 拥有 Kubernetes 策略的客户通常需要设置专门用于原型制作的特殊集群,并像任何其他环境一样对其进行维护。
开销 AWS Serverless 旨在充分利用托管服务,只需对服务器、联网和集成进行极少的管理工作。 AWS 为 Kubernetes 提供了多种模式。这可能意味着需要管理多层技术(如集群和云联网),或 Kubernetes 和 AWS 安全角色,尽管 AWS 提供了插件和 EKS 蓝图等加速器。
生态系统 AWS 拥有庞大的合作伙伴生态系统,这些生态系统建立在 AWS 服务之上,可以提供解决方案和集成。AWS 建立在不同空间的很多开源技术之上,并采用了这些技术。 Kubernetes 是一个大型生态系统,在每个云中都能获得大力支持,并且拥有大量社群支持。  CNCF 环境就是这种庞大生态系统的一个示例。AWS 提供插件和蓝图,帮助客户采用其中一些常用工具。
应用程序可移植性 可以设计应用程序架构(适用于使用一项或多项托管服务的应用程序),使业务逻辑能从 Lambda、App Mesh 或 ECS 轻松移植到其他计算环境。 Kubernetes 可在大多数云和本地使用,并且工作负载大多是可移植的。某些 Kubernetes 模式依赖于代码中的服务网格(如 Istio,或 KNative 等编程模型),这意味着您的应用程序需要 Kubernetes,并且不能将其移植到 Kubernetes 以外的其他系统。某些功能可以将您锁定到特定版本。您可能需要重建映像,以支持各种 Linux 版本或特定硬件(ARM 或 AMD)。
自动化 使用基于开放技术的变种支持特定于 AWS 的自动化。示例包括 AWS CloudFormation、AWS Serverless Application Model(AWS SAM)和某些 AWS Cloud Development Kit(AWS CDK)库。客户可以使用 Terraform 等开源选项。很多 AWS 客户使用开源 DevOps 工具,如 Jenkins。 在 Kubernetes 上制定策略的客户通常会选择使用使 Kubernetes 实现自动化的工具。需要实现集群创建自动化,且您可以使用 AWS API、AWS CloudFormation 或 CDK 等 AWS 工具。很多客户使用 Terraform 等技术。AWS EKS Blueprints 是 Terraform 和 CDK 加速器的示例,用于创建集群和插件。很多客户开始采用 Flux 或 ArgoCD 等 GitOps 工具来部署 Kubernetes API,并使用 AWS 控制器或 Crossplane 等工具来预置原生云资源。
组织规模和技能 一些企业在主云上进行标准化,并首选 AWS Serverless,因为虽然他们可能有资金/资源来创建 SRE 团队,但他们选择使用 AWS 全力以赴优化敏捷性并降低运营成本。 大中型企业(或销售在不同云或本地数据中心运行的产品的软件供应商)通常使用 Kubernetes 优先的方法。成功的客户通常会对基础设施以及负责管理、运行和维护大量集群的 SRE 团队进行更多投资。
可扩展性/弹性 AWS Lambda 客户只需在调用函数时付费。如果 Lambda 不合适贵组织,可以使用 Fargate 或 ECS。在硬件架构和计算定价选项(如 AWS EC2 竞价型实例)方面提供更多选择。 可对 AWS 上的 Kubernetes 方法进行精心的架构设计,以满足您的性能、可扩展性和弹性要求。EKS 还提供了使用 AWS EC2 Spot 和 Graviton 等选项的功能。
安全性 AWS Serverless 方法利用 AWS 安全、联网和实践。 Kubernetes 方法需要同时了解 Kubernetes 安全和 AWS 安全,以及额外的运营开销,如将 Kubernetes 安全策略映射到 AWS 策略、保障容器映像和运行时系统的安全,以及验证第三方容器工具。  

在构建新的现代应用程序或对现有应用程序进行现代化改造时,架构师和开发人员有大量的构建基块可用 - 其中最重要的构建基块之一是计算服务的选择。

了解贵组织构建和部署的工作负载及应用程序的类型,是选择现代应用程序开发策略的一项关键因素。每种工作负载都有不同的特征和要求。例如,文档处理工作负载的延迟和正常运行时间要求与交易网站截然不同。

步骤 5:规避常见陷阱

了解您的环境中的标准化

很多运行多种工作负载模式的组织都希望对他们可以有效支持和运行的一组模式进行标准化。一些大型组织试图对计算选项进行标准化,并选择默认平台来运行大多数工作负载,在需要时提供例外情况。

标准化有助于提供一致性,并最大限度减少组织需要聘用的拥有专业技能的人数。这些均可成为首选计算选择,仅在首选选择不起作用时才会考虑其他选项。通常,标准选择能够有效支持一组工作负载,但很难为其他工作负载提供支持。因此,一些组织将支持多个选项或工作负载模式,以允许工作负载或开发人员选择。

了解贵组织环境中的集成

一些组织在维护开源集成方面花费的时间通常都会超出他们的预期。

我们建议您在进行此类投资时,考虑社群来源和/或来自企业或基金会的支持。对这些项目的投资不仅是金融投资,也是对知识资本和潜在技术债务的投资,因为这些组件和相关集成通常都需要更新。有关更多信息,请参阅 AWS 开源博客

了解您的架构特征

支持各种架构的能力非常重要。我们建议您使用 AWS Well-Architected Framework 作为指南,帮助您了解在 AWS 上构建系统时所做决策的利弊。此外,使用该 Framework 可以让您学习架构最佳实践,以便在云中设计和运营可靠、可扩展、安全、高效且经济实惠的系统。

步骤 6:确定您的方法

根据贵组织的具体情况,以及工作负载规模、模式和业务需求,您可能需要选择两种方法的某些要素,或让不同团队使用不同方法。让各个团队使用不同策略的情况并不罕见。

使用 AWS 的 AWS Serverless

  • 使用 AWS 托管服务和工具作为您的首选,如 AWS LambdaAWS App RunnerAmazon ECSAWS Fargate。 
  • 投资制定有关 AWS 的规则,包括预置、DevOps、基础设施自动化、安全、联网和可观测性/运营。
  • 提高生产效率并最大限度减少运营负担。

AWS 上的 Kubernetes

  • 使用 Kubernetes 作为您的主要计算平台接口。
  • 采用有关运行和管理多个 Kubernetes 集群及其上的工作负载和工具、GitOps 等高级模式的规则。
  • 与不同生态系统和合作伙伴工具集成。
  • Kubernetes 客户可以针对某些应用场景使用托管 AWS 服务和其他计算选项,如 AWS Lambda。

实施您的方法

现在,您已确定哪种方法最适用于您所处环境的工作负载,我们建议您查看以下资源,以帮助您开始实施您的方法。

  • AWS 上的无服务器概述
    使用无服务器优先策略、以提高整个应用程序堆栈敏捷性的方式构建现代应用程序。本指南重点介绍适用于堆栈的所有三个层级(计算、集成和数据存储)的无服务器服务。
    构建无服务器 Web 应用程序
    在本教程中,您将了解如何使用 AWS Lambda、Amazon API Gateway、AWS Amplify、Amazon DynamoDB 和 Amazon Cognito 创建简单的无服务器 Web 应用程序。
    无服务器计算实操研讨会
    这些免费的指导性研讨会介绍使用 AWS Lambda、AWS Step Functions、Amazon API Gateway、Amazon DynamoDB、Amazon Kinesis 和 Amazon S3 等服务构建无服务器应用程序和微服务的基础知识。
    AWS Fargate:适用于容器的无服务器计算
    AWS Fargate 是一种无服务器、随用随付的计算引擎,可让您专注于构建应用程序,而无需管理服务器。AWS Fargate 与 Amazon Elastic Container Service(Amazon ECS)和 Amazon Elastic Kubernetes Service(Amazon EKS)兼容。
    AWS App Runner 概述
    可以使用 AWS App Runner 构建、部署和运行容器化 Web 应用程序及 API 服务,无需事先具备基础设施或容器经验。
  • 选择 Kubernetes 方法
    查看您使用 Amazon Elastic Kubernetes Service(EKS)托管 Kubernetes 服务在 AWS Cloud 和本地数据中心上运行 Kubernetes 的选项。
    Amazon EKS 入门
    提供开始使用 Amazon EKS 的分步指南,其中包含有用的博客、视频和详细教程的链接。
    Amazon EKS 研讨会
    亲身体验如何充分利用 Amazon EKS 的分步说明。
    AWS Controllers for Kubernetes(ACK)简介
    ACK 这款工具可帮助您直接从 Kubernetes 管理 AWS 服务。ACK 帮助您轻松构建使用 AWS 服务的可扩展且高度可用的 Kubernetes 应用程序。
    什么是 AWS 云端 Red Hat OpenShift 服务?
    探索如何使用 ROSA 创建使用 ROSA API 和工具的 Kubernetes 集群,以及如何实现 AWS 服务的全部广度和深度。

    最佳实践

    安全性

    安全性是配置和维护 Kubernetes 集群和应用程序的关键组件。Amazon EKS 默认提供安全托管的 Kubernetes 集群,但您仍然需要确保配置作为集群一部分运行的节点和应用程序,以确保安全实施。有关更多信息,请参阅 Amazon EKS 安全最佳实践指南

    主机安全

    Amazon Inspector 是一项自动化漏洞管理服务,可以使用它来持续扫描 AWS 工作负载是否存在软件漏洞和意外网络暴露。

此页内容对您是否有帮助?