版本:v1.3

自定义工作流

KubeVela 的工作流机制允许你自定义应用部署计划中的步骤,粘合额外的交付流程,指定任意的交付环境。简而言之,工作流提供了定制化的控制逻辑,在原有 Kubernetes 模式交付资源(Apply)的基础上,提供了面向过程的灵活性。比如说,使用工作流实现暂停、人工验证、状态等待、数据流传递、多环境灰度、A/B 测试等复杂操作。

工作流是 KubeVela 实践过程中基于 OAM 模型的进一步探索和最佳实践,充分遵守 OAM 的模块化理念和可复用特性。每一个工作流模块都是一个“超级粘合剂”,可以将你任意的工具和流程都组合起来。使得你在现代复杂云原生应用交付环境中,可以通过一份申明式的配置,完整的描述所有的交付流程,保证交付过程的稳定性和便利性。

工作流由步骤组成,你既可以使用 KubeVela 提供的 [内置工作流步骤] 来便利地完成操作,也可以自己来编写 WorkflowStepDefinition 来达到想要的效果。

我们可以使用 vela def 通过编写 Cue template 来定义工作流步骤。下面我们来完成这个场景:使用 Helm 部署一个 Tomcat,并在部署完成后自动向 Slack 发送消息通知。

KubeVela 提供了一些 CUE 操作类型用于编写工作流步骤。这些操作均由 vela/op 包提供。为了实现上述场景,我们需要使用以下 3 个 CUE 操作:

操作名说明参数
ApplyApplication部署应用中的所有资源-
Read读取 Kubernetes 集群中的资源。value: 描述需要被读取资源的元数据,比如 kind、name 等,操作完成后,集群中资源的数据会被填充到 value 上。
err: 如果读取操作发生错误,这里会以字符串的方式指示错误信息。
ConditionalWait会让 Workflow Step 处于等待状态,直到条件被满足。continue: 当该字段为 true 时,Workflow Step 才会恢复继续执行。

所有的操作类型可参考 Cue Actions

在此基础上,我们需要两个 WorkflowStepDefinition

  1. 部署 Tomcat,并且等待 Deployment 的状态变为 running,这一步需要自定义工作流步骤来实现。
  2. 发送 Slack 通知,这一步可以使用 KubeVela 内置的 [webhook-notification] 步骤来实现。

首先,通过 vela def init 来生成一个 WorkflowStepDefinition 模板:

  1. vela def init my-helm -t workflow-step --desc "Apply helm charts and wait till it's running." -o my-helm.cue

得到如下结果:

  1. $ cat my-helm.cue
  2. "my-helm": {
  3. annotations: {}
  4. attributes: {}
  5. description: "Apply helm charts and wait till it's running."
  6. labels: {}
  7. type: "workflow-step"
  8. }
  9. template: {
  10. }

引用 vela/op 包,并将 Cue 代码补充到 template 中:

  1. import (
  2. "vela/op"
  3. )
  4. "my-helm": {
  5. annotations: {}
  6. attributes: {}
  7. description: "Apply helm charts and wait till it's running."
  8. labels: {}
  9. type: "workflow-step"
  10. }
  11. template: {
  12. // 部署应用中的所有资源
  13. apply: op.#ApplyApplication & {}
  14. resource: op.#Read & {
  15. value: {
  16. kind: "Deployment"
  17. apiVersion: "apps/v1"
  18. metadata: {
  19. name: "tomcat"
  20. // 可以使用 context 来获取该 Application 的任意元信息
  21. namespace: context.namespace
  22. }
  23. }
  24. }
  25. workload: resource.value
  26. // 等待 helm 的 deployment 可用
  27. wait: op.#ConditionalWait & {
  28. continue: workload.status.readyReplicas == workload.status.replicas && workload.status.observedGeneration == workload.metadata.generation
  29. }
  30. }

部署到集群中:

  1. $ vela def apply my-helm.cue
  2. WorkflowStepDefinition my-helm in namespace vela-system updated.

直接使用内置的 [webhook-notification] 步骤。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: first-vela-workflow
  5. namespace: default
  6. spec:
  7. components:
  8. - name: tomcat
  9. type: helm
  10. properties:
  11. repoType: helm
  12. url: https://charts.bitnami.com/bitnami
  13. chart: tomcat
  14. version: "9.2.20"
  15. workflow:
  16. steps:
  17. - name: tomcat
  18. # 指定步骤类型
  19. type: my-helm
  20. outputs:
  21. - name: msg
  22. # 将 my-helm 中读取到的 deployment status 作为信息导出
  23. valueFrom: resource.value.status.conditions[0].message
  24. - name: send-message
  25. type: webhook-notification
  26. inputs:
  27. - from: msg
  28. # 引用上一步中 outputs 中的值,并传入到 properties 的 slack.message.text 中作为输入
  29. parameterKey: slack.message.text
  30. properties:
  31. slack:
  32. # 你的 slack webhook 地址,请参考:https://api.slack.com/messaging/webhooks
  33. url: <your slack url>

将该应用部署到集群中,可以看到所有的资源都已被成功部署,且 Slack 中收到了对应的通知,通知内容为该 Deployment 的状态信息。

Last updated on 2022年11月1日 by Tianxin Dong