第1章 什么是云原生基础设施?

基础设施是指支持应用程序的所有软件和硬件。这包括数据中心、操作系统、部署流水线、配置管理以及支持应用程序生命周期所需的任何系统或软件。

已经有无数的时间和金钱花在了基础设施上。通过多年来不断的技术演化和实践提炼,一些公司已经能够运行大规模的基础设施和应用程序,并且拥有卓越的敏捷性。高效运行的基础设施可以使得迭代更快,缩短投向市场的时间,从而加速业务发展。

云原生基础设施是有效运行云原生应用程序的要求。如果没有正确的设计和实践来管理基础设施,即使是最好的云原生应用程序也会浪费。巨大的规模并不是遵循本书列出的实践的先决条件,但如果你想获得云计算的回报,你应该听从那些开创了这些模式的人的经验。

在我们探索如何构建用于在云中运行应用程序的基础设施之前,我们需要了解我们是如何走到这一步。首先,我们将讨论采用云原生实践的益处。接下来,我们将看一下基础设施的简要历史,然后讨论下一阶段的功能,称为“云原生”,以及它与你的应用程序,它运行的平台及业务之间的关系。

一旦您明白了这个问题,我们将向您展示解决方案以及如何实现它。

云原生优势

采用这本书中的模式的好处有很多。它们仿照谷歌、Netflix和亚马逊这些成功的公司——不是单靠模式保证它们的成功,而是它们提供了这些公司成功所需的可扩展性和敏捷性。

通过选择在公有云中运行基础设施,您可以更快地创造价值并专注于您的业务目标。只需构建您创建产品所需的内容,并从其他提供商那里获得服务,就可以缩短交付时间,提高灵活性。有些人可能因为“供应商锁定”而犹豫不决,但最糟糕的锁定是你自己建立的锁定。有关不同类型的锁定,以及您应该如何处理的更多信息,请参阅附录B。

消费服务还可让您使用您所需的服务构建定制平台(有时称为平台服务[SaaP])。当您使用云托管的服务时,您无需精专于操作运行应用程序所需要的每项服务。这极大地影响了您改变业务并为您的业务增值的能力。

当您无法使用服务时,您应该构建应用程序来管理基础设施。当你这样做时,规模瓶颈不再取决于每个运维工程师可以管理多少个服务器。相反,您可以像扩展应用程序一样来扩展您的基础设施。换句话说,如果您能够运行可扩展的应用程序,则可以使用应用程序扩展您的基础设施。

同样的好处适用于构建灵活且易于调试的基础设施。您可以使用与管理业务应用程序相同的工具来洞察您的基础设施。

云原生实践还可以缩小传统工程角色之间的差距(DevOps的共同目标)。系统工程师将能够从应用程序中学习最佳实践,并且应用开发工程师可以拥有应用程序运行所在的基础设施的所有权。

云原生基础设施的解决方案不一定适用于所有问题,您有责任了解它是否适合您的环境(参见第2章)。然而,它的成功在创造这些实践的公司以及许多采用推广这些模式的工具的公司中显而易见。请参见附录C的一个例子。

在我们深入了解解决方案之前,我们需要了解这些模式如何从创建它们的问题演变而来。

服务器

在互联网初始阶段,Web基础设施开始于物理服务器。服务器庞大,吵闹且昂贵,而且他们需要大量的电力和人员来保持它们的运行。他们受到广泛照顾,并尽可能保持长时间运行。 与云基础设施相比,购买这些设备并让应用程序运行在上面会更困难。

一旦你买了一个,它就是你的了,无论好坏,都要维护。使用物理服务器适合已确定成本的业务。持有物理服务器并运行的时间越长,您花费的钱越多。做适当的产能规划并确保您获得最佳的投资回报总是很重要的。

物理服务器非常棒,因为它们功能强大,可以根据需要进行配置。它们的故障率相对较低,并且使用冗余电源供应,风扇和RAID控制器来避免出现故障。他们也可以持续运行很长时间。企业可以通过延长保修和更换零部件,从购买的硬件中挤出额外的价值。

但是,物理服务器会导致浪费。服务器不仅没有被充分利用,而且还带来了很多开销。在同一台服务器上运行多个应用程序是很困难的。当服务器最大限度地用于多个应用程序时,软件冲突,网络路由和用户访问都变得更加复杂。

