2021-07-13 10:03:52
KubeVela 能够为用户带来接近 PaaS 的体验,但它并不是 PaaS,其与 PaaS 在设计理念、可扩展性、架构模式等方面存在显著差异,具体如下:
设计理念与可扩展性大多数 PaaS 提供完整应用生命周期管理功能和友好用户体验,但往往不可扩展。以 Kubernetes PaaS 的 Rancher Rio 项目为例,它能提供良好的应用部署体验,如快速部署容器化应用、自动分配域名和访问规则等。然而,当用户提出新需求,如运行定时任务、OpenKruise 的 CloneSet 工作负载、MySQL Operator,或根据自定义 metrics 做水平扩容、基于 Flagger 和 Istio 做渐进式灰度发布等,这些在 Kubernetes 生态中常见的能力,PaaS 要支持就必须进行一轮开发,甚至可能因先前设计而需大规模重构。
例如,一个以 Deployment 执行所有应用的 PaaS 系统,其发布、扩容等功能都基于 Deployment 实现。当用户提出原地升级诉求,需要支持 CloneSet 时,整套系统可能就得重新构建。在运维能力方面,若 PaaS 支持蓝绿发布策略,与流量管理、监控系统等有大量交互集成,当要支持“金丝雀”发布策略时,所有交互和执行逻辑基本都得重新构建,工作量巨大。
部分工程能力强的 PaaS,如 Cloud Foundry 和 Heroku,提供插件能力和插件中心,在确保平台用户体验和能力可控前提下开放一定插件能力,如允许用户接入自己的数据库或开发简单 Feature。但这种插件机制只能构建 PaaS 专属的封闭小生态能力,在云原生时代,面对 Kubernetes 生态这个近乎“无限”的能力池,显得苍白无力。
KubeVela 从一开始就利用整个 Kubernetes 生态作为“插件中心”,将每个内置能力设计成独立、可插拔的插件。这背后有精密设计与实现,Open Application Model(OAM)作为 KubeVela 模型层起到关键作用,它是一个高度可扩展的应用定义与能力装配模型。
用户设计和制作的任何 Workload Type 和 Trait 的定义文件,存放在 GitHub 上,全世界任何一个 KubeVela 用户都可以在自己的 Appfile 里使用这些能力。例如通过 $ vela cap(插件能力管理命令)使用相关能力。
KubeVela 提倡面向未来的云原生平台架构,该架构认为应用平台本身架构应彻底模块化,所有能力可插拔,平台核心框架通过模型层提供标准化的能力封装与装配流程。此流程能无缝接入云原生生态中的任何应用管理能力,使平台工程师专注于能力研发和基于模型的能力封装,在为用户带来简单易用平台层抽象的同时,快速、敏捷响应用户千变万化的应用管理诉求。
经典 PaaS 产品和基于 Kubernetes 的“云原生”PaaS,虽底层实现不同,但对用户提供的使用接口和体验相似(OpenShift 除外,它是 Kubernetes 发行版)。这些 PaaS 通常有自己固定的架构和功能集合,新能力的接入往往需要对其核心系统进行修改和扩展,缺乏灵活性和开放性。
整体架构:KubeVela 只有一个 controller,以插件方式运行在 Kubernetes 之上,为 Kubernetes 带来面向应用层的抽象和面向用户的使用界面(Appfile)。Appfile 及 KubeVela 运行机制背后的核心是能力管理模型 Open Application Model (OAM)。基于这个模型,KubeVela 为系统管理员提供基于注册与自发现的能力装配流程,可将 Kubernetes 生态中的任意能力接入 KubeVela,以“一套核心框架搭配不同能力”的方式适配各种使用场景,如 AI PaaS、数据库 PaaS 等。
能力接入操作:系统管理员或平台开发者可将任意 Kubernetes API 资源(含 CRD)及对应的 Controller 作为“能力”一键注册到 KubeVela 中,然后通过 CUE 模板语言将这些能力封装成用户可用的抽象(成为 Appfile 的一部分)。例如将 kubewatch 这个社区中的告警机制直接插入到 KubeVela 中作为一个告警 Trait 来使用:
将平台能力注册为 OAM 对象:确定 CRD 表示的能力是 Workload Type 还是 Trait(KubeWatch 作为告警机制是 Trait),通过写 TraitDefinition yaml 将其注册,KubeVela 内置的服务器端 Runtime 会识别监听注册事件并将能力纳入平台管理。
编写 CUE template 来封装对外暴露接口:社区能力对最终用户复杂,KubeVela 允许平台管理员对能力进一步封装,暴露简单易用的使用接口,通常只需几个参数。KubeVela 选择 CUE 模板语言连接用户界面和后端能力对象,且支持完全动态的模板绑定。将编写好的模板放到 Definition 文件中并 $ kubectl apply -f 到 Kubernetes 中,KubeVela 会自动识别和处理相关输入,用户就可以直接在 Appfile 中声明使用刚加进来的能力。