KubeVela:标准化的云原生平台构建引擎

简介: 本文由“GO 开源说”第三期 KubeVela 直播内容修改整理而成,视频内容较长,本文内容有所删减和重构。

KubeVela 的背景

KubeVela 是一个基于 Go 语言开发的云原生平台级开源项目,这个项目是去年 11 月中旬正式发布的。虽然发布到现在不足两个月时间,但是 KubeVela 作为"阿里巴巴统一云原生应用平台内核”背后的核心依赖,其实已经在阿里多个产品背后运行了比较长的一段时间,我本人目前也在大量参与这些产品和项目的内核建设工作。

这套内核系统诞生自 2019 年年底阿里云联合微软共同推出的 Open Application Model(简称OAM)模型基于 Kubernetes 的实现,在不断演进和迭代中融合了大量来自开源社区(尤其是微软、字节跳动、第四范式、腾讯和满帮集团的社区参与者们)的反馈与贡献,最终在 2020 年 KubeCon 北美峰会上以 “KubeVela” 的名字正式与开源社区见面。KubeVela 项目在官宣后得到了整个云原生生态的持续关注,在发布后的第四天就登上了 Go 语言的开源趋势榜榜首。

 

图 1 KubeVela 的 GitHub Star 快速增长


KubeVela 是什么?

一言以蔽之,KubeVela 是一个面向平台构建者的、简单易用但又高度可扩展的云原生平台构建引擎

具体来说,KubeVela 的目标是让任何平台团队都能够以 Kubernetes 原生的方式,快速、高效的打造出适合不同业务场景的、能够直面用户的云原生平台出来。比如:构建应用 PaaS、数据库 PaaS、AI PaaS 或者持续交付系统等等。

 

图 2 KubeVela “关注点分离”的工作流

在设计上,KubeVela 对平台团队暴露了两大核心 API,包括:

  1. 能力模板:“能力”在 KubeVela 中,指能够组成一个完整应用的原子化功能,比如 StatefulSet 和 Ingress 就属于两种不同的“能力”。KubeVela 允许平台团队通过定义各种能力“模板”的方式,在 Kubernetes 中预置各种各样的能力。
  2. 部署环境模板:与“能力”类似,应用的部署环境在 KubeVela 中通过“环境”模板来进行预定义和初始化,比如“测试集群”和“生产集群”,就属于两种“环境”。

而作为平台的用户,比如业务团队,他们只需要通过平台团队提供的环境模板来“一键”初始化自己预期的部署集群,然后把自己需要的能力模板“组装”成一个完整的应用,就可以直接向任何 Kubernetes 集群进行应用交付和运维了。

由于上述这些能力和环境,都通过“模板”的方式进行了抽象,所以对于业务团队来说,它们并不需要学习完整的 Kubernetes 概念与细节,只需要了解上述模板暴露出来的参数,就可以无缝的使用 Kubernetes 来完成自己要做的事情。而具体通过模板暴露出哪些可配置项、背后的模板怎么渲染、渲染成什么样 Kubernetes 对象,则完全全在平台团队的掌控之中,并且可以随时调节和修改。

上述“平台团队提供能力模板”结合“业务团队组装模板声明应用”的工作流,也正是阿里和微软共同发布的 OAM 项目提倡的“关注点分离”思想的集中体现。在具体的模板支持上,KubeVela 第一期支持的是 Google 开源的 CUELang 模板语言,第二期则会支持 Helm Chart 包直接作为能力模板。

KubeVela 能为你做什么?

在了解了 KubeVela 是个什么项目以后,我们再来回答第二个大家一直都很关心的问题:作为一个平台构建者,KubeVela 能够帮助你做什么?

1. 快速构建抽象

构建“抽象”,是任何一个云原生平台的最基础、也必然会提供的功能。

