简介:攻技者,短之;理论者,长之;践行者,胜之。可以这么说,一座城市的良心就体现在下水道上,不论这座城市有多少高楼大厦,建设得有多么宏伟,只要是下雨天,雨水就变成了城市良心的检验者。如果由城市建设来类比云原生体系的建设,那么云原生的良心又应该是什么?谁是云原生的暴风雨?谁又是云原生良心的检验者?
作者 | 王银利(芸峥)
来源|阿里巴巴云原生公众号
攻技者,短之;理论者,长之;践行者,胜之。可以这么说,一座城市的良心就体现在下水道上,不论这座城市有多少高楼大厦,建设得有多么宏伟,只要是下雨天,雨水就变成了城市良心的检验者。如果由城市建设来类比云原生体系的建设,那么云原生的良心又应该是什么?谁是云原生的暴风雨?谁又是云原生良心的检验者?
云原生带来的业务价值非常多,主要有如下几条:
接下来,本文将由浅入深,从云原生的方方面面进行分析,包括基础的概念、常用的技术、一个完整的平台建设体系,让大家对云原生有个初步的了解。
云原生的定义一直在发生变化,不同的组织也有不同的理解,比较出名的有 CNCF 和 Pivotal 。下面是 CNCF 的最新定义:
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。
这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。
云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。通过将最前沿的模式民主化,让这些创新为大众所用。
另外,作为云计算领导者,Heroku 的创始人 Adam Wiggins 整理了著名的云原生十二要素(The Twelve-Factor App:https://12factor.net/zh_cn/))。之后,同样作为云计算领导者,Pivotal (已被 VMWare 收购)的 Kevin Hoffman 出版了 Beyond the 12 factor App 一书,基于原十二要素新增了三个新要素,即云原生十五要素 。
十五要素综合了他们关于 SaaS 应用几乎所有的经验和智慧,是开发此类应用的理想实践标准。十五要素适用于任何语言开发的后端应用服务,将流程自动化和标准化,降低新员工的学习成本;并且划清了与底层操作系统间的界限,以保证最大的可移植性。
下图可概览云原生所有的定义和特征:
从字面意思上来看,云原生可以分成云和原生两个部分。
云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了 IaaS、PaaS 和 SaaS 。
原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行在云环境上,要充分利用云资源的优点,比如️云服务的弹性和分布式优势。
云原生既包含技术(微服务、敏捷基础设施),也包含管理(DevOps、持续交付、康威定律、重组等)。云原生也可以说是一系列云技术、企业管理方法的集合。
好几个人问我云原生是什么,我会反问他们,如果你想自己的业务快速迭代,你希望云原生是什么。云原生一定不是一个具体的东西,而是代表了如何追求问题的本质,它本来是什么,就是什么,它是一套方法论。
云原生的本质是帮助业务快速迭代,不是业务本身,不是技术堆叠,不是生搬硬套。我们不应该看我们有什么,而要看客户本来要的是什么。
那么云原生其实就是代表了科技的进步,我们不光要提高新业务的迭代效率,还要打破旧业务的迭换效率。一个好的架构一般会兼容人类的愚蠢,所以这里的旧业务可能是历史包袱,可能是知识瓶颈带来的偏见。
我们无时无刻都在变成旧,无时无刻都在创造新。人要敢于质疑自己,质疑过去,质疑权威,才有创建新的动力和洞见。
云计算(Cloud Computing)和云原生(Cloud Native)有很大区别,主要体现在以下六个方面:
云原生应用程序源于云原生。如前所述,它们构建并部署在云中,真正地访问了云基础设施的强大功能。云计算应用程序通常是在内部使用传统基础设施开发的,并且经过调整后可以在云中远程访问。
云原生应用程序被设计为多租户实例托管(微服务架构)。云计算应用程序在内部服务器上运行,因此它们没有任何多租户实例。
云原生应用程序是高度可扩展性,可以对单个模块进行实时更改,而不会对整个应用程序造成干扰。云计算应用程序需要手动升级,从而会导致应用程序中断和关闭。
云原生应用程序不需要任何硬件或软件上的投资,因为它们是在云上进行的,通常可以在被许可方获得,因此使用起来相对便宜。云计算应用程序通常比较昂贵,因为它们需要进行基础升级以适应不断变化的需求。
由于不需要进行硬件或软件配置,云原生应用程序很容易快速实现。云计算应用程序需要定制特定的安装环境。
云原生改变的不止是技术,最终去改变的是业务。云原生既然会帮助业务快速迭代,那么业务代码和项目流程必然会发生根本性变化。典型的就是业务越来越轻,底座越来越厚,数据处理越来越自动化,非人用户越来越多。
接下来,我们可以从尤瓦尔赫拉利的三部简史来窥探下云原生的本质。
21 世纪随着人工智能的发展,人类社会将由人文主义逐渐过渡到数据主义。人类社会如果是一个比较大的数据网络,包括人类的情感都只是进化论选择下的生物算法,那么每一个人只是其中的一个数据处理器,可以是智人,可以是虚拟人,也可以是未来的超人类。我们可以拿共产主义和资本主义的区别来举例。共产主义是集中式算法,通过国家的数据网络计算每一个人的需求再进行分配;资本主义是分布式算法,少数的资本家掌控大部分的社会资源。
可以说以前的数据是一个孤岛,部署在几个物理机上,管好自己就可以,不会影响别人。而今天不一样,所有的应用都在线化,逐渐变成一个有生命力的资产后,应用的约束也会越来越严格和复杂,所有的数据流向及依赖完全是你人为难以预期的。光铺人已经解决不了了。
云原生其实很复杂,本质是连接数据,将数据从杂乱无序处理为信息、知识、智慧。云原生的复杂来源于它想容纳更多复杂的事务和结构,但某一方面来说,云原生其实又很简单,因为它给终端用户带来无穷无尽的便利和丰富功能,但又无需他们感知。复杂和简单是相对的,底层越复杂,上层越简单。
什么是云原生应用呢?和云原生的关系又是什么?云原生应用的定义基本如下:
云原生应用,是指原生为在云平台上部署运行而设计开发的应用。云原生应用不只是将应用打包成 Docker 镜像,而且需要将镜像部署到到 Kubernetes 容器云上运行。公平的说,大多数传统的应用,不做任何改动,都是可以在云平台运行起来的,只不过这种运行模式,不能够真正享受云的红利,我们也叫做云托管(Cloud Hosting)应用。
另外,云原生应用有各种不同的分类方式。根据业务场景,主要可以按照状态和职能进行分类。
云原生应用主要分为无状态应用(stateless)和有状态应用(stateful)两类。是否有无状态,主要体现为是否需要感知应用实例的状态,在 Kubernetes 中,应用实例即 Pod ,有状态应用本质上依赖于 Pod 的状态。
无状态应用就是不依赖本地运行环境的应用,实例间互相不依赖,可以自由伸缩。
无状态应用的特征:
有状态应用就是依赖本地运行环境的应用,实例之间有依赖和启动先后关系,需要做数据持久化,不能随意伸缩。
有状态应用的特征:
有状态应用和无状态应用是可以相互转化的。大部分的中间件应用都是有状态应用,例如 ZooKeeper、RocketMQ、etcd、MySQL 等。大部分的业务应用都是无状态应用,例如 Web 类应用、查询类应用等。
比如一个比较简单的云产品,在公有云部署时,可以依赖公有云的基础设施,所以是无状态;但在专有云部署时,却需要自己解决环境和对其他 BaaS 的依赖,所以是有状态,这就是基础设施和运维方式不同造成的差距。
一般情况下,我们不提倡应用之间的依赖过于复杂,尤其在专有云场景下,复杂的依赖带来的环境问题相当多,拔萝卜带泥几乎要把整个公有云搬到专有云,无论对我们还是对客户,都是比较大的心智负担。
业务应用本质上都应该是有状态的,不过它可以借助中间件、运维 API、BaaS、Serverless 的能力,把有状态转嫁到了中间件上。而能够被转嫁成无状态应用的有状态应用又叫做“伪有状态应用”。
通过中间件改造为无状态:大部分业务应用可以使用公有云上的中间件产品来实现计算、存储、网络的能力。例如 Web 应用,可以使用 RDS 等数据库产品,通过 BaaS 能力开通和依赖 RDS 实例,只实现核心的业务逻辑即可。
通过运维 API 改造为无状态:有特殊运维逻辑的应用可以调用运维 API 转嫁运维的复杂性。例如 MetaQ 需要主备切换,这时候利用 Kubernetes 上的 etcd 提供的选主 API 给 MetaQ 实例进行打标, MetaQ 开发者就可以像无状态应用一样运维 MetaQ 了。
通过 Serverless 改造为无状态:对于业务逻辑非常简单的应用,不一定需要打包镜像,可直接通过各种 Serverless 平台进行开发,交给平台来进行运维。
为了更好的识别伪有状态,我们应该从应用的本质而非状态去定义是否有无状态。而对于 ZooKeeper、etcd、MySQL 这种完全依赖自身应用代码进行运维的中间件,就算是比较彻底的有状态应用了,很难进行改造。
那么有状态到无状态的转化,有状态是消失了吗?有状态其实是本质存在的,其实面向终态,不是说不去做一些运维操作,而是根据状态变化把这些运维操作,交给平台来处理,以期达到的期望状态,这个过程就是生命周期的运维了。不是有状态减少了,而是有状态不给用户暴露而已。Kubernetes 其实帮大家解决了 Pod 的有状态。而对于有状态应用,我们需要关注 Pod 的生命周期,把业务的 Operator 变成平台的 Operator ,就是有状态改造为无状态的主要工作量了。
在云原生体系下,我们要尽量试着把有状态应用转为无状态应用,这样可以尽最大能力地使用云原生的福利,把可观测和高可用都交给云平台去保障,而开发同学只需关心离客户最近的业务。
随着技术的进步,有状态应用会不断变成无状态应用,只有少数缓存、消息、存储相关的中间件需要进行有状态运维,并且慢慢下沉到底层,后面一般人根本不需要了解二者的区别。
云原生中的应用如果按职能来区分,可以包含业务应用和运维应用两种。
业务应用就是业务开发工程师通过 Java、Go、Python 等语言来开发业务代码,然后打包为镜像后部署的应用。业务应用主要用来解决业务问题,实现特定的业务功能。业务应用的交付物主要是镜像。
在 Serverless 平台中,业务应用也可以是一些函数代码,可以打镜像;也可以不打镜像,直接部署到多语言运行环境中。
由于云原生重点需要解决应用运维自动化的问题,而业务应用无法解决自身运维的问题,即自己无法管理自己,所以需要运维应用来管理业务应用。
运维应用就是运维开发工程师用 YAML、Helm 等开发的运维代码,然后下发到 Kubernetes 上部署的应用。运维应用主要用来解决运维问题,实现特殊的运维逻辑。运维应用的交付物主要是 YAML 。
其实从 DevOps 到 AIOps 之间,还有个 DataOps,Kubernetes 的面向终态就像是一个黑盒,让人不知道运行状态如何,就像同样能跑到终点,你跑得快还是我跑得快没人知道,所以相对于面向终态又出现了可观测,用来衡量达到终态的过程是否完善,是否健康。
因此,我们在平时的设计中必须具有数据思维,进行更多的数据建模,否则可观测也是无米之炊。我们来看看云原生的各个环节中,都有哪些数据?
经常有人跟我说,云原生的技术搞得如此火热,整天让我们上云,除了节省成本外,为啥我没看出来对业务的快速交付有什么明显帮助呢?我认为可能是你还没找到一套特别适合云原生时代的业务架构。
有人说汉语是世界上最优秀的表意语言,因为汉语是二维语言,基础词汇 2000 多个,其他触类旁通,千变万化,形神俱佳,思维面广阔。而英语只是一维语言,出现一个新事物,就得创造一个新单词,没有声调,同类事物的单词也看不出关联,但在表达非海量信息的领域比较擅长,比如编程、数理化表达式等。从这里可以类比得出结论,底层的技术用机器语言 0-1 比较便捷,而上层的业务就需要一个多维的业务模型。
可以这么说,云原生带来的是不仅技术的发展,更是业务的深刻变革,那么我们现今有没有一套业务模型能指导云原生时代的复杂业务呢?
典型的如微服务架构,事件驱动架构、中台架构,但貌似都无法解决问题。笔者也进行了一些探索,发明出一套多维业务组合论,并以纵横图的方式来表征。
各个图形的含义:
我们可以从图中看出每个领域的隔离区域和拓展范围,纵横层会变得越来越多,领域也会分割地越来越细。
举个例子,有一个交易系统的应用,需要依赖消息队列和数据库,并且想部署到公有云的 Kubernetes 中。假设今天没有这些分层,那么负责这个交易系统的同学,需要自己买公有云的机器,然后部署 Kubernetes ,再然后部署中间件,接着再部署交易系统,并且需要解决各种网络和稳定性问题,结果可想而知。
另外,我们还可以从技术的发展来看纵横图的价值。技术发展得越快,业务同学感觉事情并没有以前那么简单了。因为业务的复杂度在增加,同时对迭代速度要求更高。微服务、容器、中台很多概念都是为了加速创新。解耦是为了更好的组合,那如何来把控粒度呢?这其实可以从物理学的发展看出一二。理论上人类文明进化得越高,微观会更微,宏观会更宏,例如量子力学和相对论。所以粒度的大小是跟当今社会的创新能力相匹配的。
未来我们要打技术生态,对于技术点的组合编排创新必然成为主旋律。可以这么说,单点技术很难发挥价值和沉淀下来,也极易被替换,靠做单点被集成去获得生态,这条路很难长久。一个好的平台,其中的任何一个技术点在都是可替换的。技术编排的时代到来了,云原生的最终目标是解交付,而非成本,为了更快创新。
面向终态论,有点类似数据驱动论,让软件系统更加接近人类指令的终极理论。K8s 中的面向终态,响应式编程中的数据驱动,让事件交给系统来管理,我们只需要知道自己想要什么,而不用关心如何实现。
可以说,在整个 Kubernetes 设计理念中,面向终态是其核心理念,是运维自动化的关键。比如我的应用需要 10 个实例,这机器故障时,帮我自动跟换一台等,这些需求,通过声明后提交给系统,系统会自动化的完成这些用户期望的事情。而这种方式,就是一种面向终态的设计。面向终态设计的核心手段就是使用“声明式 API”。
下面主要以 Deployment 为例,核心逻辑是把自定义 CR(MyApp)当做终态,把 Deployment 当做运行态,通过比对属性的不一致,编写相关的 Reconcile 逻辑。
一张图解释各种资源和 Controller 的关系:
从图中可以得出如下结论:
但是 Kubernetes 中的面向终态设计还不够完整,它并没有设计各类资源整个生命周期的终态定义,例如如何定义资源状态机,如何依赖 BaaS 和 Config ,如何插入钩子,如何订阅事件并处理,如何设计完成度和健康度。
运维的本质是面向过程的,所以过程也需要定义。如同人的一生的终态是走向死亡,终态真的是我们向往的吗?我们需要去拓宽生命的宽度,寻找幸福的意义。云原生中的运维也是类似的,所有资源都有生命周期,有生命周期就有过程,有过程就有状态,有状态就有状态机。
云原生的本质在于连接业务或者数据,比如为了不被云厂商锁定,就需要跨云;为了异地多活,就需要跨 Region ;边缘计算中为了简化管理或者组成逻辑集群,就需要跨 Kubernetes 集群。在这些场景下,中心化就是必然需要解决的问题。
可以这么说,大到一个国家,小到一个 ZooKeeper 选主,所谓的跨 XXX ,就必然有一个中心化的管理组织。一般来说,我们的物理隔离主要隔离的是数据中心,数据分为很多种,我们主要关心用于调度的数据,调度的数据都是比较简单表征用户的指令,我们把它叫做配置,所以云原生中的中心化管理需要一个全局的调度中心,全局配置中心,在复杂的场景下,可以在每一个物理集群中加一个可接收和解析到指令的客户端 Agent 即可。例如 Prometheus 监控的设计就是如此,我们需要在每一个 node 节点加一个监控的 Agent 进行系统监控并搜集数据上报。
自己无法编排和管理自己,自身一定是自闭环的,所以总有更上一层的对象编排自己。例如所有的集群调度系统的架构都是无法横向扩展的,如果需要管理更多的服务器,唯一的办法就是创建多个集群;还有容器无法编排自己,所以出现了 Kubernetes ;再有就是在分布式选主中,master 只能有一个,如果有两个 master,就不知道用哪个实例管理了;又比如在同一个团队只能有一个主管,要是有两个主管,必然这两个主管上面还必须出现一个主管做最终的裁定。
另外,每一层的位置不是一成不变的,业务堆栈在逐渐上移,今天我们认为复杂的事,未来会全部自动化掉。
解耦的关键在于自闭环,组合的关键在于编排,自动化的关键在于调度和调协。
在云原生中还有一个现象,就是很多功能都能引用到资源编排上去,例如云服务申请叫资源编排,运维调度叫资源编排,应用部署也叫资源编排。资源很大,编排也很大,资源+编排就是大上加大。Kubernetes 里一切皆资源,机器是资源,存储和计算是资源,服务也是资源;一切组合都是编排,有依赖就有编排,连说人是非,也能说在编排谁谁?所以我们在讲编排时,一定要加上一个限定词,否则会出现定位不清的问题。
另外,编排和调度、调协也有本质区别。举个例子,在容器平台中,虽然调度与编排同属一部分,但它们负责的内容并不相同,调度是将分布式系统中的闲置资源合理分配给需要运行的进程并采用容器进行封装的过程,编排则是对系统中的容器进行健康检查、自动扩缩容、自动重启、滚动发布等的过程。还有我们在达到面向终态的过程中,需要设计控制器对于资源的状态进行控制,这个过程就叫调协,更形象地说,在应用生命周期管理中,工作负载产生 Pod 是调度,挂载 Hook 是编排,消费 Event 是调协。
又叫依赖相对论,唯一永远不会失败的系统是那些让你活着的系统,你处在系统调用链的某个环节,相信你依赖的系统的稳定性,由它为你兜底。
下面拿业务应用的环境分层模型来举例,我们将业务应用的环境分为测试环境、预发环境、生产环境,业务应用依赖中间件,中间件需要运行在 Kubernetes 上。一般情况下,业务应用依赖的底层基础设施环境一般都具有很高的可靠性,否则出大事了。所以你在测试自己的业务应用时,主要是测试自己的核心功能,需要相信自己的上游是稳定的,不然测试系统的设计将极其复杂。当然在监控链路中,需要监控与自己业务系统相关的上游系统问题,一旦出现报警,能够找上游系统的同学来兜底。
软件的架构就是为了满足不断增长的业务需求,对原有的生命周期进行拆分,形成新的核心生命周期(主体不变)和非核心生命周期(主体变化),而非核心生命周期可以交由他人来完成,最后合并各子生命周期并发执行的结果,完成总的生命周期。
从技术的发展可以看出来,应用的粒度是越拆越小,更多技术上的代码都下沉到底层基础设施上去了。
可以毫不客气的说,在云原生应用平台上运维业务,主要包括 Pod 、配置、BaaS 应用、产品、解决方案等资源的运维。实现自动化的关键就是定义好每个资源的生命周期,并编排每个阶段的钩子和订阅事件进行消费。
近两年有个词很火,叫“降维打击”,“消灭你,与你无关”,出自科幻小说《三体》。大概意思是说,用高级生物去打低级世界的生物,一打一个准。用更通俗的语言表达,就是利用错位竞争的方式让你永远领先对手。在云原生中,无论是技术还是业务,如果充满反叛精神,敢于创新,均可产生降维打击。降维打击的实现有三种路径:
另外,我们还可以根据不同的业务场景,选择不同的研发模式:
早在 1991 年 Jeffery Moore 针对高科技行业和高科技企业生命周期的特点,提出了著名的“鸿沟理论”。这个理论基于“创新传播学”,将创新性技术和产品的生命周期分为五个阶段:创新者(Innovator)、早期使用者(Early adopters)、早期大众(Early majority)、晚期大众(Late majority)、落后者(Laggard)。
Kubernetes 在 2017 年底成为容器编排事实标准,之后以其为核心的云原生生态持续爆发,在传播周期上可以说已经跨过鸿沟了,进入 Early majority 早期大众阶段,开始占领潜力巨大的主流市场。
飞轮效应指为了使静止的飞轮转动起来,一开始你必须使很大的力气,一圈一圈反复地推,每转一圈都很费力,但是每一圈的努力都不会白费,飞轮会转动得越来越快。达到某一临界点后,飞轮的重力和冲力会成为推动力的一部分。这时,你无须再费更大的力气,飞轮依旧会快速转动,而且不停地转动。
飞轮效应其实也是复利效应,下面以 AWS 的崛起举个例子, AWS 的三大支柱业务就是让飞轮效应启动的关键:
云原生的技术发展十分之快,自从云原生理念提出以后,每年都有层出不穷的新技术孵化,本章节主要介绍云原生的各种常用的开源技术。
从模板技术到配置技术,再到编程技术,运维的灵活性逐次增强。模板技术过于死板,无法抽象成现实世界的对象;编程技术虽然很灵活,但是复杂度十分高,增加了很多不可控因素,运维成本十分高。所以,从我的角度上理解,动态配置技术未来会逐渐代替模板技术,成为主流。
所以有着严格约束的语言好呢,还是灵活万能的语言好呢?我认为跟它的使用场景有关,一味的统一只是抹杀了业务的丰富多彩,践行“通用就是无用”的理论。
YAML 是一个可读性高,用来表达数据序列化的格式。在 Kubernetes 中,面向终态、数据驱动和声明式 API,均是通过 YAML 来体现的。
但是 YAML 无法体现面向对象的设计思想,我们很难将各种扁平的 YAML 碎片关联起来,也无法清晰地推测事务的发展轨迹。而且在 YAML 中嵌入 JSON 和其他脚本的方式,也在把该语言变成一个蹩脚的万能语言。为了解决 YAML 的一系列问题,社区逐渐发展出了各种增强 YAML 的技术,例如动态配置和运维框架等。如果 Kubernetes 是未来的操作系统,那么 YAML 就是未来的汇编语言。
官网:https://yaml.org/
Helm 是 Kubernetes 的软件包管理工具。但显然,它并不只想成为一个包管理工具,同时它还包含模板渲染、简单的依赖配置。
Helm 依旧延续了 YAML 的缺点,只是简单的把 YAML 堆在了一起。同时复杂的模板语法调试成本极高,例如各种流程控制结构结合空格缩进问题,对于眼神不好的人简直是个灾难。
官网:https://helm.sh/
Kubernetes Universal Declarative Operator,提供了一种通过声明式构建产品级Kubernetes Operator。针对 Kubernetes 对工作负载做了一些简单的自动化增强之外,还需要一些更复杂的场景需要手动解决,而 KUDO 就是用于来帮助开发人员全面自动化的方式。
KUDO 的包结构和 Helm 比较类似,但是在 Helm 的基础上增加了资源的执行计划编排,编排的动作相对于 Helm 只有 Apply ,还增加了 Delete、Toggle 等。
官网:https://kudo.dev/
Metacontroller 是一个封装了自定义控制器所需的大部分基础功能的针对 Kubernetes 的扩展服务。当你通过 Metacontroller 的 API 去创建一个自定义的控制器时,你仅需要在你的控制器中提供一个你所需要的业务逻辑函数。这些业务逻辑函数会通过 webhooks 的方式被触发。
MetaController 看起来配置简洁,但是却想借技术手段解决业务问题,且解决的有限,目前主要包括两种手段:
一是为一组对象构建复合对象的控制器;二是为已经存在的对象添加新的行为。
官网:https://metacontroller.app/
CUE,发音为 Q ,是一种通用且基于约束的强类型语言,旨在简化涉及定义和使用数据的任务。CUE受到多种语言的影响,例如 BCL、GCL、LKB、Go、JSON、Swift、Typescript、Javascript、Prolog、Jsonnet、HCL、Flabbergast、Nix、JSONPath、Haskell、Objective-C 和 Python 等。
CUE 设计时考虑了云配置和相关系统,但不限于此域。它从关系编程语言中衍生出其形式主义,同时 CUE 延续了 JSON 超集的思路,在技术方面的关键创新在于基于集合论实现了类型设计,可以说是 BCL 思路的一种开源版实现。目前 CUE 的生态还不是很强大,没有配套的开发工具,但是好在阿里的多个团队正在积极研发它。
官网:https://cuelang.org/
Jsonnet 是 Google 开源的一门配置语言,用于弥补 JSON 所暴露的短板,它完全兼容 JSON ,并加入了 JSON 所没有的一些特性,包括注释、引用、算数运算、条件操作符、数组和对象深入、引入函数、局部变量、继承等,Jsonnet 程序被编译为兼容 JSON 的数据格式。简单来说 Jsonnet 就是增强版 JSON 。
Jsonnet 的生态比较完善,无论 Jsonnet 文件还是 Libsonnet 都有开发工具,并且还有开源的 UI 组件。目前 Promethus 和 Kubeless 都使用了该动态配置语言。
官网:https://jsonnet.org/
HCL 是 HashiCorp 构建的配置语言。HCL 的目标是构建一种人机友好的结构化配置语言,以与命令行工具一起使用,但专门针对 DevOps 工具,服务器等。HCL 也完全兼容 JSON 。也就是说 JSON 可以用作期望使用 HCL 的系统的完全有效输入。这有助于使系统与其他系统互操作。
官网:https://github.com/hashicorp/hcl
Kusion 主要是基于云原生基础设施的高级专用语言及工具链,在不可变业务镜像外提供 "Compile to Cloud" 的完整技术栈支持。Kusion 由 KCL 语言及工具链,KusionCtl 工具,Kusion-Models SDK 及 OCMP 实践定义四部分组成。
KCL 是一种专用于配置定义、校验的动态强类型配置语言,重点服务于 configuration & policy programing 场景,以服务云原生配置系统为设计目标,但作为一种配置语言不限于云原生领域。KCL 吸收了声明式、OOP 编程范式的理念设计,针对云原生配置场景进行了大量优化和功能增强。
Kusion 由阿里内部研发,目前尚未开源。
Operator 是 CoreOS 推出的旨在简化复杂有状态应用管理的框架,它是一个感知应用状态的控制器,通过扩展 Kubernetes API 来自动创建、管理和配置应用实例。
一个 Operator 工程一般必须包含 CRD 和 Controller,Webhook 是可选的。如果说 Kubernetes 是 "操作系统" 的话,Operator 是 Kubernetes 的第一层应用,使用 Kubernetes "扩展资源" 接口的方式向更上层用户提供服务。Operator 的实现方式主要包括 OperatorSDK 和 KubeBuilder ,目前 KubeBuilder 在阿里使用的比较多。
希望通过设计一个通用化的 Operator 平台来解决原生 Operator 的各种问题,这个平台的核心目标包括:
OperatorPlatform 由阿里内部研发,目前尚未开源。
Pulumi 是一个架构即代码的开源项目,可在任何云上创建和部署使用容器,无服务器功能,托管服务和基础架构的云软件的最简单方法。Pulumi 采用了基础设施即代码以及不可变基础设施的概念,并可让您从您最喜欢的语言(而不是 YAML 或 DSL)中获得自动化和可重复性优势。
Pulumi 的中心是一个云对象模型,与运行时相结合以了解如何以任何语言编写程序,理解执行它们所需的云资源,然后以强大的方式规划和管理您的云资源。这种云运行时和对象模型本质上是与语言、云中立的,这就是为什么我们能够支持如此多的语言和云平台。
官网:https://www.pulumi.com/
Ballerina 是一款开源的编译式的强类型语言。Ballerina是一种开放源代码编程语言和平台,供云时代的应用程序程序员轻松编写可以正常运行的软件。Ballerina 是语言和平台的组合设计,敏捷且易于集成,旨在简化集成和微服务编程。
Ballerina 是一种旨在集成简化的语言。基于顺序图的交互,Ballerina 内置了对通用集成模式和连接器的支持,包括分布式事务、补偿和断路器。凭借对 JSON 和 XML 的一流支持,Ballerina 能够简单有效地构建跨网络终端的强大集成。
官网:https://ballerina.io/
CDK8S 是 AWS Labs 发布的一个使用 TypeScript 编写的新框架,它允许我们使用一些面向对象的编程语言来定义 Kubernetes 的资源清单,CDK8S 最终也是生成原生的 Kubernetes YAML 文件,所以我们可以在任何地方使用 CDK8S 来定义运行的 Kubernetes 应用资源。
官网:https://cdk8s.io/
Terraform 是一个构建、变更、和安全有效的版本化管理基础设施的工具。Terraform 可以管理已存在和流行的服务提供商以及定制的内部解决方案。Terraform 的特性包括:架构就是代码、执行计划、资源图、变更自动化等。
官网:https://www.terraform.io/
以应用程序为中心的标准,用于构建云原生应用程序平台。OAM 综合考虑了在公有云、私有云以及边缘云上应用交付的解决方案,提出了通用的模型,让各平台可以在统一的高层抽象上透出应用部署和运维能力,解决跨平台的应用交付问题。
OAM 的核心理念如下:
官网:https://oam.dev/
KubeVela 是一个简单易用且高度可扩展的应用管理平台与核心引擎。KubeVela 是基于 Kubernetes 与 OAM 技术构建的。对于应用开发人员来讲,KubeVela 是一个非常低心智负担的云原生应用管理平台,核心功能是让开发人员方便快捷地在 Kubernetes 上定义与交付现代微服务应用,无需了解任何 Kubernetes 本身相关的细节。在这一点上,KubeVela 可以被认为是云原生社区的 Heroku。
官网:https://oam.dev/
OpenKruise 是 Kubernetes 的一个标准扩展,它可以配合原生 Kubernetes 使用,并为管理应用容器、Sidecar、镜像分发等方面提供更加强大和高效的能力。OpenKruise包括以下资源:
官网:https://openkruise.io/
BaaS 即指业务应用依赖的后台服务,它需要有一个服务目录,供用户选择需要使用的中间件,然后通过 BaaS Plan 选择规则,再创建完服务实例后,再通过 BaaS Connector 和 BaaS 的 Endpoint 绑定。更多原理可以参看云原生应用平台的服务中心章节。
服务目录是 Kubernetes 社区的孵化项目 Kubernetes Service Catalog 项目,旨在接入和管理第三方提供的 Service Broker ,使 kubernetes 上托管的应用可以使用 Service Broker 所代理的外部服务。
官网:https://github.com/kubernetes-sigs/service-catalog
Open Service Broker API 项目使独立软件供应商,SaaS 提供者和开发人员可以轻松地为运行在 Cloud Foundry 和 Kubernetes 等云原生平台上的工作负载提供支持服务。该规范已被许多平台和数千个服务提供商采用,它描述了一组简单的 API 端点,可用于提供,获取和管理服务产品。该项目的参与者来自 Google、IBM、Pivotal、Red Hat、SAP 和许多其他领先的云公司。
官网:https://www.openservicebrokerapi.org/
Spring Cloud Connector 为在云平台上运行的基于 JVM 的应用程序提供了一个简单的抽象,可以在运行时发现绑定的服务和部署信息,并且支持将发现的服务注册为 Spring Bean 。它基于插件模型,以便相同的编译应用程序可以在本地或任何多个云平台上进行部署,并通过 Java 服务提供程序接口(SPI)支持定制服务定义。
官网:https://cloud.spring.io/spring-cloud-connectors/
Service Mesh 直译过来是服务网格,目的是解决系统架构微服务化后的服务间通信和治理问题。服务网格由 Sidecar 节点组成。
Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动。Istio 的能力如下:
目前 AliMesh 和 ASM 都使用的是 Istio 方案。
官网:https://istio.io/
linkerd 是一个透明的服务网格,旨在通过透明地将服务发现、负载均衡、故障处理,插桩和路由添加到所有的服务间通信中,使现代应用程序安全可靠,而无需侵入应用内部本身的实现。
linkerd 作为一个透明的 HTTP/gRPC/thrift/ 等代理,通常可以以最少的配置被加入到现有的应用程序中,不管这些应用程序采用什么语言编写。linkerd 能与许多通用协议和服务发现后端运行,包括 Mesos 和 Kubernetes 等预定好的环境。
官网:https://linkerd.io/
Dapr 是微软开发的开源的、可移植的、事件驱动的应用运行时,它使开发人员可以轻松地构建弹性的、微服务的无状态和有状态的应用,这些应用运行在云端和边缘之上。Dapr 作为 Sidecar 更像微服务的运行时,为程序提供本来不具备的功能。Dapr 的主要功能如下:
官网:https://dapr.io/
Dubbo 是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。目前阿里内部使用的 HSF 也将逐渐被 Dubbo 代替。
官网:http://dubbo.apache.org/
Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 Token、全局锁、决策竞选、分布式会话和集群状态)操作的开发工具。使用 Spring Cloud 开发者可以快速实现上述这些模式。
目前阿里基于原生 Spring Cloud 框架再加上阿里中间件做了一版增强,叫做 Spring Cloud Alibaba 。
Serverless 本质上是不需要别人感知服务器,可以根据不同的无服务器场景分为 Kubernetes Serverless、App Serverless、BaaS Serverless、FaaS Serverless、Data Serverless 等。
Serverless 在非容器时代,在大数据和人工智能领域,已经得到一定程度的发展,例如阿里内部的 ODPS、TPP 等平台;但是容器时代的到来,更是大大加速了 Serverless 的发展。
还有,Serverless 在前端领域发展的十分风骚,出现了各种各样易用性非常好的 Serverless 平台。
CloudEvents 是一种规范,用于以通用格式描述事件数据,以提供跨服务、平台和系统的交互能力。
事件格式指定了如何使用某些编码格式来序列化 CloudEvent。支持这些编码的兼容 CloudEvents 实现必须遵循在相应的事件格式中指定的编码规则。所有实现都必须支持 JSON 格式。
官网:https://cloudevents.io/
Serverless Framework 是业界非常受欢迎的无服务器应用框架,开发者无需关心底层资源即可部署完整可用的 Serverless 应用架构。Serverless Framework 具有资源编排、自动伸缩、事件驱动等能力,覆盖编码-调试-测试-部署等全生命周期,帮助开发者通过联动云资源,迅速构建 Serverless 应用。
官网:https://github.com/serverless/components/blob/master/README.cn.md
Kubeless 是一个基于 Kubernetes 的 Serverless 框架,允许您部署少量代码,而无需担心底层基础架构管道。它利用 Kubernetes 资源提供自动扩展、API 路由、监控、故障排除等功能。Kubless 有三个核心概念:
官网:https://kubeless.io/
Nuclio 是专注于数据,I/O 和计算密集型工作负载的高性能“无服务器”框架。它与 Jupyter 和 Kubeflow 等流行的数据科学工具很好地集成在一起;支持各种数据和流媒体源;并支持通过 CPU 和 GPU 执行。Nuclio 项目于 2017 年开始,并且一直在迅速发展。许多初创企业和企业现在都在生产中使用 Nuclio。
Fission 是由私有云服务提供商 Platform9 领导开源的 serverless 产品,它借助 Kubernetes 灵活强大的编排能力完成容器的管理调度工作,而将重心投入到 FaaS 功能的开发上,其发展目标是成为 AWS lambda 的开源替代品。Fission 包含三个核心概念:
官网:https://fission.io/
OpenFaas 是一个受欢迎且易用的无服务框架(虽然在上表中不及 OpenWhisk)。但它不像 OpenWhisk 那么受欢迎,而且代码的提交都是基于个人进行的。除了个人开发者在业余时间的贡献外,VMWare 还聘请了一个团队在全职维护 OpenFaas。
官网:https://www.openfaas.com/
OpenWhisk 是一个成熟的无服务框架,并且得到 Apache 基金会和 IBM 的支持。IBM 云函数服务也是基于 OpenWhisk 构建的。主要提交者都是 IBM 的员工。OpenWhisk 利用了 CouchDB、Kafka、Nginx、Redis 和 ZooKeeper,有很多底层的组件,所以增加了一定的复杂性。
官网:https://openwhisk.apache.org/
Fn是可以运行在用户侧或者云端的容器原生的无服务器计算平台。它需要使用 Docker 容器。该项目主要的贡献者都来自于 Oracle。还有一个叫 Fn Flow 的新功能,它可以用来编排多函数,类似 OpenWhisk。
官网:https://fnproject.io/
Serverless Devs 是阿里巴巴首个开源的 Serverless 开发者平台,也是业内首个支持主流 Serverless 服务/框架的云原生全生命周期管理的平台。通过该平台,开发者可以一键体验多云 Serverless 产品,极速部署 Serverless 项目。
Knative 是谷歌开源的 Serverless 架构方案,旨在提供一套简单易用的 Serverless 方案,把 Serverless 标准化。目前参与的公司主要是 Google、Pivotal、IBM、Red Hat,2018 年 7 月 24 日才刚刚对外发布,当前还处于快速发展的阶段。Knative 是为了解决容器为核心的 Serverless 应用的构建、部署和运行的问题。此外,Knative 原始的 Build 功能已经被废弃,被 Tekton 代替。
官网:https://knative.dev/
GitOps 是一种快速、安全的方法,可供开发或运维人员维护和更新运行在 Kubernetes 或其他声明式编排框架中的复杂应用。GitOps 的四个原则如下:
对于没有管控系统,需要暂时用黑屏操作的同学来说,可以选择 GitOps ;如果有管控系统,不建议使用 GitOps ,否则你需要保证管控的数据库、Git 的文件、Kubernetes 的运行时文件的状态的一致性,中间多了一个环节,出错几率高。
Argo 是一个云原生的工作流/流水线引擎,Argo 工作流以 CRD 形式实现。Argo 工作流的每个步骤,都是一个容器。多步骤的工作流建模为任务的序列,或者基于 DAG 来捕获任务之间的依赖。Argo 主要包括以下功能:
由于 Argo 的每个步骤都是 Pod ,极其占用服务器资源,对于生产级业务系统,需要谨慎使用。
官网:https://argoproj.github.io/
Tekton 是一个功能强大且灵活的 Kubernetes 原生框架,用于创建 CI/CD 系统。通过抽象出底层实现细节,允许开发者跨多云环境或本地系统进行构建、测试与部署。Tekton 整体的架构抽象非常棒,基本能解决所有容器下的编排问题。
但同样每个步骤都是 Pod ,跟 Argo 一样极其占用资源。
官网:https://github.com/tektoncd
Kubernetes Federation(以下简称 KubeFed)允许您通过托管集群中的一组 API 来协调多个 Kubernetes 集群的配置。KubeFed 的目的是提供一种机制,用于表达应管理哪些集群及其配置以及应该如何配置的集群。KubeFed 提供的机制是有意的底层机制,旨在为更复杂的多集群用例(例如部署多地理位置应用程序和灾难恢复)奠定基础。
官网:https://github.com/kubernetes-sigs/kubefed
K3s 是一个轻量级 Kubernetes,它易于安装,二进制文件包小于 40MB,只需要 512MB RAM 即可运行。它非常适用于 Edge、IoT、CI、ARM 等场景。K3s 是 Rancher 出品的一个简化、轻量的 K8s ,从名字上也能看出,K3s 比 K8s 少了些东西。
官网:https://k3s.io/
K9s 提供了一个终端 UI 与您的 Kubernetes 集群进行交互。该项目的目的是简化浏览,观察和管理应用程序的过程。K9s 持续监视 Kubernetes 的更改,并提供后续命令与您观察到的资源进行交互。K9s 是 一款管理员们喜欢的 “单一屏幕” 实用程序,K9s 提供了一个基于 curses 的全屏终端 UI ,可与您的 Kubernetes 集群进行交互。
官网:https://k9scli.io/
Minikube 是一个易于在本地运行 Kubernetes 的工具,可在你的笔记本电脑上的虚拟机内轻松创建单机版 Kubernetes 集群。便于尝试 Kubernetes 或使用 Kubernetes 日常开发。Minikube 相当于一个运行在本地的 Kubernetes 单节点,我们可以在里面创建 Pods 来创建对应的服务。
官网:https://minikube.sigs.k8s.io/
OpenYurt 主打“云边一体化”概念,依托 Kubernetes 强大的容器应用编排能力,满足了云-边一体化的应用分发、交付、和管控的诉求。OpenYurt 能帮用户解决在海量边、端资源上完成大规模应用交付、运维、管控的问题,并提供中心服务下沉通道,实现和边缘计算应用的无缝对接。在设计 OpenYurt 之初,我们就非常强调保持用户体验的一致性,不增加用户运维负担,让用户真正方便地 “Extending your native kubernetes to edge”。
官网:https://openyurt.io/en-us/
OpenShift 是红帽开发的云开发平台即服务(PaaS)。自由和开放源码的云计算平台使开发人员能够创建、测试和运行他们的应用程序,并且可以把它们部署到云中。Openshift 广泛支持多种编程语言和框架,如 Java、Ruby 和 PHP 等。另外它还提供了多种集成开发工具如 Eclipse integration,JBoss Developer Studio 和 Jenkins 等。OpenShift 只部署 Operator 应用,并提出了 Operator 成熟度,有自己的 Operator 应用定义模板。相对其他容器平台来说,还是比较轻的。
官网:https://www.openshift.com/
Cloud Foundry 是 Pivotal 公司开发的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。
Cloud Foundry 和 Spring Cloud Connector 结合,对于 Spring 应用的服务依赖问题支持得非常好。但是 Cloud Foundry 相当重,在容器时代之前就存在了,运维难度很高,要谨慎使用。
官网:https://www.cloudfoundry.org/
KubeSphere 是 QingCloud 开发的基于 Kubernetes 构建的分布式、多租户、多集群、企业级开源容器平台,具有强大且完善的网络与存储能力,并通过极简的人机交互提供完善的多集群管理、CI / CD 、微服务治理、应用管理等功能,帮助企业在云、虚拟化及物理机等异构基础设施上快速构建、部署及运维容器架构,实现应用的敏捷开发与全生命周期管理。
KubeSphere 可谓是业届的良心之作,交互体验十分棒,功能也很完善,和 App Matrix 几乎承担了 QingCloud 的所有业务应用和云产品的运维。而目前的阿里云云产品基本都是垂直化的运维系统。
Azure 是微软开发的基于云计算的操作系统,原名“Windows Azure”,和 Azure Services Platform 一样,是微软“软件和服务”技术的名称。Microsoft Azure 的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web 和 PC 上的应用程序。另外,通过 Azure 的 Service Fabric ,可轻松开发、打包、部署和管理可缩放且可靠的微服务(或者非微服务)。
官网:https://azure.microsoft.com/zh-cn/
Anthos 是 Google 开发的以 Kubernetes 为核心的混合云/多云管理平台,主要作用是保护客户的网络连接和应用程序,并以容器化的部署形式,提供云服务支撑能力。它的开发是因为客户希望使用单一的编程模型,这使他们可以选择并灵活地将工作负载转移到 Google Cloud 和其他云平台(如 Azure 和 AWS)而不做任何更改。
官网:https://www.anthos.org/
Heroku 是 Salesforce 旗下云服务商,提供方便便捷的各种云服务,如服务器、数据库、监控、计算等。并且它提供了免费版本,这使得我们这些平时想搞一些小东西的人提供了莫大的便捷,虽然它有时长和宕机的限制,但是对于个人小程序来说已经足够了。
官网:https://www.heroku.com/
Crossplane 是 Upbond 公司开发的一个开源的多云平台控制面板,用于跨环境、集群、区域和云,管理你的云原生应用程序和基础设施。Crossplane 可以安装到现有的 Kubernetes 集群中,以添加托管服务供应,或者作为多集群管理和工作负载调度的专用控制平面部署。
目前,OAM 和 Crossplane 社区共同致力于建设一个聚焦在标准化的应用和基础设施上的开放社区。
官网:https://crossplane.io/
Rancher 是供采用容器的团队使用的完整软件堆栈。它解决了在任何基础架构上管理多个 Kubernetes 集群的运营和安全挑战,同时为 DevOps 团队提供了用于运行容器化工作负载的集成工具。
Rancher 的 Rio 是一种 MicroPaaS ,可以在任何标准 Kubernetes 集群之上进行分层。用户可以轻松地将服务部署到Kubernetes并自动获得持续交付、DNS、HTTPS、路由、监控、自动扩展、Canary 部署和 Git 触发构建等等。所有这一切只需要 Kubernetes 集群和 Rio CLI 。
官网:https://rancher.com/
Kubeflow 是谷歌发布的一个机器学习工具库,Kubeflow 项目旨在使 Kubernetes 上的机器学习变的轻松、便捷、可扩展,其目标不是重建其他服务,而是提供一种简便的方式找到最好的 OSS 解决方案。
官网:https://www.kubeflow.org/
Fluid 是一款开源的云原生基础架构项目。在计算和存储分离的大背景驱动下,Fluid 的目标是为 AI 与大数据云原生应用提供一层高效便捷的数据抽象,将数据从存储抽象出来,以便达到以下目的:
官网:https://github.com/fluid-cloudnative/fluid
KubeTEE 是一个云原生大规模集群化机密计算框架,旨在解决在云原生环境中 TEE 可信执行环境技术特有的从开发、部署到运维整体流程中的相关问题。KubeTEE 是云原生场景下如何使用 TEE 技术的一套整体解决方案,包括多个框架、工具和微服务的集合。
官网:https://github.com/SOFAEnclave/KubeTEE
我们虽然倡导应用都应该改造成无状态应用,例如 Kubernetes 中的 Deployment 就是专门针对于无状态应用的,部分状态机框架也推荐 Pipeline 也应该设计成无状态的,还有 FaaS 中的 Function 也基本都是无状态的,但是无状态真的是万能的吗?例如一些需要查库进行大量计算的高 QPS 的 Function,如果能把数据缓存在本地,是否会更好些呢?
可以说云原生的技术堆栈在不断上移,越来越接近业务。例如应用运维,我们原来想创造一门技术,处处通吃,只要中间件接入一个应用平台,随着这个应用平台就能输出到各种公有云和专有云中。但是通过很长时间的实践,我们发现不同的客户要求不同,还有各种云基础设施的差异,基本很难“一处接入,处处运行”。盲目地去搞大一统,只会陷入一个处处不行的大泥坑中。
中台理论既然能提出,必然是符合当时的业务背景的。那么为啥后来的实践却不怎么理想呢?我粗浅地认为,主要问题在于根深蒂固的 To C 基因,很难用一个大而全的业务理论去改变。我们还需要继续探索,从业务和技术两个方面去完善和改进中台理论。
你会发现,在客户决定要买你的产品时,跟你聊得都是一些高大上的功能,例如异地多活、单元化、多租隔离、限量降级等;但在买回去后,发现用到的都是一些比较基础的功能。这是因为决定买的客户和使用的客户不是同一批人,所以我们一定要深入挖掘使用产品的用户到底想要的是什么,这才能建立长期合作的机制。
每一个应用模型背后都需要相应的平台配套,应用本就是很偏业务的一层,不仅有云原生的基础应用,还有各种行业应用。不同的业务场景,对于应用的使用方式和交付流程都是不一样。另外,基本每一个平台都有自己的应用模型,所以应用模型本身是为某一个应用平台服务的,例如 OpenShift、CloudFoundry、KubeSphere 都有自己基于原生 Kubernetes 概念抽象后的应用模型。所以,同一套应用模型,只能用在某一个垂直场景中。
云原生技术的发展已经成为不可阻挡的趋势,目前正是云原生技术大幅度运用到商业化产品的最好时机。在技术体系的变革后,必然会迎来业务模式的变革,我们都知道未来会变,如何抓住云原生这个契机,找到属于时代的重要风口呢?
唯有打破旧的体系和认知才是唯一出路。
原文链接:https://developer.aliyun.com/article/779958?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。