硬件虚拟化承诺可以解决其中的一些问题。

虚拟化

虚拟化使用软件来模拟物理服务器的硬件。虚拟服务器可以按需创建,完全可以通过软件编程,只要您可以模拟硬件,永远不会磨损。

使用hypervisor可以增加这些优势,因为您可以在物理服务器上运行多个虚拟机(VM)。它还允许应用程序可移植,因为您可以将虚拟机从一台物理服务器移动到另一台物理服务器。

然而,运行自己的虚拟化平台的一个问题是虚拟机仍然需要硬件来运行。公司仍然需要拥有运行物理服务器所需的所有人员和流程,但是现在容量规划变得更加困难,因为他们也必须考虑到虚拟机开销。至少,公有云出现之前就是如此。

基础设施即服务

基础设施即服务(IaaS)是云提供商的众多产品之一。它提供了原始的网络、存储和计算能力,客户可以根据需要使用它们。它还包括一些支持服务,如身份和访问管理(IAM)、供应和库存系统。

IaaS允许公司摆脱他们的所有硬件,并从别人那里租用虚拟机或物理服务器。这释放了大量人力资源,摆脱了购买、维护以及在某些情况下容量规划所需的流程。

IaaS从根本上改变了基础设施与业务的关系。不是随着时间的推移受益的资本支出,而是运营业务的运营支出。企业可以像支付电力和人们的时间一样支付基础设施。通过基于消费的计费,您越早摆脱基础设施,运营成本就越低。

托管的基础设施还为客户提供了可消费的HTTP应用编程接口(API),以便按需创建和管理基础设施。工程师不需要购买订单并等待物品出货,就可以进行API调用,并创建服务器。服务器可以轻松删除和丢弃。

在云中运行基础设施不会使您的基础架构成为云原生。IaaS仍然需要基础设施管理。在购买和管理物理资源之外,您可以(也有许多公司)认为IaaS与他们过去购买并在自己的数据中心架设的传统基础设施一模一样。

即使没有“货架和堆叠”,仍然有大量的操作系统、监控软件和支持工具。自动化工具帮助减少了运行应用程序所需的时间,但通常根深蒂固的流程会影响IaaS的全部优势。

平台即服务

就像IaaS对VM消费者隐藏了物理服务器一样,平台即服务(PaaS)也对应用程序隐藏了操作系统。开发人员编写应用程序代码并定义应用程序的依赖关系,平台负责创建运行,管理和暴露它所必要的基础设施。与需要基础设施管理的IaaS不同,PaaS中的基础设施由平台提供商管理。

事实证明,PaaS限制要求开发人员以不同的方式编写应用程序,以便平台可以有效管理。应用程序必须包含允许它们由平台管理而不访问底层操作系统的功能。工程师不能再依赖SSH登入到服务器来读取磁盘上的日志文件。现在应用程序的生命周期和管理由PaaS控制,工程师和应用程序需要进行适应。

这些限制带来了很大的好处。应用程序开发周期变短了,因为工程师不需要花时间管理基础设施。在平台上运行的应用程序是我们现在称为“云原生应用程序”的开始。他们利用代码中的平台限制,并且在许多情况下已经改变了今天编写应用程序的方式。

12因素应用程序

Heroku是提供公共消费型PaaS的早期先驱之一。通过自己平台的多年扩展,该公司能够确定帮助应用程序在其环境中更好运行的模式。Heroku定义了开发人员应该尝试实现的12个主要因素。

这12个因素是通过将代码逻辑与数据分离来使开发人员高效,尽可能自动化,独立的构建、传输和运行阶段过程;并声明所有的应用程序的依赖关系。

如果您通过PaaS提供商使用所有基础设施,恭喜,您已拥有云原生基础设施的诸多优势。这包括Google App Engine、AWS Lambda和Azure Cloud Services等平台。任何成功的云原生基础设施都将向应用工程师展示自助服务平台,以部署和管理他们的代码。

但是,许多PaaS平台不足以满足业务需求。他们通常会限制语言运行平台、库和功能以实现从应用程序中抽离基础架构的承诺。公有PaaS提供商还将限制哪些服务可以与应用程序集成以及这些应用程序可以在哪里运行。

