云原生(Cloud Native)是近几年云计算领域炙手可热的话题,作为一名IT人,如果你还不懂云原生,那就out了!那么到底什么是云原生,云原生又能给我们带来什么呢?
云原生(Cloud Native)这个词汇由来已久,云原生开始大规模出现在受众视线中,与Pivotal(已被VMvare收购)提出的云原生应用的理念有着莫大的关系。我们现在谈到云原生,不仅仅是指一些具体的技术,更多指的是一套方法论和技术体系的集合,是一种文化。
Pivotal公司的Matt Stine于2013年首次提出云原生(Cloud Native)的概念,并在2015年《迁移到云原生应用架构》一书中定义了符合云原生架构的几个特征:
★ 符合12因素应用
★ 面向微服务架构
★ 自服务敏捷架构
★ 基于API的协作
★ 抗脆弱性
而由于这本书的推广畅销,这也成了很多人对云原生的早期印象,同时云原生也被12要素变成了一个抽象的概念。
到了2017年,Pivotal又在其官网上将云原生的定义概况为DevOps、持续交付、微服务、容器这四大特征,这也成了很多人对Cloud Native的基础印象。
2015年,Linux基金会发起了云原生计算基金会(CNCF),CNCF基金会的成立标志着云原生正式进入高速发展轨道,Google、Cisco、Docker各大厂纷纷加入,逐步构建出围绕Cloud Native的具体工具,而云原生的概念也逐渐变得更具体化。起初CNCF对云原生(Cloud Native)的定义包含以下三个方面:
★ 容器化封装
★ 自动化管理
★ 面向微服务架构
这主要因为CNCF基金会在当时的核心就是Kubernetes,因此在概念定义上主要是围绕着容器编排建立起来的生态。
到了2018年,随着云原生生态的不断壮大,几乎所有主流云计算供应商都加入了CNCF基金会,CNCF基金会中的会员以及容纳的项目越来越多,最初的定义已经限制了云原生生态的发展,CNCF为云原生进行了重新定义:
“云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。”
“这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。”
可以看出CNCF对云原生的重新定义加上了服务网格和声明式API,同时为这一概念阐述更深一层的意义,也就是建立一个统一中立的开源云生态,这对云原生的生态定位会是很重要的一点,也是CNCF最初成立的宗旨之一,打破云巨头的垄断。
结合Pivotal和CNCF对云原生的定义来看,云原生主要包括了如下关键技术:
微服务是一种用于构建应用的架构方案。将一个复杂的应用拆分成多个独立自治的服务,服务与服务间通过“高内聚低耦合”的形式交互。微服务构建为一组通过共享结构进行交互的分布式小型独立服务,具有以下特征:
★ 各自都在较大的域上下文中实现特定业务功能。
★ 各自都自主开发,可以独立部署。
★ 各自都是独立的,封装其自己的数据存储技术、依赖项和编程平台。
★ 各自都在自己的进程中运行,并使用 HTTP/HTTPS、gRPC、WebSocket或AMQP等标准通信协议与其他微服务进行通信。
★ 它们组合在一起形成应用程序。
下图将整体式应用程序方法与微服务方法进行比较。整体结构由分层体系结构组成,在单个进程中执行,它通常使用关系数据库;但是,微服务方法将功能分为独立服务,每个服务具有自己的逻辑、状态和数据,每个微服务都承载其自己的数据存储。
容器是一种打包应用的方式,可以打包应用中的所有软件和软件所依赖的环境,并可实现跨平台部署。容器关键技术包括:namespace视图隔离,cgroups资源隔离,Union File System联合文件系统。容器具有以下优势:
★ 容器可保持运行环境的一致性,做到一次打包,到处运行。
★ 容器可使用独立的文件系统、存储、网络与资源配额。
★ 与标准虚拟机相比,容器能同时提供效率和速度。
★ 容器是微服务的最佳载体。
容器的编排管理可以说是云原生的基石,而Kubernetes可以说是这个领域的事实标准,作为CNCF基金会的首个毕业项目和金字招牌,甚至很多人认为云原生就是Kubernetes和其相关的一系列技术,虽然这样的说法是很不准确的,不过现在云原生技术确实和Kubernetes绑定的越来越紧密,由此而衍生了一大批的工具生态。
容器编排是自动化管理和协调容器的系统,专注于容器的生命周期管理和调度。核心功能包括:
★ 容器调度:依据策略完成容器与宿主机绑定
★ 资源管理:CPU、内存、GPU、Ports、Device
★ 服务管理:DNS发现、命名空间、服务自动伸缩、服务自愈、滚动更新
容器编排服务是运行云原生应用的最佳环境。
Kubernetes中的应用将作为微服务运行,但是Kubernetes本身并没有给出微服务治理的解决方案,比如服务的限流、熔断、良好的灰度发布支持等。服务网格(Service Mesh)是致力于解决服务治理的基础设施层,应对云原生应用的复杂服务拓扑,提供可靠的通信传递。Service Mesh 的特点:
★ 专用的基础设施层
★ 轻量级高性能网络代理
★ 提供安全的、快速的、可靠地服务间通讯
★ 扩展Kubernetes的应用负载均衡机制,实现灰度发布
实现层面,通过一组轻量级网络代理(Sidecar proxy),与应用程序代码部署在一起来实现,且对应用程序透明,加速应用的微服务和云原生转型。使用Service Mesh将可以有效的治理Kubernetes中运行的服务。当前开源的流行的Service Mesh包括:Istio、Linkerd和Envoy等。
不可变基础设施是一种保持基础设施实例不可修改,只能够进行整体替换的模式。任何基础设施实例(包括服务器、操作系统、软件等)一旦创建之后便进入只读状态。配置工作可实现重复性,减少了配置工作的负担,让持续集成与持续部署变得更简单。
这里可以用宠物(Pets)和畜牧(Cattle)的概念做类比:
在传统数据中心内,服务器被视为“宠物”:一台物理计算机,被赋予有意义的名称,并受到照料。通过将更多资源添加到相同计算机(纵向扩展)来进行缩放。如果服务器出现问题,你会进行修复,使它恢复正常运行状况。如果服务器不可用,则每个人都会感知到。
“牲畜”服务模型有所不同:你会将每个实例预配为虚拟机或容器。它们是相同的,并分配有系统标识符(如服务-01、服务-02等等)。通过创建更多实例(横向扩展)来进行缩放。当一个实例不可用时,无人会感知到。
牲畜模型采用不可变基础结构。服务器不会进行修复或修改。如果一台服务器发生故障或需要更新,则会销毁它并预配新服务器,所有操作都通过自动化完成。
云原生系统采用牲畜服务模型。它们会在基础结构横向缩减或扩展时持续运行,而不考虑运行它们的计算机。
命令式 API:可直接发出让服务器执行的命令,例如:“运行容器”、“停止容器”等;
声明式 API:可声明期望的状态,系统将不断地调整实际状态,直到与期望状态保持一致。
为什么声明式使系统更加健壮?声明式API描述最终运行环境的状态,由系统来决定如何来创建这个环境。例如,你的描述就变成“创建一个有三个Nginx的集群”,而不是把创建Nginx的命令运行三次组成一个集群。这样的好处是当运行环境与描述不符合时,系统能检测到差异,并自动修复,这样系统就有了自动容错的功能。
Kubernetes的API就是一种声明式API。Kubernetes中,所有应用的部署都是基于YAML文件的,这实际上就是一种Infrastructure as Code,可支持通过代码来管理基础设施和部署环境。
DevOps是软件开发、测试和IT运维之间的合作,目标是自动执行软件交付和基础架构更改流程,缩短开发周期,增加部署频率,更可靠地发布。它创造了一种文化和环境,可支撑快速、频繁、可靠地构建、测试和发布软件。
举个例子,对于运维来说,稳定压倒一切,新feature越少越好。而对于研发来说,却希望能开发更多的功能。这种矛盾会导致大量的资源和时间的浪费。就像两匹马拉一辆车,如果马头向着的方向不一致,肯定是没法全速前进的。
DevOps的理念就是希望能打破这种屏障,让研发(Development)和运维(Operations)一体化,让团队从业务需求出发,向着同一个目标前进。
字面意思上说DevOps是指“开发运维一体化”,即通过工具辅助开发完成运维的部分工作,减少成本。但深入理解了DevOps之后,你会发现DevOps其实是一种软件研发管理的思想,方法论,他追求的是一种没有隔阂的理想的研发协作的状态,可能涉及到的角色有开发、测试、产品、项目管理、运维等等。所以我们认为,为了帮助研发团队在保持质量的前提下提高交付效率的方法和方法论都隶属于DevOps的范畴。
在2020年IDC(互联网数据中心)对企业的调研中,有将近70%已经将云策略落地,却只有3%能带来明显的获利突破,差异就在技术面的“云实践成熟度”也就是云原生化。
信通院在《云原生发展白皮书(2020年)》中指出,在绿色低碳、降本增效的大环境下,加快数字化业务发展成为传统企业的必然选择。由于业务场景、用户习惯迅速变化,许多行业数字化业务出现急速增长。数字化业务意味着大刀阔斧的企业敏捷文化,只有借助更加快速、灵活的开发和交付模式,才能满足市场快速变化的需求。
通过使用容器、Kubernetes、DevOps、微服务等这些年轻且先进的云原生技术,能够大大加快软件开发迭代速度,提升应用架构敏捷度,提高IT资源的弹性和可用性,帮助企业客户加速实现价值。对于大部分传统企业而言,云原生PaaS平台是未来企业业务的核心竞争力的底层支撑,为企业屏蔽底层异构的基础设施,不仅能够显著降低基础建设与管理成本、提高布署灵活性与可扩展性,而且还有较高的安全性。企业可以将更多的人员、精力和成本投入到与业务相关的研发上,更加专注于业务本身。
★ 在微服务化方面:云原生将应用程序代码解耦成独立模块化单元,降低微服务的部属时间与互依性,提高应用的扩展性等。
★ 在容器化包装方面:过去程序开发者可能需要创建多个虚拟机好让不同的应用程序运作,但程序容器化让多个应用程序得以存在同一操作环境中,开发人员将代码、微服务放置在可复制、搬移的容器中,轻松地复制、发布到任意云平台,多个容器间不会互相干扰(沙盒机制),不仅减少管理工作还能更有效地利用硬件资源,实现更快的持续集成、交付与发布。
★ 在动态管理方面:通过集中的编排调度系统进行动态管理和调度,达到高速、低风险、迅速扩展和部署的方式,进行应用或服务的构建、测试、部署。
借助以上优势以及相对一致的实践方式,云原生能快速的打通各家云环境的壁垒,企业可以对市场变化做出最快的反应,使得新创云原生企业拥有能不断颠覆传统企业的威力。
随着技术的发展,人们对云原生的定义和理解也在逐步发展。在笔者看来,云原生不仅仅是一套技术体系,究其本质,凡是能够提高云上资源利用率和应用交付效率的行为或方式都是云原生的,是一套符合云计算发展趋势的应用设计理念的方法论。Kubernetes开启了云原生的序幕,服务网格Istio的出现,引领了后Kubernetes时代的微服务,serverless的兴起,使得云原生从基础设施层不断向应用架构层挺进,我们正处于一个云原生的新时代。未来,云原生将和算力网络紧密结合,应用不需要了解所需算力的大小、所在资源池、所需网络带宽等,仅需关注业务需求,资源、调度地点、网络需求等自动实现成本最优化,实现算力和网络的融合智能编排,最终达到算网原生。
云原生发展到今日,已经形成了一个庞大的体系,从不断扩充的CNCF landscape可见一斑。