模块定义

模块定义是组成 KubeVela 平台的基本扩展能力单元,一个模块定义就像乐高积木,它将底层的能力封装成抽象的模块,使得这些能力可以被最终用户快速理解、使用并和其他能力组装、衔接,最终构成一个具有丰富功能的业务应用。模块定义最大的优势是可以被分发共享,在不同的业务应用中重复使用,在基于 KubeVela 的不同平台上均能执行。

目前 KubeVela 一共有四种不同类型的模块定义,分别是组件定义(ComponentDefinition)、运维特征定义(TraitDefinition)、策略定义(PolicyDefinition)以及工作流步骤定义(WorkflowStepDefinition),对应了构成应用的四个基本概念。

如何获取现成的模块定义?

除了自己编写模块定义以外,你可以通过以下两大途径获得社区已有的模块定义:

模块定义的生命周期

一个模块定义通常有三个生命周期阶段:

发现

当模块定义被安装到 KubeVela 控制平面以后,最终用户就可以立即发现和查看它们。

  • 查看模块定义列表
  1. $ vela def list
  2. NAME TYPE NAMESPACE DESCRIPTION
  3. webservice ComponentDefinition vela-system Describes long-running, scalable, containerized services
  4. that have a stable network endpoint to receive external
  5. network traffic from customers.
  6. gateway TraitDefinition vela-system Enable public web traffic for the component, the ingress API
  7. matches K8s v1.20+.
  8. health PolicyDefinition vela-system Apply periodical health checking to the application.
  9. notification WorkflowStepDefinition vela-system Send message to webhook
  10. ...snip...
  • 查看模块定义的参数
  1. $ vela show webservice
  2. # Properties
  3. +------------------+-------------------------------------------------------------------------------------------+-----------------------------------+----------+---------+
  4. | NAME | DESCRIPTION | TYPE | REQUIRED | DEFAULT |
  5. +------------------+-------------------------------------------------------------------------------------------+-----------------------------------+----------+---------+
  6. | cmd | Commands to run in the container | []string | false | |
  7. | env | Define arguments by using environment variables | [[]env](#env) | false | |
  8. | labels | Specify the labels in the workload | map[string]string | false | |
  9. | annotations | Specify the annotations in the workload | map[string]string | false | |
  10. | image | Which image would you like to use for your service | string | true | |
  11. | ports | Which ports do you want customer traffic sent to, defaults to 80 | [[]ports](#ports) | false | |
  12. +------------------+-------------------------------------------------------------------------------------------+-----------------------------------+----------+---------+
  13. ...snip...

你也可以通过命令行打开一个网页查看这些参数:

  1. vela show webservice --web
  • 在 KubeVela 的 UI 控制台(需安装 velaux 插件)也可以看到

alt

模块定义在 UI 控制台上可以比较方便的查看,更重要的是会有一个比较好的用户体验,你还可以自定义 UI 展示来优化 UI 控制台上模块定义的参数展示。

使用

在 KubeVela 的 UI 控制台上使用模块定义是非常自然的,整个流程紧紧围绕应用部署计划展开,你只要跟着界面操作指引一步步点击即可使用。

alt

分为如下几步:

  1. 创建应用选择组件类型,这个过程就是选择使用某个组件定义。
  2. 填写组件的参数则会根据组件定义的不同出现不同的待填写参数。
  3. 运维特征、策略、工作流步骤的使用也是如此,分别在不同的应用部署计划业务流程中体现。

最终 UI 控制台会组装成一个符合 OAM 模型定义的完整应用部署计划,然后 KubeVela 控制器会自动化处理剩下的事情:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: first-vela-app
  5. spec:
  6. components:
  7. - name: express-server
  8. type: webservice
  9. properties:
  10. image: oamdev/hello-world
  11. ports:
  12. - port: 8000
  13. expose: true
  14. traits:
  15. - type: scaler
  16. properties:
  17. replicas: 1
  18. policies:
  19. - name: target-default
  20. type: topology
  21. properties:
  22. clusters: ["local"]
  23. namespace: "default"
  24. - name: target-prod
  25. type: topology
  26. properties:
  27. clusters: ["local"]
  28. namespace: "prod"
  29. - name: deploy-ha
  30. type: override
  31. properties:
  32. components:
  33. - type: webservice
  34. traits:
  35. - type: scaler
  36. properties:
  37. replicas: 2
  38. workflow:
  39. steps:
  40. - name: deploy2default
  41. type: deploy
  42. properties:
  43. policies: ["target-default"]
  44. - name: manual-approval
  45. type: suspend
  46. - name: deploy2prod
  47. type: deploy
  48. properties:
  49. policies: ["target-prod", "deploy-ha"]

使用 KubeVela 命令行工具来使用模块定义也是如此,只要编写上述 Application 对象的 YAML 文件即可,可以使用 vela 命令如下:

  1. vela up -f https://kubevela.net/example/applications/first-app.yaml

Application 也是一种 Kubernetes 的 CRD,你可以通过 kubectl 工具,或者直接调用 Kubernetes API 集成 KubeVela 功能。

自定义

⚠️ 请注意,在多数情况下,你不需要编写自定义模块,除非你的目的是扩展 KubeVela 的系统能力。在此之前,我们建议你先查看 KubeVela 内置的模块定义以及扩展插件,可能它们已经足够满足你的需求。

KubeVela 使用 CUE 配置语言来编写自定义模块,如果你对 CUE 语言还不熟悉也不必担心,可以查看 CUE 入门指南,花 15 分钟即可了解基本的实用操作。

一个模块定义包含输入、输出、操作以及这三者之间的衔接关系,一个简单的组件模块定义如下所示:

  1. webserver: {
  2. type: "component"
  3. attributes: {}
  4. }
  5. template: {
  6. parameter: {
  7. name: string
  8. image: string
  9. }
  10. output: {
  11. apiVersion: "apps/v1"
  12. kind: "Deployment"
  13. spec: {
  14. containers: [{
  15. name: parameter.name
  16. image: parameter.image
  17. }]
  18. }
  19. }
  20. }

type 字段定义了这个模块是哪种类型(组件、运维特征、策略或者工作流步骤), parameter 定义了模块的输入,output 定义了模块的输出。还有一些高级的操作你可以通过了解如何管理、编写模块定义以及模块定义与 Kubernetes 的交互协议 等章节文档了解更多细节。

下一步