我们知道,Kubernetes 暴露出来的是一套声明式 API,而所谓抽象,其实就是一个平台在这些声明式 API 的基础上,为用户暴露出来的可操作项和可配置项。作为平台团队,我们之所以要提供“抽象”,其最终目的都是为了简化用户的使用心智,让业务团队只关注他们关心的事情,避免引入大量与业务无关的平台层细节让用户“望而却步”。可以说,提供“抽象”,是任何一个平台团队落地 Kubernetes 等系统级开源项目的第一步。

业界最常见的抽象方式,是给用户提供一个图形界面来进行操作(比如 Console 或者 Dashboard),这些图形界面的共同点,就是仅允许用户填写某些特定的字段参数,从而实现简化用户心智的目的,比如下图所示的某开源 K8s PaaS 项目的 Console:

 

图 3 某开源 K8s PaaS 项目的 Console

还有一些项目(比如 Racher Rio)选择给用户提供一个命令行工具,其实它的作用跟图形界面完全类似,只不过允许填写的参数变成了 CLI 的参数而已。

当然,对于一些技术水位更高的团队,他们会基于 Kubernetes 再开发上层的 CRD + Operator 来作为“抽象”。比如 Knative 其实就是一种面向 Serverless 场景的抽象,Pinterest 公司则有自己的 Application CRD 抽象等。

那么,作为平台团队,我们又是怎么来决定给用户暴露哪些可配置参数呢?这就涉及到了“抽象”的三种基础模式(更复杂的情况都是对这三种模式的进一步组合):

  • 组合抽象,这种模式常见于我们把2个原子能力组合成为一个能力提供,比如我们在实际开发 Console 时,经常会把 K8s Deployment 和 Service 进行“组合”,暴露出一个 Web Service 的概念来让用户可以在一个表单里同时定义容器镜像和暴露端口。
  • 拆分抽象,这种模式常见于我们希望在使用流程上把一个对象上的字段分开成几个表单来进行分步骤填写,从而解耦部署时与运维时的配置。比如一个 Pod 里面的多个容器, 我希望在第一个表单里让用户填写业务容器,在另一个表单让运维填写 Sidecar 容器。再比如 ArgoRollout 这个对象,我会希望一个表单让用户填写容器镜像,另一个表单让运维填写灰度策略。
  • 转换抽象,这种模式通常用于改个名字,或者说去掉一些无关的概念,比如 Knative Revision 跟 Deployment 本质上是一一对应的,但是里面类似 LabelSelector 这种用户不需要关心的字段在 Knative 就会直接去掉了。

 

图 4 常见抽象模式

上述几种抽象的模式,在业界的很多平台级项目和产品中都有体现。但另一方面,如何正确的设计抽象,以及如何确保抽象能够满足业务方用户的使用需求和习惯,其实是一个非常具备挑战性的问题。这里的关键点在于,无论是图形化界面,还是 CRD Operator,这些“抽象”一旦上线,对它的修改就非常困难。可是另一方面,业务方用户的需求,又几乎不可能是一成不变的(实际情况甚至是“一天一个样”)。

KubeVela 对于“抽象”的设计与实现

作为阿里巴巴的平台团队,我们在进行大规模云原生应用基础设施的实践中,同样也遇到了如何设计“抽象”的难题与挑战。经过大量的尝试与总结,我们最终和研发效能团队一起选择了 GitOps + IaC(Infrastructure as Code)的技术组合来解决这个问题(具体大家可以看这篇文章:《云原生时代,应用架构将如何演进?》)。

其中,GitOps 更多是对交付流水线的创新,而 IaC 的存在,就是为了解决“抽象”这个问题。具体来说,IaC 的强大之处在于,它对“抽象”的定义是通过“模板”来表达的。这意味着一个“抽象”背后,并不需要 CRD Operator 这样复杂的服务器端编程工作,作为平台团队我们只需要提交一个模板,用户就“自动”有了抽象后的字段;而如果要修改这些抽象字段,我们只需要将对应模板更新,用户那边的抽象也就“自动”改变了。这种抽象机制的调整和更新,不需要任何重新编译和上线的环节,所以我们把它也称为“客户端抽象”。

 

