深入解读:KubeVela 与 PaaS 有何不同?

深入解读:KubeVela 与 PaaS 有何不同?
最新回答
孤冢清风

2021-07-13 10:03:52

KubeVela 能够为用户带来接近 PaaS 的体验,但它并不是 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 的可扩展设计

    KubeVela 从一开始就利用整个 Kubernetes 生态作为“插件中心”,将每个内置能力设计成独立、可插拔的插件。这背后有精密设计与实现,Open Application Model(OAM)作为 KubeVela 模型层起到关键作用,它是一个高度可扩展的应用定义与能力装配模型。

    用户设计和制作的任何 Workload Type 和 Trait 的定义文件,存放在 GitHub 上,全世界任何一个 KubeVela 用户都可以在自己的 Appfile 里使用这些能力。例如通过 $ vela cap(插件能力管理命令)使用相关能力。

    KubeVela 提倡面向未来的云原生平台架构,该架构认为应用平台本身架构应彻底模块化,所有能力可插拔,平台核心框架通过模型层提供标准化的能力封装与装配流程。此流程能无缝接入云原生生态中的任何应用管理能力,使平台工程师专注于能力研发和基于模型的能力封装,在为用户带来简单易用平台层抽象的同时,快速、敏捷响应用户千变万化的应用管理诉求。

架构模式与能力接入
  • PaaS 的架构特点

    经典 PaaS 产品和基于 Kubernetes 的“云原生”PaaS,虽底层实现不同,但对用户提供的使用接口和体验相似(OpenShift 除外,它是 Kubernetes 发行版)。这些 PaaS 通常有自己固定的架构和功能集合,新能力的接入往往需要对其核心系统进行修改和扩展,缺乏灵活性和开放性。

  • KubeVela 的架构与能力接入机制

    整体架构: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 中声明使用刚加进来的能力。

目标定位与发展方向
  • PaaS 的目标:主要关注提供完整的应用生命周期管理功能,提升研发效能,为用户提供简单友好的用户体验,但在面对用户多样化、快速变化的需求时,往往难以灵活适应。
  • KubeVela 的目标:在为用户带来简单易用的应用管理体验的同时,为平台管理员提供完全 Kubernetes 原生的可扩展性与灵活度。它旨在构建一个面向未来的云原生 PaaS 架构,将横向可扩展性和以应用为中心这些最佳实践带给大家,推动甚至引领云原生社区在应用层的发展。