公有平台交易应用程序的灵活性,使基础架构成为别人的问题。图1-1是如果您运行自己的数据中心,在IaaS中创建基础设施,在PaaS上运行应用程序或通过软件即服务(SaaS)运行应用程序时需要管理的组件的直观表示。

您需要运行的基础设施组件越少越好;但是在公有PaaS提供商中运行所有应用程序可能不是一种选择。

f-1-1

图1-1. 基础设施层

云原生基础设施

“云原生”是一个过度使用的术语。尽管它已被市场所劫持,但是对工程和管理仍然有意义。对我们来说,它意味着公有云提供商存在的世界中技术的变革。

云原生基础设施是隐藏在有用的抽象背后的基础设施,由API控制,由软件管理并具有运行应用程序的目的。利用这些特征运行基础设施,能以可扩展高效的方式管理该基础设施。

当它们成功地向消费者隐藏复杂性时,抽象是有用的。它们可以实现技术的更复杂的使用,但是它们也限制了技术的使用方式。它们适用于低级技术,例如TCP如何提取IP或更高级别的技术,如虚拟机如何抽象物理服务器。抽象应该总是允许消费者“向上移动堆栈”而不是重新实现底层。

云原生基础设施需要抽象基础IaaS产品以提供自己的抽象。新层负责控制它下面的IaaS,并将自己的API暴露给消费者控制。

由软件管理的基础设施是云中的一个关键区别点。软件控制的基础设施使基础设施能够扩展,并且在弹性,供应和可维护性方面也发挥着重要作用。软件需要了解基础设施的抽象概念,并知道如何获取抽象资源并相应地在可消费的IaaS组件中实现它。

这些模式不仅影响基础设施的运行方式,而且在云原生基础设施上运行的应用程序类型、在其上工作的人员类型与传统基础架构中是不同的。

如果云原生基础设施看起来很像PaaS产品,那么我们如何才能知道在构建自己的产品时需要注意什么?让我们快速描述一些可能看起来像解决方案的领域,但不提供云原生基础设施的所有方面。

什么不是云原生基础设施?

云原生基础设施不仅是在公有云上运行基础设施。仅仅因为你从其他人那里租用服务器时间并不会使您的基础设施云原生化。管理IaaS的流程通常与运行物理数据中心没有什么不同,许多将现有基础架构迁移到云的公司都未能获得回报。

云原生不是关于在容器中运行应用程序。当Netflix率先推出云原生基础设施时,几乎所有应用程序都部署了虚拟机映像,而不是容器。打包应用程序的方式并不意味着您将拥有自治系统的可扩展性和优势。即使您的应用程序是通过持续集成和持续交付渠道自动构建和部署的,这并不意味着您可以从可以补充API驱动部署的基础设施中受益。

这也并不意味着你只能运行容器编排器(例如Kubernetes和Mesos)。容器编排器提供了云原生基础设施所需的许多平台功能,但并未按预期方式使用这些功能,这意味着您的应用程序会被动态调度以在一组服务器上运行。这是一个非常好的起步,但仍有工作要做。

调度器与编排器

术语“调度器”和“编排器”通常可以互换使用。

在大多数情况下,编排器负责集群中的所有资源利用(例如:存储,网络和CPU)。该术语典型地用于描述执行许多任务的产品,如健康检查和云自动化。

调度器是编排平台的一个子集,仅负责选择运行在每台服务器上的进程和服务。

云原生不是微服务或基础设施即代码。微服务意味着更快的开发周期和更小的独特功能,但是单片应用程序可以具有相同的功能,使其能够通过软件有效管理,并且还可以从云原生基础设施中受益。

基础设施即代码以机器可解析语言或领域特定语言(DSL)定义、自动化您的基础设施。将代码应用于基础架构的传统工具包括配置管理工具(例如Chef和Puppet)。这些工具在自动执行任务和提供一致性方面有很大帮助,但是它们在提供必要的抽象来描述超出单个服务器的基础设施方面存在缺陷。