图 5 用户、抽象、模板和原始 K8s API 之间的关系

在具体的实现上,阿里巴巴是通过CUELang 这个 Google 开发的模板语言来定义抽象模板的,这也是为何 KubeVela 第一期先开源了基于 CUE 的抽象机制。在具体使用上,平台团队只需要将 CUE 模板按照 OAM 规范(即:WorkloadDefinition 和 TraitDefinition 对象)注册(kubectl apply)到 Kubernetes 集群当中,业务用户就可以立刻使用这个抽象(具体的使用方式我们后面会详细说明)。

另一方面,CUE 之所以受到 Google 和阿里的青睐,还在于它比较完善的抽象层实现能力。比如前面我们总结了抽象的三种模式,其中 “转换抽象”和“组合抽象”在模板渲染的时候很容易做,无非就是模板渲染的时候换个字段名称,生成的内容变成多个对象而已。但是拆分抽象其实是有很大难度的,这涉及到拆分后能力的独立运行以及最终两个能力又重新组合到一起(patch-merge)的过程。

而借助 KubeVela,这个拆分就比较简单了。以前面提到解耦业务容器与 Sidecar 容器的定义流程为例,我们希望把“定义业务容器”和“定义 Sidecar 容器”在用户侧拆到两个不同的表单上去。在具体执行上,平台团队只需要注册一个 WorkloadDefinition 对象(名叫 worker),里面携带业务容器的 Deployment 模板,然后再注册一个 TraitDefinition 对象(名叫 sidecar),里面只携带 Sidecar 容器的模板,那么 KubeVela 就会对用户侧暴露出 worker 和 sidecar 两套完全独立的可配置项,使得用户可以在部署时只需要填写 worker 中的业务容器参数,运维则可以在后续的运维时独立填写 sidecar 的配置参数,而完全不需要对用户的 worker 部分进行任何修改。

 

图 6 KubeVela 对 Kubernetes API 进行“拆分”的例子


当然,除了 CUE 之外,上述抽象机制也可以通过 Helm 来实现,并且同 GitOps 流水线无缝集成。这个功能会作为 KubeVela 下一个重要特性发布,届时我们会分享基于 KubeVela 构建持续交付系统的案例与最佳实践。

2. 快速构建用户使用界面

在有了上述“抽象”之后,作为平台的最终用户,业务团队就可以通过某种方式使用这些抽象来交付和管理应用了。在这一层,KubeVela 不会做任何约束,相反,它的目标是让抽象能够被直接透出在用户的使用界面上,这样,当平台团队对这些抽象进行了调整之后,业务用户就可以立即使用到最新的抽象,不需要对系统做任何更新或者升级。

在具体执行上,KubeVela 会给上述抽象自动生成 JSON schema,这个 JSON schema 的内容,就是该抽象允许用户填写的参数列表和类型。所以无论是图形界面,还是其他用户界面,就可以直接使用这个 JSON schema 渲染出用户表单,甚至生成使用文档。

比如前面解耦 Sidecar 容器定义的例子,KubeVela 就会为用户暴露出两份 JSON schema:一个用来定义业务容器的参数列表,一个用来 Sidecar 容器的参数列表,前端就可以渲染成两个独立的表单来供用户填写。

正是上述 IaC 抽象 + 自动生成 Schema 的机制,让基于 KubeVela 构建面向用户的使用界面不仅变得非常简单,而且还高度可扩展:这些抽象背后的模板只要被平台管理员修改,就会立刻体现在用户的图形界面表单上,根本不需要进行系统升级和重新上线。

