1.3 走向云原生
云原生是一种全新的软件开发和部署模式,核心思想是将应用程序和基础设施彻底解耦,以容器化、微服务和自动化运维为基础,构建高可扩展、高可用、高弹性和安全的云端应用系统。随着云计算、大数据、人工智能等技术的快速发展,云原生已经成为一个新的趋势和发展方向。
1.3.1 云原生架构发展史
云原生架构支持在云环境中设计、部署和运行应用程序,旨在提高应用程序的可扩展性、可靠性和安全性。
云原生架构的发展轨迹可参考图1-3。
图1-3 云原生架构发展轨迹
基于图1-3,云原生架构发展可以概括为以下几个阶段。
第一阶段:容器技术的出现(2013—2014年)
容器技术的出现打破了传统虚拟化技术的限制,使应用程序可以更加便捷地在不同的平台和云环境中运行,为云原生架构的实现奠定了基础。相较于传统虚拟化技术,容器技术具有更轻量级的特性,支持在同一个操作系统运行多个应用程序,同时不会产生额外的虚拟化开销。
容器技术(如Docker)已经成为云原生架构的核心技术之一,进一步提高了云原生应用的可移植性和弹性。
第二阶段:云原生技术的兴起(2015—2018年)
随着容器技术的广泛应用,Kubernetes、Mesos等云原生技术相继涌现,解决了传统应用程序在云环境中面临的一系列问题,例如不能自动适应变化的负载和恢复故障、部署和管理烦琐、耗时和易错等。通过使用云原生编排技术,开发人员可以将应用程序和依赖项打包成一个可移植的容器镜像文件,并使用编排工具自动协调和管理容器部署、负载均衡、故障恢复等任务。这使应用程序可以更加高效、可靠地运行于任何云环境,而开发人员无须担心环境差异和复杂性问题。
第三阶段:云原生生态的形成(2019年至今)
云原生架构已经成为大多数应用程序开发、部署的最佳选择。在云原生生态的形成过程中,不断涌现的新技术,比如服务网格、持续集成和持续部署(CI/CD)等提供了很多支持。服务网格可以实现微服务之间的通信和流量控制,使得应用程序的开发和部署更具可控性和可靠性。CI/CD技术可以自动化应用的构建、测试、部署等过程,缩短开发周期,提高生产效率。
总体来说,云原生架构是一个不断发展的领域,融合了云计算、容器、微服务和DevOps等技术,使得应用开发和部署更加高效、可靠和可管理。随着更多新技术的出现,云原生架构将会有更广阔的应用前景和更大的发展潜力。
1.3.2 云原生架构
随着业务变革和技术创新,“云原生”这个词一直萦绕在我们耳旁。虽然云原生的理念由来已久,但大家对于云原生架构的理解却千差万别。
那么,到底什么是云原生架构?云原生与开源、云计算有什么关联?为什么技术从业者和企业会选择云原生架构?对于这些问题的看法,一千个人眼中有一千个哈姆雷特。
1.云原生架构的概念
对于云原生架构的理解各有差异,但其本质始终保持一致。
从技术角度来看,云原生架构是基于云原生生态相关技术构建的一种架构模型,包含一系列设计模式和架构原则。这些原则可以将云应用中的非业务代码部分最大限度地提取、分离,以便底层云基础设施接管应用中原有的非功能特性,如弹性、扩展性、观测性、灰度等。这使业务与非功能业务得以解耦,同时具备轻量、敏捷、流水线等快速交付特性。
从交付角度来看,云原生架构是一种创新的软件开发方法,专为充分利用云计算模型而设计,结合了云服务、DevOps和软件开发原则,从网络、服务器、数据中心、操作系统和防火墙中抽象出所有IT层。这使组织能够基于微服务架构将应用程序构建为松耦合的服务,并在动态编排的平台上运行。采用云原生架构的应用程序具有高可靠性、高性能,并能更快上市。通过云原生架构,企业可以更好地应对业务变化,快速实现创新,以及更高效地管理和运营自己的IT基础设施。
从业务角度来看,云原生架构利用云服务实现动态和敏捷的应用程序开发,使用基于云的微服务而非单一应用程序基础架构来构建、运行和更新软件。捆绑在云计算基础设施上运行的容器中的微服务构成了云原生应用程序。这些应用程序可以部署在私有云、公有云、混合云或多云环境中,以支撑构建的业务系统。云原生架构的优势在于能够提供高可用性、高弹性和高灵活性的应用程序部署与管理,从而帮助企业更好地应对业务变化和市场挑战。
图1-4 云原生架构关联技术参考示意图
云原生架构关联技术参见图1-4。
2.为什么选择云原生架构
为什么我们要选择云原生架构?
在数字化时代,企业面临诸多挑战。而云原生架构是帮助企业应对这些挑战的一种独特方法。云原生架构可以帮助企业针对业务痛点解决传统IT架构所带来的问题。云原生架构将新的操作工具、编排器、持续集成和容器引擎以及其他服务集成在一起,使应用程序的开发、设计、构建和运行变得更加便捷。通过采用云原生架构,企业能够更好地应对市场需求的变化,更快地推出新产品,并更好地满足客户需求。
同时,全球大大小小的互联网企业都在深入了解自动化的价值,以缩短产品的上市时间。在这个过程中,DevOps发挥着重要作用,能够协同开发团队和运维团队,促进高效协作和流程优化。云技术也不断推进企业转型,优化开发和测试过程,使企业能够更快地推出新产品。
除此之外,采用云原生架构还可以减少风险问题,例如错误、加载速度慢等问题。随着SaaS行业的快速发展,可扩展的开发能力成为迫切需求。企业需要支持不断增长的用户群并控制成本,这也是采用云原生架构的重要原因之一。通过采用云原生架构,企业可以更加灵活地开展业务,更快速地推出新产品,并且更好地满足市场需求。
在IaaS的世界中,企业只需在获得新客户或扩大业务规模时支付额外的资源使用费用,避免了高额的前期资本和运营支出。同时,云平台支持弹性的资源分配,使企业能够更好地适应不断变化的产品需求,更加灵活地开展业务。这些优势让企业能够更加专注于创新和业务拓展,提高效率和竞争力。
综上所述,如果企业想要在数字化时代保持竞争优势,那么采用云原生架构是一个不可或缺的选择。
3.云原生架构的基本构建原则
基于实际的业务模型,在项目开发活动中,设计和运行云原生应用程序需要遵守一系列原则,以实现最佳业务实践。接下来,我们来了解一下云原生架构的基本构建原则。
(1)自依赖容器
通常,云原生架构中的容器包含微服务所需的一切要素,涉及库、依赖项和轻量级运行时。技术人员可以快速将隔离容器从一个环境移植到另一个环境,基于外挂的配置实现更高的移植性和独立性。容器的基础设施是不可变的,并且可以针对特定环境进行自定义变量配置。
(2)面向交互和协作的服务
在云原生体系中,服务往往相互调用并与第三方应用程序通信,而且复杂度较高。RESTful API作为一套协议,通常被用来规范云原生应用程序中的服务和外部应用程序或遗留软件之间的通信。在云原生架构设计中,服务网格用于处理微服务之间的东西向流量,主要功能为连接、保护和监控等,以提高服务的可靠性和安全性。
(3)无状态和可扩展的组件
为了实现云原生属性,应用程序应尽可能包含无状态组件(即状态存储在外部),允许服务的任何实例处理特定请求。在创建分布式云原生应用程序时,我们需要尽可能多的无状态组件。
在云原生架构设计理念中,系统往往被设计为满足业务快速增长、自愈、回滚以及负载均衡等需求,而无须维护数据持久性或会话。云原生应用程序能够基于集群工作负载情况自动调整服务实例,以实现业务的稳定运行。此外,技术人员可以启动替代实例,以在最短的停机时间内修复当前实例。因此,基于无状态组件实现回滚至应用程序的早期版本以及实例之间的负载均衡相对来说更容易。
(4)CI/CD自动化流程
云原生系统的一大优势是能够快速、灵活地构建和部署应用程序,同时实现高度自动化的基础架构管理。为了更快地修复、扩展和部署应用程序,技术团队可以通过CI/CD自动化流程完成相关阶段,例如构建、测试、部署和交付等的实施,从而减少软件交付所需的时间和精力,提高软件交付质量,并降低发生错误或宕机的风险。CI/CD自动化对于云原生应用程序的成功至关重要,使组织能够以高效的方式部署和管理复杂的应用程序。
(5)弹性架构
在实际的架构设计中,设计持久的应用程序是首要任务。通常,应用程序需要被设计与配置具有高可用性和可靠灾难恢复策略的系统。由于失败是不可避免的,提前规划是应对未来可能出现的问题的最佳策略。
基于微服务的云原生架构提供了一个可确保弹性的强大系统。由于系统配置了自动恢复和无状态可扩展组件,多个实例可以在需要时同时接管任务。因此,我们可以减少停机时间并保证应用程序持久运行,以提供最佳用户体验。
4.云原生架构的好处
云原生架构为企业带来一些好处,主要涉及如下几点。
(1)缩短软件开发生命周期
软件开发生命周期(SDLC)是指软件产品开发中涉及的各个阶段。一个典型的SDLC通常包括以下几个关键阶段。
1)需求收集阶段:收集当前问题、业务需求、客户需求等信息。
2)分析阶段:定义原型系统需求,对现有原型进行市场调查,根据提议的原型分析客户需求等。
3)设计阶段:准备产品设计、软件需求规范文档、编码指南、技术栈、框架等。
4)开发阶段:根据规范和指南文档编写代码来构建产品。
5)测试阶段:测试代码,并根据安全要求合规书评估代码质量。
6)部署阶段:将软件部署到生产环境。
7)运营和维护阶段:完成产品维护、客户问题处理、根据指标监控性能等任务。
由于云原生架构支持应用程序在公有云和私有云之间进行无缝迁移,企业可以基于成本和安全考虑在不同的云平台中选择一个来运行应用程序,而无须修改代码或额外投入。
同时,云原生应用程序深度集成了CD流程,通过DevOps和自动化提升了软件开发速度和质量。跨职能团队利用CI/CD流水线最大限度实现自动化构建、测试和部署。基础设施即代码(IaC)使基础架构配置一致可控,整个开发流程高效协作且可追溯。
(2)高可扩展性
云原生架构支持轻松扩展计算资源,满足海量数据处理需求。当数据量增加时,云原生架构支持按需弹性扩展计算资源,确保所有需要处理数据的用户都能获得所需的计算资源,并且用户只需为实际消耗的资源付费。
此外,云原生架构采用基于API的松耦合集成方式,可以轻松连接云端的海量数据与前端应用。在云原生架构中,每一个IT资源都以服务的形式存在,并通过开放的API对外提供服务。这样,企业可以通过API将云端数据无缝集成到Web应用和移动应用中,不仅提供了良好的用户体验,还可以将传统系统平滑迁移到云原生架构,实现业务创新。
(3)高弹性及高可用性
为了避免频繁的系统中断导致客户流失,企业应该构建高可用的云原生系统。传统的单体架构一旦出现故障,就会造成整体服务中断,这对于核心业务系统是不可接受的。
采用微服务架构与Kubernetes容器编排的云原生方案,可以实现系统的自我修复和高可用性。当部分服务发生故障时,系统可以通过隔离和重启快速恢复服务,从而实现应用程序的持续可用。同时,系统可以动态调配资源,实时满足业务需求,从而大大提升灵活性。
(4)自助服务
在云原生架构中,一切皆由API控制。用户可以选择他们需要的资源,而不必依赖其他设施。在快速发展的IT世界中,速度和服务质量是两个核心要素。通过DevOps实践,用户可以轻松构建和自动化持续交付管道,从而更快、更好地交付软件。
IaC工具使得按需自动配置基础设施成为可能,同时允许用户随时随地扩展或关闭基础设施。通过简化IT管理和更好地控制整个产品生命周期,SDLC显著缩短,使组织能够加快上市速度。
(5)低成本
随着CapEx转变为OpEx,企业可以更好地管理开发资源和成本。在OpEx方面,云原生架构利用开源的Kubernetes管理容器化应用。市场上还有其他云原生工具可以有效地管理应用。借助Serverless架构、基础设施标准化、开源工具,运营成本也会降低,从而降低TCO(总体拥有成本)。
与传统的软件许可模式不同,云原生架构的运营成本是基于资源消费计算的,而非一次性的许可证费用。这种灵活的付费方式更符合企业的实际需求。
1.3.3 云原生架构模式
随着云原生技术日益成熟,越来越多的企业正在加速采用以Kubernetes为核心的云原生架构,以更好地满足业务的敏捷性和灵活性需求。但是,云原生架构并非一成不变的,不同的公司和场景需要不同的架构模式。因此,企业需要根据业务规模、安全要求、数据特征等因素,设计出适合自身业务的云原生架构模式。
下面列举了一些常见的云原生架构模式及其最佳实践。
模式1:按需收费
在云原生架构中,资源根据用户需求动态调度、弹性伸缩且按用量计费。系统可根据业务负载灵活分配计算、存储和网络等资源,只为实际使用量支付费用。这意味着我们可以随业务负载实时增加或减少资源,高效利用资源。
不同的服务提供商提供各具特点的定价方案,特别是流行的Serverless架构模式,只需在代码真正执行时配置必要的资源,即仅在应用运行期间产生费用。
模式2:自助服务设施
IaaS是云原生应用架构的一个关键属性。无论我们是在弹性、虚拟还是共享环境中部署应用程序,应用程序都会自动重新调整以适应底层基础架构,并根据不断变化的工作负载进行弹性伸缩。这意味着我们无须寻求并获得服务器、负载均衡器或中央管理系统的许可即可创建、测试或部署IT资源,在减少等待时间的同时,简化了IT管理。
模式3:服务托管
云原生架构可以充分利用云托管服务,以高效管理云基础设施。这不仅包括迁移和配置,还包括管理和维护,同时缩短维护时间和降低成本。可以将每个服务作为独立的生命周期单元来管理,并轻松地将其纳入DevOps流程。可以使用多个CI/CD流水线,也可以分别管理这些流水线。
模式4:全球分布式
全球分布式是云原生架构的另一个关键属性,允许我们跨基础架构安装和管理软件。安装在不同位置的独立组件共享消息以实现单一目标。分布式系统使组织能够大规模扩展资源,同时给最终用户留下他正在一台服务器上工作的印象。在这种情况下,分布式系统共享数据、软件或硬件等资源,并且单个功能同时在多台服务器上运行。这些系统具有容错、透明和高可扩展性。虽然早期分布式系统使用客户端/服务器架构,但现代分布式系统使用多层、三层或对等网络架构。分布式系统提供无限水平扩展、容错和低延迟功能。不利的一面是,它们需要智能监控、数据集成和数据同步,因此,避免网络和通信故障是一项挑战。云供应商负责架构治理、安全、工程、演化和生命周期控制。这意味着我们不必担心云原生应用程序的更新、补丁和兼容性问题。
模式5:资源优化
对于传统数据中心,组织需要提前部署整套完整的基础设施才能运行。当业务增长到高峰时,组织需要增加投入来扩充基础设施。然而一旦业务下降,新购置的资源可能闲置,造成资源浪费。
在云原生架构下,我们可以随时启动所需资源并只需为实际使用的资源付费。这让组织有机会试验新理念,因为不需要永久拥有资源。
模式6:弹性伸缩
弹性伸缩是云原生架构的另一项强大功能,能够让我们依据实际的业务量自动调整资源以将应用程序维持在最佳水平。弹性伸缩的好处在于可以抽象每个可缩放层并缩放特定资源。通常,我们有两种扩展资源的方法,即垂直扩展与水平扩展。垂直扩展增加了计算机的配置以处理不断增加的流量,水平扩展则增加了更多计算机以横向扩展资源。垂直扩展受容量限制,水平扩展提供了无限资源。
例如,AWS提供开箱即用的水平自动扩展功能。无论弹性计算云(EC2)实例、DynamoDB索引、弹性容器服务(ECS),还是Aurora集群,AWS都会根据用户定义的每个应用程序的统一扩展策略来监控和调整资源。用户可以定义扩展优先级。AWS的自动扩展功能是免费的,但用户需要为扩展的资源付费。
模式7:12因素方法论
为了促进同一应用程序的开发人员之间的无缝协作,有效管理应用程序规模随时间推移的增长,同时最大限度降低软件蔓延成本,Heroku的开发人员提出了12因素方法论,帮助组织轻松构建和部署云原生应用程序。
此方法论的关键在于:应用程序应采用一个共享的代码库,包含相互隔离的所有依赖项。配置代码应与应用程序代码分离,以实现高可配置性。进程应是无状态的,这样可以自由启动、扩展和终止。我们还应构建CI/CD流程,独立管理构建、发布和运行无状态进程。
另一个重要原则是,应用程序应该可以“置于一次性资源”之上,这样我们可以独立启动、停止和扩展每个资源,从而提高应用程序的弹性。
12因素方法论非常适合云原生架构。其基本理念是松耦合。最后,我们可以基于容器、Docker和微服务技术使得开发、测试和生产环境尽可能一致。基于云的应用程序12因素方法论如表1-1所示。
表1-1 基于云的应用程序12因素方法论
模式8:IaC和自动化
通过在微服务架构中运行容器,组织能够在业务流程上实现敏捷。为了将这一功能扩展至生产环境,组织正采用IaC技术。通过将软件工程实践应用于资源供应自动化,组织可以通过配置文件来管理基础设施。通过测试和版本控制部署,组织能够自动化部署过程并维持基础设施处于所需状态。当需要更改资源分配时,组织只需在配置文件中进行定义,然后自动将更改应用到基础设施。IaC使组织能够实现一次性系统,从而即时创建、管理和销毁生产环境,同时自动执行各项任务。
从根本上讲,云计算的设计基因高度支持自动化。我们可以利用Terraform或CloudFormation实现基础设施管理自动化,通过Jenkins、GitLab的CI/CD管道以及AWS内置的自动缩放功能来优化资源利用。云原生架构使我们能够构建与云无关的应用程序,这些应用程序可以部署到任何云服务提供商的平台。Terraform是一款强大的工具,可以帮助我们使用Hashicorp配置语言(HCL)创建模板,以便在多个流行的云平台(如AWS、Azure、GCP等)上自动配置应用程序。CloudFormation是AWS提供的一项受欢迎的功能,用于自动化配置在AWS服务上运行的资源,使我们能够轻松在AWS服务上自动设置和部署各种IaaS产品。如果使用多种AWS服务,那么利用CloudFormation可以更便捷地实现基础设施自动化。
模式9:自动恢复
在当今时代,应用程序的持续可用性对客户至关重要。因此,很有必要制订全面的容灾恢复计划,以确保所有资源的高可靠性。
我们可以设计具有自我修复能力的系统,以快速恢复数据、源代码仓库和资源。例如,利用IaC工具(如Terraform和CloudFormation)自动配置基础设施,以应对故障。
通过自动化容灾恢复工作流的各个方面,我们能够快速回滚基础设施的变更,或按需重新创建实例,包括EC2实例和VPC等。此外,我们可以利用CI服务器,如Jenkins、GitLab,还原CI/CD管道的修改。这意味着容灾恢复可以快速高效地执行。
模式10:不可变基础设施
“不可变基础设施”或“不可变代码部署”是一种部署服务器的概念,其中服务器被部署为无法编辑或更改。如果需要更改,需要销毁服务器并在公共镜像存储库中重新部署一个新的服务器实例。每个部署都带有时间戳和版本控制,因此我们可以根据需要回滚到较早的版本。每次部署都是独立的,没有配置漂移。
不可变基础设施有助于管理员更换有问题的服务器而不影响应用程序。所有环境下的部署行为都变得可预测和一致,测试工作也更容易实现,自动水平缩放变得相对容易。因此,不可变基础设施提高了部署环境的稳定性和一致性。
模式11:可观测架构
可观测架构包括日志记录(Logging)、链路追踪(Tracing)和指标监控(Metrics)3个功能。其中,日志记录功能提供了多个层级(verbose、debug、warning、error、fatal)的详细信息追踪,由应用开发者主动提供。链路追踪功能提供了一个请求从前端到后端的完整调用链路追踪,对分布式场景尤其有用。指标监控功能则提供了对系统多维度的度量。
架构决策者需要选择合适的、支持可观测性的开源框架(比如OpenTracing和OpenTelemetry),并规范上下文的可观测数据(例如方法名、用户信息、地理位置、请求参数等),还需要规划这些可观测数据在哪些服务和技术组件中传播。
图1-5 云原生堆栈的核心技术和工具
由于建立可观测性的主要目标是对SLO(服务层面目标)进行度量,从而优化SLA,因此我们在架构设计时需要为各个组件定义清晰的SLO,包括并发度、响应时间、可用时间、容量等。