配置管理工具一次自动化一台服务器,并依靠人员将服务器提供的功能绑定在一起。这将人类定位为基础设施规模的潜在瓶颈。这些工具也不会使构建完整系统所需的云基础设施(例如存储和网络)的额外部分自动化。

尽管配置管理工具为操作系统的资源(例如软件包管理器)提供了一些抽象,但它们并没有抽象出足够的底层操作系统来轻松管理它。如果一位工程师想要管理系统中的每个软件包和文件,这将是一个非常艰苦的过程,并且对于每个配置变体都是独一无二的。同样,定义不存在或不正确的资源的配置管理仅消耗系统资源并且不能提供任何价值。

虽然配置管理工具可以帮助自动化部分基础设施,但它们无法更好地管理应用程序。我们将在后面的章节中通过查看部署,管理,测试和操作基础架构的流程,探讨云原生基础设施的不同之处,但首先,我们将了解哪些应用程序是成功的以及应该何时与原生基础设施一起使用。

云原生应用程序

就像云改变了业务和基础设施之间的关系一样,云原生应用程序也改变了应用程序和基础设施之间的关系。我们需要了解与传统应用程序相比,云本身有什么不同,因此我们需要了解它们与基础设施的新关系。

为了写好本书,也为了有一个共享词汇表,我们需要定义“云原生应用程序”是什么意思。云原生与12因素应用程序不同,即使它们可能共享一些类似的特征。如果你想了解更多细节,请阅读Kevin Hoffman撰写的“超越12因素应用程序”(O’Reilly,2012)。

云原生应用程序被设计为在平台上运行,并设计用于弹性,敏捷性,可操作性和可观察性。弹性包含失败而不是试图阻止它们;它利用了在平台上运行的动态特性。敏捷性允许快速部署和快速迭代。可操作性从应用程序内部控制应用程序生命周期,而不是依赖外部进程和监视器。可观察性提供信息来回答有关应用程序状态的问题。

云原生定义

云原生应用程序的定义仍在发展中。还有像CNCF这样的组织可以提供其他的定义。

云原生应用程序通过各种方法获取这些特征。它通常取决于应用程序的运行位置以及企业流程和文化。以下是实现云原生应用程序所需特性的常用方法:

  • 微服务
  • 健康报告
  • 遥测数据
  • 弹性
  • 声明式的,而不是反应式的

微服务

作为单个实体进行管理和部署的应用程序通常称为单体应用。最初开发应用程序时,单体有很多好处。它们更易于理解,并允许您在不影响其他服务的情况下更改主要功能。

随着应用程序复杂性的增长,单体应用的益处逐渐减少。它们变得更难理解,而且失去了敏捷性,因为工程师很难推断和修改代码。

对付复杂性的最好方法之一是将明确定义的功能分成更小的服务,并让每个服务独立迭代。这增加了应用程序的灵活性,允许根据需要更轻松地更改部分应用程序。每个微服务可以由单独的团队进行管理,使用适当的语言编写,并根据需要进行独立扩缩容。

只要每项服务都遵守强有力的合约,应用程序就可以快速改进和改变。当然,转向微服务架构还有许多其他的考虑因素。其中最不重要的是弹性通信,我们在附录A中有讨论。

我们无法考虑转向微服务的所有考虑因素。拥有微服务并不意味着您拥有云原生基础设施。如果您想阅读更多,我们推荐Sam Newman的Building Microservices(O’Reilly,2015)。虽然微服务是实现您的应用程序灵活性的一种方式,但正如我们之前所说的,它们不是云原生应用程序的必需条件。

健康报告

停止逆向工程应用程序并开始从内部进行监控。 - Kelsey Hightower,Monitorama PDX 2016:healthz

没有人比开发人员更了解应用程序需要什么才能以健康的状态运行。很长一段时间,基础设施管理员都试图从他们负责运行的应用程序中找出“健康”该怎么定义。如果不实际了解应用程序的健康状况,他们尝试在应用程序不健康时进行监控并发出警报,这往往是脆弱和不完整的。

为了提高云原生应用程序的可操作性,应用程序应该暴露健康检查。开发人员可以将其实施为命令或过程信号,以便应用程序在执行自我检查之后响应,或者更常见的是:通过应用程序提供Web服务,返回HTTP状态码来检查健康状态。