在 KubeVela 中,它内置了一个简化版的图形界面,叫做 Appfile,它其实就是把上述抽象的 schema 以 YAML 的方式展示了出来,从而允许用户进行修改和配置,在下面的例子中,我们可以形象的看到每一个“能力抽象”(route,autoscaler 等等)在 Appfile 如何体现为一个个可配置项的。

图 7 在 Appfile 使用 KubeVela 中的抽象

图 8 使用 vela traits 查看已经注册的能力

图 9 使用 vela show 查看能力的使用文档(自动生成)

目前,Appfile 是 KubeVela 内置的使用“抽象”的主要用户界面。与此同时,相同机制的 Dashboard 和Restful API 则计划在 2021 Q2 在 KubeVela 中发布出来,从而让用户通过图形界面和 API 的方式来定义和使用这套抽象机制。

值得一提的是,作为 Kubernetes 原生的平台构建引擎,KubeVela 的上述抽象机制和 Appfile 本身,全部都以声明式 API 的方式实现在 Kubernetes 当中,其中 Appfile 对应的 CRD 就叫做 Application 对象。

所以作为平台团队,他们通过 Definition CRD 来注册抽象模板,作为平台的用户,他们实际上则是通过这个 Application CRD 来使用抽象模板,整套机制完全以 Kubernetes 插件的方式运行,提供了最原生的被集成和可扩展能力。

3. 借助 Terraform 统一定义和管理云资源

而有了 Definition + Application 这套体系(这也正是 OAM 规范的核心内容)之后,KubeVela 就可以在一套统一的使用体验和 API 下,集成更多的能力提供方,比如:Terraform。

Terraform 是业内知名的创建云资源的工具,它丰富的生态几乎包含了所有主流云厂商的大部分云资源,是对 Kubernetes 云资源管理能力不足最好的补充。 在 KubeVela 中使用 Terraform 定义和拉起云资源非常简单,如下图所示:

 

图 10 KubeVela 使用 Terraform 拉起云资源

1)平台团队:注册云资源模板和抽象

平台团队的工作是定义一个名为"aliyun-rds"的 WorkloadDefinition 对象,并且在里面定义好 Terraform 阿里云 RDS 云资源的模板。在上述例子中我们同样是通过 CUE 来编写的 Terraform 配置, 这是因为 Terraform 云资源本身支持使用 JSON 格式描述,而 CUE 又是 JSON 的超集,所以可以自然的使用 Terraform 所有的能力。

当然,另一方面我们也在计划支持 Terraform 的 HCL 语法来作为 KubeVela 的另一种模板语言。在 CUE 模板中我们引用了阿里云的 RDS 定义,并抽象成 user、password等少量用户字段(parameter)。

2)用户:定义和使用云资源

这样,用户只需要在 Appfile 中,填写一个新的 Service,命名为 sample-db 而其类型就是我们上面定义的 aliyun-rds,就可以在这个部分定义模板中提供的 user,password 等参数。

除此之外,用户还可以在上面的 express-server 这个业务应用中定义数据绑定,填写名为 sample-db 的配置及其映射的环境变量名称。

最后,用户只需要一句 vela up 命令,KubeVela 就会拉起业务容器,然后自动把 Terraform 创建的阿里云RDS返回的链接信息传递到业务的容器中,我们可以在最后一部分看到这个应用已经成功启动,并获得了数据库的连接信息。当然,这个流程中的数据传递和编排功能,也是 KubeVela 内置的核心能力。

总结

作为 Kubernetes 上第一个云原生平台构建引擎以及 OAM 模型的完整实现,KubeVela 为平台构建者提供的能力远不止这些,比如后续即将开源的统一应用灰度框架、多集群多环境的交付组件、CRD Controller 的生命周期管理等等,都是 KubeVela 重点打造的的核心能力。限于篇幅就不再一一展开,非常欢迎大家到社区中使用和反馈,了解更多的细节。

欢迎加入 KubeVela 社区

