企业需要快速应对竞争威胁、不断变化的市场趋势和新技术的挑战,以有效竞争。这需要与传统、本地或内部IT或某些现有云计算环境中工程化的旧系统非常不同的软件。开发者需要云原生计算的优势,包括微服务基础设施、应用部署速度、自动化和虚拟化资源。到2025年,Gartner估计,超过95%的新数字工作负载将部署在云原生平台上,这一比例从2021年的30%上升。
尽管如此,关于云原生计算实际上是什么、为什么它很重要以及如何实现云原生应用程序的好处,通常存在根本性的脱节。本指南将为您提供对云原生计算及其益处的更好理解,以及如何在您的组织中开始实施云原生应用程序开发。
当使用“云原生”一词时,这意味着与特定应用程序相关的技术、服务和开发活动从一开始就被构建并在云中运行。这种方法在构建和管理应用程序时充分利用了云计算环境提供的弹性、分布式资源。云原生架构和开发与“云启用”的应用程序开发不同,后者使用传统的(本地或内部)开发环境,然后将应用程序迁移到云中,或者“基于云”的开发,其中某些应用程序方面通过云存储、访问或管理(例如,第三方托管)。
要利用云原生技术的优势,了解关键云原生元素以及它们如何共同为商业利益、政府和非营利组织创造竞争优势至关重要。
基于敏捷和精益的应用程序开发原则,云原生开发和运营(DevOps)方法提供比传统软件系统更易于管理的弹性软件,所有这些都在缩短的时间内完成。这种方法,有时被称为CI/CD,包括以下要素
持续集成 (CI): 持续集成是一种现代DevOps方法,在开发周期中更频繁地编写新代码,并且每天用现有代码进行测试和验证。自动化被用来频繁地进行测试,以便能够早期发现每个新代码批次的问题,并迅速修复。这有助于防止问题在整个代码库中逐级累积并减缓更新和功能的交付。
持续交付 (CD): CD专注于自动交付CI提供的高质量代码。为了尽快部署代码,CD依赖于使用专注于特定任务的小型软件程序(微服务),而不是交付一个完成所有任务的单一大型应用程序。这种DevOps方法使得微服务在其准备就绪时就可以交付,而不是像传统方法那样等待大型应用程序所需的全部更新,同时利用自动化,这有助于使持续交付不会占用额外的开发者时间。
基础设施即代码 (IaC): IaC的融合,这是一种描述性模型,用于定义和部署基础设施(例如,网络、虚拟机、负载均衡器、连接拓扑),在每次部署中产生相同的环境。这使得开发人员可以在更短的时间内构建应用程序,因为不再需要为各种环境进行调整。
微服务架构将应用程序分解为小型自主软件组件。这些小型、独立的组件专注于特定任务或问题,但它们也可以集体工作以执行所需的功能。云原生开发受到模块化、松散耦合的微服务的推动,这有助于加快应用程序的部署和更新。微服务也是云原生持续交付方法的一个必要元素。
容器化是开发人员在整体软件开发过程中构建云原生应用程序的关键工具。具体来说,容器技术使应用程序及其运行所需的一切捆绑成一个独立的轻量级单元(称为容器)。容器镜像软件用于执行容器的捆绑,这也是CICD云原生应用程序开发的关键组件。
容器也可以存储在容器注册库中,以便开发人员可以在需要时访问和部署它们。微服务和容器的持续集成使得开发团队能够在任何环境中部署应用程序,而不用担心该环境的操作系统。容器编排自动化了容器的提供、部署、网络、扩展、可用性和生命周期管理(IBM,2022),同时优化了容器运行时。Kubernetes是多个开源容器编排器之一,是最常用的,已被接受到云原生计算基金会(CNCF)。有关CNCF容器编排器的更多信息可在CNCF网站上找到。
APIs是帮助应用程序相互交谈(接口)并促进微服务之间信息传输的小程序。在云原生架构中,APIs在公共、私有和混合云环境中无差别地工作,以连接微服务、简化维护并提高安全性。例如,一家大型酒店连锁公司可能有一个庞大的网站和预订管理系统,他们在云中构建了它,但他们需要更多的流量来增加预订。开发允许潜在客人通过如Hotels.com或Expedia这样的旅行聚合器访问其网站,以最少的努力或修改其现有网站的方式来增加预订。
在云原生环境中,后端服务被视为应用程序在执行功能或任务时通过网络接触到的任何内容。后端服务可以由云基础设施中的本地应用程序所有者或第三方提供商提供。后端服务的示例包括缓存系统、外发电子邮件(SMTP服务)、身份验证、数据库/数据存储,甚至是通过API访问的消费者服务(例如,谷歌地图)。后端服务可以轻松“附加”或由云原生应用程序访问,而不需要大量努力或更改云基础设施。这意味着后端服务功能可以添加到云原生应用程序中,而无需额外的软件开发或重大资源投资。
(来源:《超越十二因素应用》,凯文·霍夫曼,2022年。)
现代云原生架构的独特元素使开发者能够比在传统云环境中更快地构建应用程序。云原生环境中的自动化、扩展和功能部署的便捷性支持快速“构建和运行”的软件开发过程,这对开发团队、用户和商业目标都有益。
从架构上看,云原生应用程序是虚拟化的,在自主容器中运行,而不是在本地应用程序中运行,这些应用程序只能在非虚拟化空间中运行。而且,与传统软件不同,后者与网络级资源紧密相连,如果应用程序被移动或修改,则可能会断开连接,云原生应用程序从物理基础设施和网络中抽象出来,因此可以轻松修改或移动。
云原生应用程序的一些额外优势包括
云原生计算使开发者能够构建和运行可扩展的应用程序,这些应用程序天生可以自动根据需要获取额外的云资源,并在资源需求减少时将其缩减。这是云原生应用程序用来提高效率、增强用户体验和保障应用弹性的独特竞争优势。相反,由于传统设计和可能缺乏虚拟化,云启用应用程序不会自动扩展。虽然基于云的应用程序可能提供一些可扩展性,但这取决于哪些应用程序方面是云管理的,以及它们管理的环境支持可扩展性的程度。
云原生DevOps CICD方法使开发者能够快速部署新功能、服务和升级,显著提高上市速度。自动化、松散耦合的微服务和松散连接的云原生基础设施的使用都有助于业务领导者更快地达到业务KPI,同时释放他们的团队在云原生应用程序开发中更有效地工作。
云原生应用程序的一个关键优势是它能够提升客户体验。这种提升是由于云原生开发提供的灵活性、弹性和独特架构所实现的。
在以下两个客户体验领域,云原生应用程序特别出色。
避免中断:所有软件都需要不时进行修复、升级和打补丁。在云启用应用程序中,这些更改仍在物理基础设施和网络中,因此中断很常见,客户会感到沮丧。基于云的应用程序通常会经历相同类型的中断,但持续时间和严重程度通常会根据使用的第三方云提供商的环境而变化。另一方面,云原生应用程序从物理基础设施和网络中抽象出来,这使得中断变得远不那么频繁,持续时间也更短。这提高了客户体验以及应用的弹性声誉。
根据客户需求调整产品和服务发布节奏:当企业采用云原生软件开发并使团队变得更加敏捷时,一个结果是企业能够更快地响应客户的需求和期望。例如,如果客户对新的工具或服务感兴趣,在云原生环境中,就不再需要重新构建整个应用程序。开发者可以简单地添加作为后台服务的功能,并通过各种API或创建一个微服务来部署所需的功能。云原生解决方案中的微服务架构可以在传统开发时间线的一小部分内为客户构建,并且企业可以通过持续交付快速部署。
与任何计算环境一样,网络安全至关重要。对于许多公司来说,网络安全知识和经验并不在组织内部广泛存在,但有许多知名、经验丰富的公司在云原生环境中提供托管网络安全服务(例如,谷歌、IBM、微软、AWS)。还有来自开源组织的安全服务,如Kubernetes,为刚开始的公司提供支持。因此,企业可以迅速进入云原生应用领域,并利用便捷的网络安全服务来保持强大的安全态势。
此外,云原生应用程序还具有一些固有的网络安全优势。例如,随着每个微服务的构建,安全性是为该小型程序(例如,“设计即安全”)设计的,而不是将一个安全系统应用于大型应用程序——这从一开始就积极影响了云原生应用程序的安全态势。进一步来说,由于云原生代码因CICD方法的不断变化,恶意行为者访问、研究和利用代码漏洞的窗口更小。
鉴于云原生技术的快速部署、显著的可伸缩性、易于修改和维护以及安全性优势,这种类型的云计算实现成本效益并不令人意外。例如,可伸缩性意味着云原生应用程序根据需要调整其资源消耗,而不是保持在所需的最高水平。这实现了一种基于消费的成本模型,从而可以实现显著的成本节约。此外,由于云原生技术不依赖于传统的开发环境,开发团队可以更快地部署云原生应用程序,并且开发人员可以花费更少的精力修改它们或添加新功能。这转化为劳动力和资源费用的节约。
随着新技术的增加,创新所需的步伐也在加快,采用云原生应用程序、服务和技术的企业将能够适应并蓬勃发展。由于它们可以轻松扩展、采用微服务架构以及轻松访问后台服务,这些组织将能够快速添加功能,利用新技术并最小化开发工作量以捕获市场份额。此外,它们还可以在公共云、私有云或混合云环境中以最小变化集成新功能,因为容器保留了微服务运行所需的所有内容。
当你准备好开始构建自己的云原生应用程序时,第一步是规划。在你开始编码之前,花时间考虑以下问题。
你构建的应用程序的目标是什么,关键功能元素是什么?
将任务/功能分解,思考每个如何作为微服务应用,并通过容器镜像软件打包。
考虑第三方提供的服务,这些服务可以执行您应用的一些任务。从头开始构建它们或添加第三方支撑服务更有利吗?例如,是构建文档数据库还是添加MongoDB Atlas作为支撑服务更有利?
研究编排层选项,考虑哪个平台更适合您(例如,Kubernetes、AWS Fargate、Google Cloud Run)。
思考您想使用的API和API网关软件,以管理微服务之间的通信和外部设备对您应用的外部访问。
考虑如何利用现代DevOps方法,如CICD和IaC,以使您的应用功能、功能、部署、扩展和维护受益。
(来源:微软,云原生应用简介,2022年4月)
以下是一个使用常用工具和平台的云原生开发栈示例。
Docker是一个开源平台,用于创建、部署和管理虚拟化容器,并应用通用操作系统。资源隔离允许多个容器在不出现问题的情况下使用相同的操作系统。
Kubernetes是一个开源平台,管理和编排Linux容器,确定这些容器将在哪里运行以及如何应用。
Terraform用于实现IaC。具体来说,它将资源定义为代码,并应用版本控制,以便可以轻松地确定在什么时间点更改了哪些资源。
GitLab CI/CD,如名所示,用于实现持续集成和持续开发(CICD)。它使开发者能够自动化软件测试和部署。GitLab还用于安全分析和单元测试。
MongoDB Atlas是一个开发者数据平台,其中包括灵活、易于使用的文档数据模型,并与现代云原生开发方法保持一致。它提供数据库即服务(DBaaS)功能,MongoDB Atlas可全球扩展,优化价格和性能,并支持组织应用数据需求,而无需开发团队和运维团队学习不同的系统、查询语言或部署模式。
Node.js是一个基于JavaScript运行时的平台,用于创建实时微服务。示例包括新闻源、聊天功能等。Node.js还常用于创建虚拟服务器,以及定义将微服务连接到外部API的路由。
这个开发栈示例只是众多示例之一。使用不同的工具运行应用程序以确定它们的优缺点以及它们如何适合您的开发风格。考虑构建一个简单的支撑服务以获得经验。无论您使用什么工具或构建在什么平台上,加强您的云原生应用开发技能都将是对您的简历和职业技能的有价值补充。
云原生应用程序(app)是指该应用程序的技术、服务和开发都是在云中从头开始构建并运行的。
云原生架构利用针对云环境优化的软件组件和开发哲学。云原生架构的关键组件包括
DevOps方法:一种侧重于比传统软件开发方法更快地创建应用程序的协作开发和运维方法。
微服务:微服务将应用程序分解成小型自我管理的软件组件。
容器:容器实际上“包含”应用程序捆绑包及其运行所需的一切,形成一个独立的轻量级单元(称为容器)。
应用程序编程接口(API):API帮助应用程序之间进行通信,并促进微服务之间的信息传递。
后端服务:后端服务是指在应用程序执行功能或任务时通过网络接触到的任何内容。后端服务可以由云基础设施中的本地应用程序所有者或第三方提供商提供。
云原生安全与应用于云环境以保护该环境的软件、实例化控制和附加服务相关。这包括保护系统的完整性、应用程序、数据以及通信路径免受网络攻击或灾难性损害。例如,云原生安全中的“设计安全”术语与每个微服务构建时,为该小程序而不是为大型应用程序应用一个安全系统的事实相关。
通常由云提供商或第三方以服务的形式提供,云原生安全不驻留在本地,并且可以轻松更新以应对云环境不断变化的需求。
云原生技术的一些关键优势包括
可扩展性
更快的上市速度
在故障和系统更新影响方面提供更好的客户体验
通过开源提供商增强安全资源,以及安全设计微服务开发
成本效益适应新技术