Google Borg示例

Google的Borg报告中列出了一个健康报告的例子:

几乎每个在Borg下运行的任务都包含一个内置的HTTP服务器,该服务器发布有关任务运行状况和数千个性能指标(如RPC延迟)的信息。Borg会监控运行状况检查URL并重新启动不及时响应或返回HTTP错误代码的任务。其他数据由监控工具跟踪,用于仪表板和服务级别目标(SLO)违规警报。

将健康责任转移到应用程序中使应用程序更容易管理和自动化。应用程序应该知道它是否正常运行以及它依赖于什么(例如,访问数据库)来提供业务价值。这意味着开发人员需要与产品经理合作来定义应用服务的业务功能并相应地编写测试。

提供健康检查的应用程序示例包括Zookeeper的ruok命令和etcd的HTTP / 健康端点。

应用程序不仅仅有健康或不健康的状态。它们将经历一个启动和关闭过程,在这个过程中它们应该通过健康检查,报告它们的状态。如果应用程序可以让平台准确了解它所处的状态,平台将更容易知道如何操作它。

一个很好的例子就是当平台需要知道应用程序何时可以接收流量。在应用程序启动时,如果它不能正确处理流量,它就应该表现为未准备好。此额外状态将防止应用程序过早终止,因为如果运行状况检查失败,平台可能会认为应用程序不健康,并且会反复停止或重新启动它。

应用程序健康只是能够自动化应用程序生命周期的一部分。除了知道应用程序是否健康之外,您还需要知道应用程序是否正在进行哪些工作。这些信息来自遥测数据。

遥测数据

遥测数据是进行决策所需的信息。确实,遥测数据可能与健康报告重叠,但它们有不同的用途。健康报告通知我们应用程序生命周期状态,而遥测数据通知我们应用程序业务目标。

您测量的指标有时称为服务级指标(SLI)或关键性能指标(KPI)。这些是特定于应用程序的数据,可以确保应用程序的性能处于服务级别目标(SLO)内。如果您需要更多关于这些术语的信息以及它们与您的应用程序、业务需求的关系,我们推荐你阅读来自Site Reliability Engineering(O’Reilly)的第4章。

遥测和度量标准用于解决以下问题:

  • 应用程序每分钟收到多少请求?
  • 有没有错误?
  • 什么是应用程序延迟?
  • 订购需要多长时间?

通常会将数据刮取或推送到时间序列数据库(例如Prometheus或InfluxDB)进行聚合。遥测数据的唯一要求是它将被收集数据的系统格式化。

至少,可能最好实施度量标准的RED方法,该方法收集应用程序的速率,错误和执行时间。

请求率

收到了多少个请求

错误

应用程序有多少错误

时间

多久才能收到回复

遥测数据应该用于提醒而非健康监测。在动态的、自我修复的环境中,我们更少关注单个应用程序实例的生命周期,更多关注关于整体应用程序SLO的内容。健康报告对于自动应用程序管理仍然很重要,但不应该用于页面工程师。

如果1个实例或50个应用程序不健康,只要满足应用程序的业务需求,我们可能不会收到警报。度量标准可让您知道您是否符合您的SLO,应用程序的使用方式以及对于您的应用程序来说什么是“正常”。警报有助于您将系统恢复到已知的良好状态。

如果它移动,我们跟踪它。有时候我们会画出一些尚未移动的图形,以防万一它决定为它运行。

——Ian Malpass,衡量所有,衡量一切

警报也不应该与日志记录混淆。记录用于调试,开发和观察模式。它暴露了应用程序的内部功能。度量有时可以从日志(例如错误率)计算,但需要额外的聚合服务(例如ElasticSearch)和处理。

弹性

一旦你有遥测和监测数据,你需要确保你的应用程序对故障有适应能力。弹性是基础设施的责任,但云原生应用程序也需要承担部分工作。

基础设施被设计为抵制失败。硬件用于需要多个硬盘驱动器,电源以及全天候监控和部件更换以保持应用程序可用。使用云原生应用程序,应用程序有责任接受失败而不是避免失败。

在任何平台上,尤其是在云中,最重要的特性是其可靠性。

