组件编排

本节将介绍如何在 KubeVela 中进行组件间的依赖关系和参数传递。

由于本节示例中使用了 helm 功能,所以需要开启 fluxcd 插件:

  1. vela addon enable fluxcd

依赖关系

在 KubeVela 中,可以在组件中通过 dependsOn 来指定组件间的依赖关系。

如:A 组件依赖 B 组件,需要在 B 组件完成部署后再进行部署:

  1. ...
  2. components:
  3. - name: A
  4. type: helm
  5. dependsOn:
  6. - B
  7. - name: B
  8. type: helm

在这种情况下,KubeVela 会先部署 B,当 B 组件的状态可用时,再部署 A 组件。

如何使用

假设我们需要在本地启动一个 MySQL 集群,那么我们需要:

  1. 部署一个 Secret 作为 MySQL 的密码。
  2. 部署 MySQL controller。
  3. 部署 MySQL 集群。

部署如下文件:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: mysql
  5. namespace: default
  6. spec:
  7. components:
  8. - name: mysql-secret
  9. type: raw
  10. properties:
  11. apiVersion: v1
  12. kind: Secret
  13. metadata:
  14. name: mysql-secret
  15. type: kubernetes.io/opaque
  16. stringData:
  17. ROOT_PASSWORD: test
  18. - name: mysql-controller
  19. type: helm
  20. properties:
  21. repoType: helm
  22. url: https://presslabs.github.io/charts
  23. chart: mysql-operator
  24. version: "0.4.0"
  25. - name: mysql-cluster
  26. type: raw
  27. dependsOn:
  28. - mysql-controller
  29. - mysql-secret
  30. properties:
  31. apiVersion: mysql.presslabs.org/v1alpha1
  32. kind: MysqlCluster
  33. metadata:
  34. name: mysql-cluster
  35. spec:
  36. replicas: 1
  37. secretName: mysql-secret

期望结果

查看集群中的应用:

  1. $ vela ls
  2. APP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIME
  3. mysql mysql-secret raw runningWorkflow 2021-10-14 12:09:55 +0800 CST
  4. ├─ mysql-controller helm runningWorkflow 2021-10-14 12:09:55 +0800 CST
  5. └─ mysql-cluster raw runningWorkflow 2021-10-14 12:09:55 +0800 CST

一开始,由于 mysql-controller 尚未部署成功,三个组件状态均为 runningWorkflow。

  1. $ vela ls
  2. APP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIME
  3. mysql mysql-secret raw running healthy 2021-10-14 12:09:55 +0800 CST
  4. ├─ mysql-controller helm running healthy 2021-10-14 12:09:55 +0800 CST
  5. └─ mysql-cluster raw running 2021-10-14 12:09:55 +0800 CST

可以看到,所有组件都已成功运行.其中 mysql-cluster 组件的部署依赖于 mysql-controllermysql-secret 部署状态达到 healthy

dependsOn 会根据组件是否 healthy 来确定状态,若已 healthy,则表示该组件已成功运行,可以部署下一个组件。 如果你向自定义组件的健康状态,请查看 状态回写

参数传递

除了显示指定依赖关系以外,还可以在组件中通过 outputs 和 inputs 来指定要传输的数据。

Outputs

outputs 由 namevalueFrom 组成。name 声明了这个 output 的名称,在 input 中将通过 from 引用 output。

valueFrom 有以下几种写法:

  1. 通过指定 value 来指定值,如:valueFrom: output.metadata.name。注意,output 为固定内置字段,指向组件中被部署在集群里的资源。
  2. 使用 CUE 表达式。如,用 + 来连接值和字符串: valueFrom: output.metadata.name + "testString"。你也可以引入 CUE 的内置包:
  1. valueFrom: |
  2. import "strings"
  3. strings.Join(["1","2"], ",")

Inputs

inputs 由 fromparameterKey 组成。from 声明了这个 input 从哪个 output 中取值,parameterKey 为一个表达式,将会把 input 取得的值赋给对应的字段。

如:

  1. 指定 inputs:
  1. ...
  2. - name: wordpress
  3. type: helm
  4. inputs:
  5. - from: mysql-svc
  6. parameterKey: properties.values.externalDatabase.host
  1. 经过渲染后,该组件的 properties.values.externalDatabase.host 字段中会被赋上值,效果如下所示:
  1. ...
  2. - name: wordpress
  3. type: helm
  4. properties:
  5. values:
  6. externalDatabase:
  7. host: <input value>

如何使用

假设我们希望在本地启动一个 WordPress,而这个 Wordpress 的数据存放在一个 MySQL 数据库中,我们需要将这个 MySQL 的地址传递给 WordPress。

部署如下应用部署计划:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: wordpress-with-mysql
  5. namespace: default
  6. spec:
  7. components:
  8. - name: mysql
  9. type: helm
  10. outputs:
  11. # 将 service 地址作为 output
  12. - name: mysql-svc
  13. valueFrom: output.metadata.name + ".default.svc.cluster.local"
  14. properties:
  15. repoType: helm
  16. url: https://charts.bitnami.com/bitnami
  17. chart: mysql
  18. version: "8.8.2"
  19. values:
  20. auth:
  21. rootPassword: mypassword
  22. - name: wordpress
  23. type: helm
  24. inputs:
  25. # 将 mysql 的 service 地址赋值到 host 中
  26. - from: mysql-svc
  27. parameterKey: properties.values.externalDatabase.host
  28. properties:
  29. repoType: helm
  30. url: https://charts.bitnami.com/bitnami
  31. chart: wordpress
  32. version: "12.0.3"
  33. values:
  34. mariadb:
  35. enabled: false
  36. externalDatabase:
  37. user: root
  38. password: mypassword
  39. database: mysql
  40. port: 3306

期望结果

查看集群中的应用:

  1. $ vela ls
  2. APP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIME
  3. wordpress-with-mysql mysql helm running healthy 2021-10-12 18:04:10 +0800 CST
  4. └─ wordpress helm running healthy 2021-10-12 18:04:10 +0800 CST

WordPress 已被成功部署,且与 MySQL 正常连接。