正如最开始所言,KubeVela 是一个由社区发起社区构建的项目,所以在项目的早期,我们就已经收获了 38 名贡献者,来自数十家不同的公司,这是一个非常开放的社区,也有大量的新功能在规划和实现中,欢迎大家的贡献、使用和反馈。

 

 

如果你想要更好的了解 KubeVela 项目,欢迎前往其官方网站上学习具体的示例和手册。更高阶的,可以尝试为 KubeVela 添加来自开源社区的插件能力。此外,如果你有任何关于扩展 KubeVela 的奇妙想法,比如,基于 KubeVela 开发一个自己的云原生数据库场景 PaaS 或者 AI 场景 PaaS,欢迎前往 OAM 社区通过 Issue 来进行讨论。

作者:孙健波(天元)

原文链接

本文为阿里云原创内容,未经允许不得转载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫画:什么是自动驾驶?

作者:小灰来源:程序员小灰什么是自动驾驶自动驾驶,也被称为无人驾驶,顾名思义,是指交通工具在没有人类操作的情况下,也能够完成环境的感知与导航,顺利到达目的地。从传统的手动驾驶到智能的自动…

一场关于动态化开发实践的技术探讨

简介: 开发团队在面临业务高并发需求时,如何对技术模型进行迭代升级? 在过去的一年中,经过跟支付宝移动端团队和广大开发者的交流和沟通,我们了解到大家在涉及到关于移动应用跨端开发的过程中遇到的一些问题&#xff0…

云效故障定位研究论文被ICSE 2021 SEIP track收录

近期,由阿里云云效团队联合复旦大学CodeWisdom研究团队、阿里技术风险部安全生产团队,合作完成的论文《MicroHECL: High-Efficient Root Cause Localization in Large-Scale Microservice Systems》被ICSE 2021 SEIP track录用。本文针对大规模微服务系统…

CSDN 开学见面礼!3 周带你 Get 大厂工程师基础能力

暑假即将结束,金秋开学季来袭。别让年轻的自己虚度光阴,现在加入C友会,大厂CTO级别导师陪你加buff!10+场考前辅导,50个任务文档,600+分钟大咖讲解与答疑,3周带你掌握大厂…

迷雾世界无限号服务器,迷雾世界部分服务器互通公告_迷雾世界部分服务器3月31日数据互通详情分析_手心游戏...

迷雾世界部分服务器3月31日数据互通公告!迷雾世界亲爱的玩家:为了优化游戏体验,更好地提升组队、交互的互动体验,开发组在3.27 -3.30对所有玩家进行了关于数据互通的调查投票。结果显示,78%的玩家投票同意。因此&#…

一文读懂云上DevOps能力体系

简介: 阿里云ECS自动化运维套件架构师,深度拆解云上运维能力体系建设:自动化运维等级金字塔、自动化运维的进阶模式、DevOps的基础核心、云上标准化部署三大能力…… 序言 云计算行业已经有十多年的发展了,话题早已从“要不要上云…

mcem r语言代码_R语言阈值自回归模型(TAR)代码示例

原文链接:R语言时间序列TAR阈值模型分析​tecdat.cn阈值模型用于统计的几个不同区域,而不仅仅是时间序列。一般的想法是,当变量的值超过某个阈值时,过程可能表现不同。也就是说,当值大于阈值时,可以应用不同…

【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解🌏题目描述&a…

EDAS微服务应用同城容灾最佳实践

简介: 大多数业务应用只要做到同城双活,就可以避免掉大多数数据中心不可用故障。本实践就是帮助大家高效、低成本地实现自己的业务应用具备同城双活容灾能力。 前言 上云目前已经是绝大数企业首选的IT基础设施建设方案,但是云上仍然存在一些…

脸书推出VR视频会议应用程序 正式跨出元宇宙第一步;三家公司新入选福布斯2021云计算百强榜;微软挖来亚马逊云业务顶级高管贝尔...