——David Rensin,e ARCHITECT Show:来自Google的关于云计算的速成课程

设计具有弹性的应用程序可能是整本书本身。我们将在云原生应用程序中考虑弹性的两个主要方面:为失败设计和优雅降级。

为失败设计

唯一永远不会失败的系统是那些让你活着的系统(例如心脏植入物和刹车系统)。如果您的服务永远不会停止运行,您需要花费太多时间设计它们来抵制故障,并且没有足够的时间增加业务价值。您的SLO确定服务需要多长时间。您花费在工程设计上超出SLO的正常运行时间的任何资源都将被浪费掉。

您应该为每项服务测量两个值,即平均无故障时间(MTBF)和平均恢复时间(MTTR)。监控和指标可以让您检测您是否符合您的SLO,但运行应用程序的平台是保持高MTBF和低MTTR的关键。

在任何复杂的系统中,都会有失败。您可以管理硬件中的某些故障(例如,RAID和冗余电源),以及某些基础设施中的故障(例如负载平衡器)。但是因为应用程序知道他们什么时候健康,所以他们也应该尽可能地管理自己的失败。

设计一个以失败期望为目标的应用程序将比假定可用性的应用程序更具防御性。当故障不可避免时,将会有额外的检查,故障模式和日志内置到应用程序中。

知道应用程序可能失败的每种方式是不可能的。假设任何事情都可能并且可能会失败,这是一种云原生应用程序的模式。

您的应用程序的最佳状态是健康状态。第二好的状态是失败状态。其他一切都是非二进制的,难以监控和排除故障。 Honeycomb首席执行官CharityMajors在她的文章“Ops:现在每个人都在工作”中指出:“分布式系统永远不会起作用;它们处于部分退化服务的持续状态。接受失败,设计弹性,保护和缩小关键路径。“

无论发生什么故障,云原生应用程序都应该是可适应的。他们期望失败,所以他们在检测到时进行调整。

有些故障不能也不应该被设计到应用程序中(例如,网络分区和可用区故障)。该平台应自主处理未集成到应用程序中的故障域。

优雅降级

云原生应用程序需要有一种方法来处理过载,无论它是应用程序还是负载下的相关服务。处理负载的一种方式是优雅降级。 “站点可靠性工程”一书中描述了应用程序的优雅降级,因为它提供的响应在负载过重的情况下“不如正常响应准确或含有较少数据的响应,但计算更容易”。

减少应用程序负载的某些方面由基础设施处理。智能负载平衡和动态扩展可以提供帮助,但是在某些时候,您的应用程序可能承受的负载比它可以处理的负载更多。云原生应用程序需要知道这种必然性并作出相应的反应。

优雅降级的重点是允许应用程序始终返回请求的答案。如果应用程序没有足够的本地计算资源,并且依赖服务没有及时返回信息,则这是正确的。依赖于一个或多个其他服务的服务应该可用于应答请求,即使依赖于服务不是。当服务退化时,返回部分答案或使用本地缓存中的旧信息进行答案是可能的解决方案。

尽管优雅的降级和失败处理都应该在应用程序中实现,但平台的多个层面应该提供帮助。如果采用微服务,则网络基础设施成为需要在提供应用弹性方面发挥积极作用的关键组件。有关构建弹性网络层的更多信息,请参阅附录A.

可用性数学

云原生应用程序需要在基础设施之上建立一个平台,以使基础设施更具弹性。如果您希望将现有应用程序“提升并转移”到云中,则应检查云提供商的服务级别协议(SLA),并考虑在使用多个服务时会发生什么情况。

让我们拿运行我们的应用程序的云来进行假设。

计算基础设施的典型可用性是每月99.95%的正常运行时间。这意味着您的实例每天可能会缩短到43.2秒,并且仍在您的云服务提供商的SLA中。

另外,实例的本地存储(例如EBS卷)也具有99.95%的可用性正常运行时间。如果幸运的话,他们都会同时出现故障,但最糟糕的情况是他们可能会在不同的时间停机,让您的实例只有99.9%的可用性。

您的应用程序可能还需要一个数据库,而不是自己安装一个计算可能的停机时间为1分26秒(99.9%可用性)的情况下,选择可靠性为99.95%的更可靠的托管数据库。这使您的应用程序的可靠性达到99.85%,或者每天可能发生2分钟和9秒的宕机时间。

