1.2.1 什么是云原生
2010年,WSO2公司的创始人兼CTO Paul Fremantle撰写了题为“Cloud-Native”(云原生)的博客文章,这是云原生一词第一次出现在公众视野。这篇文章阐述了软件要迁移到云环境所面临的挑战,并列举了他所认为的云原生的核心特性,如分布式、弹性、多租户、增量部署和测试等。在这之后,Pivotal公司的前CTO Matt Stine,在2015年撰写了一本名为Migrating to Cloud-Native Application Architectures(《迁移到云原生应用架构》)的电子书,该书随后广为流传,这也是为什么业界普遍认可其对云原生的定义,甚至有人戏称Pivotal为云原生的“黄埔军校”。Matt认为,云原生应用架构应该具备以下特点。
● 满足十二要素原则
● 使用微服务架构
● 构建自服务敏捷架构
● 面向API协作
● 具有抗脆弱性
随着云原生技术的快速发展,云原生的定义也在不断变化。2019年VMware收购Pivotal,并给出了云原生最新的定义:
云原生是一种构建和运行应用程序的方法,它利用了云计算交付模型的优势。当公司使用云原生技术构建和运行应用程序时,可以更快地将创新想法变成产品推向市场,从而快速响应客户需求。
该定义中特别强调了云原生开发中要关注的四个方面,具体如下。
● 微服务
● 容器化
● DevOps
● 持续交付
提到云原生,当然不能忽略云原生计算基金会,即大名鼎鼎的CNCF。这个2015年成立的中立组织,最初的目的是围绕Kubernetes打造一个完善的云原生生态社区。目前它已经发展成为云原生领域的绝对权威机构,加入其中孵化的项目有近百个,很多耳熟能详的开源项目已经从CNCF毕业,几乎都成了相关领域的事实标准,比如Kubernetes、Prometheus。CNCF在2018年对云原生做了定义,该定义沿用至今:
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统做出频繁和可预测的重大变更。
云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,以推广云原生技术。我们通过将最前沿的模式民主化,让这些创新点为大众所用。
可以看到,基于CNCF的定义,云原生关注的技术主要有以下五个。
● 容器
● 服务网格
● 微服务
● 不可变基础设施
● 声明式API
技术和产品不同,产品的定义可以由开发团队明确给出,而技术在不断演变,特别是云原生技术,从2015年开始被推广以来,仅仅5年就有了翻天覆地的变化,服务网格、无服务器计算这些新兴概念迅速成为云原生领域的重要分支。因此,我们很难给云原生技术下一个准确的、不变的定义,通常只能根据技术特性对其进行描述。每个人都可以对云原生有自己的理解,它的内涵在不同的时期也有不同的变化。笔者建议基于这些关键技术特性去理解云原生的本质。这里也给出一个自己的观点供大家参考:
利用云原生技术,我们可以在云平台上构建出具有扩展性和弹性的应用,以自动化的持续交付来满足企业业务快速变化的需求。
初次看到云原生定义的读者很难从晦涩的字面上理解其内在含义,这里我们通过简单回顾云计算的发展历程来帮助大家理解云原生。
2006年,亚马逊推出了EC2服务,标志着基础设施即服务(IaaS)的出现。从当时的产品形态来看,云平台提供的能力极其有限,仅仅是基于虚拟机的计算资源随后也逐渐发展成存储、网络等硬件资源层面的产品。
2010年前后,平台即服务(PaaS)的概念出现,在IaaS的基础上,更多软件层面的服务能够被提供,比如操作系统、中间件等。作为其中的代表厂商,HeroKu提出了著名的十二要素原则,这也为开发人员构建基于云平台的应用提供了参考准则。在这一阶段,需要用户自己管理的内容逐渐变少,很多非功能性需求都可以交由云平台去实现,比如负载均衡、自动伸缩。PaaS更进一步演变为软件即服务(SaaS),它追求一个几乎完全托管的应用形态,开发人员只需要关注业务本身。图1-3展示了云平台的演变过程。
图1-3
另一方面,2013年Docker出现,容器技术火速发展起来,容器编排市场竞争激烈,最终以Kubernetes的全面胜利而告终。同时,CNCF成立并开始推广云原生技术。可以看到,容器技术非常适用于云平台,它的出现改变了通过PaaS平台部署和分发应用的方式。容器化、容器编排,再加上PaaS的托管能力,云原生初具雏形。
云原生技术及生态的发展,来源于上面提到的这两条线路。平台代表的是能力,平台越完善,能力越强,需要用户管理的部分就越少。容器这条线代表的是部署形态,以及由此延伸出来的编排管理、持续交付等。
笔者认为,云原生所追求的目标,即使用现代化的容器技术,不断下沉应用所需要的非功能性需求到云平台,最终达到让开发者只关注业务、只实现业务逻辑的目标。从本质上来说,构建一个软件的目标,就是实现业务需求,即客户的核心价值。为了运行、维护软件,保证其可用性,我们不得不花费大量时间来补全软件的质量属性。而借助云原生技术是一个让开发回归本源的过程,让开发者只需关注软件开发中的本质问题。