林琳
“未来的软件一定是生长于云上的”这是云原生理念的最核心假设。而所谓“云原生”,实际上就是在定义一条能够让应用最大程度利用云的能力、发挥云的价值的最佳路径。在这条路径上,脱离了“应用”这个载体,“云原生”就无从谈起。容器技术,则是将这个理念落地、将软件交付的革命持续进行下去的重要手段之一。
云原生技术发展简史
2004 - 2007年,Google已在内部大规模使用像Cgroups这样的容器技术。
2008年,Google将Cgroups合并进入了Linux内核主干。
2013年,Docker项目正式发布。
2014年,Kubernetes项目也正式发布。这样的原因也非常容易理解,因为有了容器和Docker之后,就需要有一种方式帮助大家方便、快速、优雅地管理这些容器,这就是Kubernetes项目的初衷。在Google和Redhat发布了Kubernetes之后,这个项目的发展速度非常快。
2015年,由Google、Redhat以及微軟等大型云计算厂商以及一些开源公司共同牵头成立了云原生基金会(CNCF)。CNCF成立之初,就有22个创始会员,而且Kubernetes也成为了CNCF托管的第一个开源项目。在这之后,CNCF的发展速度非常迅猛。
2017年,CNCF达到170个成员和14个基金项目。
2018年,CNCF成立3周年有了195个成员,19个基金会项目和11个孵化项目,如此之快的发展速度在整个云计算领域都是非常罕见的。
因此,如今我们所讨论的云原生技术生态是一个庞大的技术集合。CNCF有一张云原生全景图,在这个全景图里已经有200多个项目和产品了,这些项目和产品也都是和CNCF的观点所契合的。如果以这张全景图作为背景,加以思考就会发现,我们今天讨论的云原生其实主要谈论了以下几点.
云原生基金会
云原生技术社区,比如像CNCF目前正式托管的20多个项目共同构成了现代云计算生态的基石,其中像Kubernetes这样的项目已经成为了世界第四活跃的开源项目。
除了前面2点之外,现在全球各大公有云厂商都已经支持Kubernetes了。此外,还有100多家技术创业公司也在持续地进行投入。现在阿里巴巴也在谈全面上云,而且上云就要上云原生,这也是各大技术公司拥抱云原生的一个例子。
我们正处于时代的关键节点
从2013年Docker项目发布开始说起,Docker项目的发布使得全操作系统语义的沙盒技术唾手可得,让用户能够更好、更完整地打包自己的应用,使得开发者可以轻而易举地获得了一个应用的最小可运行单位,而不需要依赖任何PaaS能力。这对经典PaaS产业其实是一个“降维打击”。
2014年的时候,Kubernetes项目发布,其意义在于Google将内部的Borg/Omega系统思想借助开源社区实现了“重生”,并且提出了“容器设计模式”的思想。而Google之所以选择间接开源Kubernetes而不是直接开源Borg项目,其实背后的原因也比较容易理解:Borg/Omega这样的系统太复杂了,没办法提供给Google之外的人使用,但是Borg/Omega这样的设计思想却能借助Kubernetes让大家接触到,这也是开源Kubernetes的重要背景。
这样到了2015年和2016年,这是容器编排“三国争霸”的时代,当时Docker,Swarm,Mesos,Kubernetes都在容器编排领域展开角逐,他们竞争的原因其实也比较容易理解,Docker或者容器本身的价值虽然大,但是如果想要让其产生商业价值或者说对云的价值,就需要在编排上面占据一个有利的位置。
Swarm和Mesos的特点,那就是各自只在生态和技术方面比较强,其中,Swarm更偏向于生态,而Mesos技术更强一些。相比之下,Kubernetes则兼具了二者优势,最终在2017年从“三国争霸”的局面中胜出,成为了当时延续现在的容器编排标准。这一过程的代表性事件就是Docker公司宣布在核心产品中内置了Kubernetes服务,且Swarm项目逐渐停止维护。
到了2018年的时候,云原生技术理念开始逐渐萌芽,这是因为此时Kubernetes以及容器都成为了云厂商的既定标准,以“云”为核心的软件研发思想逐步形成。
而到了2019年,情况似乎又将发生一些变化,究竟什么是“云原生”,云原生该怎么落地?
很多人都会问“到底什么是云原生?”实际上,云原生是一条最佳路径或者最佳实践。更确切地说,云原生为用户指定了一条低心智负担的、敏捷的、能够以可扩展和可复制的方式,是最大化利用云的能力、发挥云的价值的最佳路径。
因此,云原生其实是一套指导进行软件架构设计的思想。按照这样的思想而设计出来的软件:首先,天然就“生在云上,长在云上”;其次,能够最大化发挥云的能力,使得我们开发的软件和“云”能够天然地集成在一起,发挥出“云”的最大价值。
所以,云原生的最大价值和愿景,就是认为未来的软件,会从诞生起就生长在云上,并且遵循一种新的软件开发、发布和运维模式,从而使软件能够最大化发挥云的能力。
其实,容器技术和集装箱技术的革命性非常类似,即:容器技术使得应用具有了一种“自包含”的定义方式。所以,这样的应用才能以敏捷的、可扩展和可复制的方式发布在云上,发挥出云的能力。这也就是容器技术对云发挥出的革命性影响所在,所以说,容器技术正是云原生技术的核心底盘。
云原生的技术范畴
云原生的技术范畴包括了以下几个方面:
①云应用定义与开发流程。这包括应用定义与镜像制作、配置CI/CD、消息和Streaming以及数据库等。
②云应用的编排与管理流程。这是Kubernetes比较关注的一部分,包括了应用编排与调度、服务发现治理、远程调用、API网关以及Service Mesh。
③监控与可观测性。这部分所强调的是云上应用如何进行监控、日志收集、Tracing以及在云上如何实现破坏性测试,也就是混沌工程的概念。
④云原生的底层技术,比如容器运行时、云原生存储技术和云原生网络技术等。
⑤云原生工具集,在前面的这些核心技术点之上,还有很多配套的生态或者周边的工具需要使用,比如流程自动化与配置管理、容器镜像仓库、云原生安全技术和云端密码管理等。
⑥Serverless。Serverless是一种PaaS的特殊形态,它定义了一种更为“极端抽象”的应用编写方式,包含了FaaS和BaaS这样的概念。而无论是FaaS还是BaaS,其最为典型的特点就是按实际使用计费(Pay as you go),因此Serverless计费也是重要的知识和概念。
云原生思想的2个理论
在了解完云原生的技术范畴之后你就会发现,其所包含的技术内容还是很多的,但是这些内容的技术本质却是类似的。云原生技术的本质是2个理论基础。
第一个理论基础是:不可变基础设施。这一点目前是通过容器镜像来实现的,其含义就是应用的基础设施应该是不可变的,是一个自包含、自描述可完全在不同环境中迁移的东西。
第二个理论基础就是:云应用编排理论。当前的实现方式就是Google所提出来的“容器设计模式”,也是Kubernetes部分主要的内容。
基础设施向云演进的过程
首先为大家介绍一下“不可变基础设施”的概念。其实,应用所依赖的基础设施也在经历一个向云演进的过程,而对于传统的应用基础设施来说,往往是可变的。
大家可能经常会干这样一件事情,比如需要发布或者更新一个软件,流程大致是这样的,先通过SSH连到服务器,然后手动升级或者降级软件包,逐个调整服务器上的配置文件,并且将新代码直接都部署到现有服务器上。因此,这套基础设施会不断地被调整和修改。
但是在云上,对“云”友好的应用基础设施是不可变的。
这种场景下的上述更新过程会这么做:一旦应用部署完成之后,那么这套应用基础设施就不会再修改了。如果需要更新,那么需要更改公共镜像来构建新服务直接替换旧服务。而我们之所以能够实现直接替换,就是因为容器提供了自包含的环境(包含应用运行所需的所有依赖)。所以对于应用而言,完全不需要关心容器发生了什么变化,只需要把容器镜像本身修改掉就可以了。因此,对于云友好的基础设施是随时可以替换和更换的,这就是因為容器具有敏捷和一致性的能力,也就是云时代的应用基础设施。
所以,总结而言,云时代的基础设施就像是可以替代的“牲口”,可以随时替换;而传统的基础设施则是独一无二的“宠物”,需要细心呵护,这就体现出了云时代不可变基础设施的优点。
基础设施向云演进的意义
像这样的基础设施向“不可变”演进的过程,为我们提供了2个非常重要的优点。
基础设施的一致性和可靠性。同样一个镜像,无论是在美国打开,还是在中国打开,或是在印度打开都是一样的。并且其中的OS环境对于应用而言都是一致的。而对于应用而言,它就不需要关心容器跑在哪里,这就是基础设施一致性非常重要的一个特征。
这样的镜像本身就是自包含的,其包含了应用运行所需要的所有依赖,因此也可以漂移到云上的任何一个位置。
此外,云原生的基础设施还提供了简单、可预测的部署和运维能力。由于现在有了镜像,应用还是自描述的,通过镜像运行起来的整个容器其实可以像Kubernetes的Operator技术一样将其做成自运维的,所以整个应用本身都是自包含的行为,使得其能够迁移到云上任何一个位置。这也使得整个流程的自动化变得非常容易。
应用本身也可以更好地扩容,从1个实例变成100个实例,进而变成10 000个实例,过程对于容器化后的应用没有任何特殊的。最后,我们也能够通过不可变的基础设施来地快速维护管控系统和支撑组件。因为,这些组件本身也是容器化的,是符合不可变基础设施这样一套理论的组件。
以上就是不可变基础设施为用户带来的最大的优点。
2019年———云原生技术普及元年
为什么说2019年很可能是一个关键节点呢?我们认为2019年是云原生技术的普及元年。
首先大家可以看到,在2019年,阿里巴巴宣布要全面上云,而且“上云就要上云原生”。我们还可以看到,以“云”为核心的软件研发思想,正逐步成为所有开发者的默认选项。像Kubernetes等云原生技术正在成为技术人员的必修课,大量的工作岗位正在涌现出来。
这种背景下,“会Kubernetes”已经远远不够了,“懂Kubernetes”“会云原生架构”的重要性正日益凸显出来。从2019年开始,云原生技术将会大规模普及,这也是为什么大家都要在这个时间点上学习和投资云原生技术的重要原因。