将可用性乘到一起可以快速了解为什么应以不同方式处理云。真正不好的部分是,如果云提供商不符合其SLA,它将退还其账单中一定比例的退款。

虽然您不必为停机支付费用,但我们并不知道世界上存在云计算信用的单一业务。如果您的应用程序的可用性不足以超过您收到的信用额度,那么您应该真正考虑是否应该运行这个应用程序。

声明式,非反应式

由于云原生应用程序设计为在云环境中运行,因此它们与基础设施和支持应用程序的交互方式与传统应用程序不同。在云原生应用程序中,与任何事物进行通信的方式都是通过网络进行的。很多时候,网络通信都是通过RESTful HTTP调用完成的,但它也可以通过其他接口(如远程过程调用(RPC))来实现。

传统的应用程序会通过消息队列,写在共享存储上的文件或触发shell命令的本地脚本来自动执行任务。通信方法对发生的事件作出反应(例如,如果用户单击提交,运行提交脚本)并且通常需要存在于同一物理或虚拟服务器上的信息。

无服务器

无服务器平台是云原生化的,并通过设计对事件做出响应。他们在云中工作得很好的原因是他们通过HTTP API进行通信,是单用途功能,并且在他们所称的功能中声明。该平台还可以通过在云中进行扩展和访问来提供帮助。

传统应用程序中的反应性通信常常是尝试增强弹性。如果应用程序在磁盘或消息队列中写入文件,然后应用程序死亡,则消息或文件的结果仍可能完成。

这并不是说不应该使用像消息队列这样的技术,而是说它们不能被依赖于动态和不断发生故障的系统中的唯一弹性层。从根本上讲,应用程序之间的通信应该在云原生环境中改变 - 不仅因为还有其他方法来构建通信弹性(请参阅附录A),还因为在云中复制传统通信方法往往需要更多工作。

当应用程序可以信任通信的弹性时,他们应该停止反应并开始声明。声明式沟通相信网络将传递消息。它也相信应用程序将返回成功或错误。这并不是说应用程序监视变化并不重要。 Kubernetes的控制器正是这样做到API服务器。但是,一旦发现变更,他们就会声明一个新的状态,并相信API服务器和kubelets会做必要的事情。

声明式通信模型由于多种原因而变得更加健壮。最重要的是,它规范了通信模型,并且它将功能实现从应用程序转移到远程API或服务端点,从而实现某种状态到达期望状态。这有助于简化应用程序,并使它们彼此的行为更具可预测性。

云原生应用程序如何影响基础设施?

希望你可以知道云原生应用程序与传统应用程序不同。云原生应用程序不能直接在PaaS上运行或与服务器的操作系统紧密耦合。它们期望在一个拥有大多数自治系统的动态环境中运行。

云原生基础设施在提供自主应用管理的IaaS之上创建了一个平台。该平台建立在动态创建的基础设施之上,以抽象出单个服务器并促进动态资源分配调度。

自动化与自治不一样。自动化使人类对他们所采取的行动产生更大的影响。

云原生是关于不需要人类做出决定的自治系统。它仍然使用自动化,但只有在决定了所需的操作之后。只有在系统不能自动确定正确的事情时才应该通知人。

具有这些特征的应用程序需要一个能够实际监控,收集度量标准并在发生故障时做出反应的平台。云原生应用程序不依赖于人员设置ping检查或创建Syslog规则。他们需要从选择基本操作系统或软件包管理器的过程中提取自助服务资源,并依靠服务发现和强大的网络通信来提供丰富的功能体验。

结论

运行云原生应用程序所需的基础设施与传统应用程序不同。基础设施用于处理的许多责任已经转移到应用程序中。

云原生应用程序通过分解为更小的服务来简化其代码复杂性。这些服务提供直接构建到应用程序中的监控,指标和弹性。需要新的工具来自动管理服务激增和生命周期管理。

现在基础设施负责整体资源管理、动态协调、服务发现等等。它需要提供一个平台,服务不依赖于单个组件,而是依赖于API和自治系统。第2章将更详细地讨论云原生基础设施功能。