NEWS本周新闻回顾微软挖来亚马逊云业务顶级高管贝尔微软公司已经聘请亚马逊云业务高管查理贝尔担任其企业副总裁。鉴于微软的Azure 云业务正试图从亚马逊 AWS 手中争夺份额,这一挖角行动可以说是微软的一次胜利。在亚马逊前 AWS 主管安迪贾西被任命为亚马逊 CEO 后&…

三字经带拼音a4打印版_人教版八年级下册英语6单元重点单词带音标打印版

UNIT 6shoot [ʃu:t] v. 投篮,射击,发射stone [stəʊn] n. 石头weak [wi:k] adj. 虚弱的,柔弱的god [ɡɒd] n. 上帝,神remind [rɪmaɪnd] v. 提醒,使想起bit [bɪt] n. 一点,小块a little bit 有点儿&am…

拥抱云原生,Fluid结合JindoFS :阿里云OSS加速利器

简介: Fluid 是一个开源的 Kubernetes 原生的分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用。在 Fluid 上使用和部署 JindoRuntime 实现数据集的可见性、弹性伸缩、数据迁移、计算加速等,并流程简单、兼容原生 k8s 环境…

【观点】传统企业如何在数字化时代实现进化?

简介: 我们看到的数字化的大多数场景集中于日常商业消费活动,背后其实是超越个体行为的场景变革。 究竟是谁在承载这个时代一步步走进数字化场景?又是谁通过数字化技术与解决方案帮助他们实现场景变革?这个过程是什么样的&#xf…

网易数帆发布轻舟低代码平台2.0,聚焦中等复杂度企业级应用

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 轻舟低代码平台2.0发布会现场 8月26日,网易数帆正式发布轻舟低代码应用开发平台2.0版本(以下简称“轻舟低代码平台”),以全新的可视化编程语言为特色,针对中等复杂度的企业级应…

宝塔 开启_宝塔面板安装完的一些列操作

前言新安装的宝塔会有很多地方需要配置,如果懂的大佬可以跳过,如果是小白可以按照辉哥的教程一步步操作,辉哥是以虚拟机进行操作的,但是服务器也是一样的道理!安全入口因为现在使用宝塔面板的人数在激增。所以为了避免…

黑灰产攻击洪峰来袭,企业如何守住自己的钱袋子?

简介: 风控大考最佳实践 根据阿里云历史行业风险治理相关数据显示,未经风险管控的自然流量中,约三分之一比例属于疑似黑灰产的高风险行为;而在建立合理的风控指标监控体系并采取风险防控手段后,高风险用户比例下降至3%…

服务网格的最佳实践

简介: 服务网格是用于处理服务间通信的专用基础设施层。它负责通过包含现代云原生应用程序的复杂服务拓扑来可靠地传递请求。 微服务发展的这几年,新的技术和概念层出不穷,这些技术的引入本质上都是在围绕服务稳定性和业务开发效率提升&#…

高性能开发,别点,发际线要紧!

作者:轩辕之风O来源:编程技术宇宙-前言-程序员经常要面临的一个问题就是:如何提高程序性能?这篇文章,我们循序渐进,从内存、磁盘I/O、网络I/O、CPU、缓存、架构、算法等多层次递进,串联起高性能…

如何打造一个高性能的前端智能推理引擎

简介: 什么是前端智能推理引擎又该如何打造和应用呢? 什么是前端智能推理引擎 在前端智能推理引擎之前,我们先来说一下什么是”端智能”。 端智能(On-Device Machine Learning)是指把机器学习的应用放在端侧做。这里…

115配额怎么增加_笔电、平板接口少怎么办,ORICO八合一多功能扩展坞助你一臂之力...

现在笔记本电脑大多都往轻薄的外形上发展,保持性能的前提下可以增加移动的便捷性,但是弊端同样明显,那就是牺牲掉了一部分常用接口。比如我手上这部戴尔XPS,左右两侧加起来只有4个可怜的接口,其中还包括一个SD槽&#…