组件编排

本节将介绍如何在 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 由 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 由 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 正常连接。

在多集群场景中,我们仍然可以使用依赖关系和参数传递来编排组件。使用方法与单集群场景相同。这里直接给出一个例子。这里是一个参数传递的例子,依赖关系也是可用的。

组件编排 - 图1备注

示例中的环境有一个名为“cluster-worker”的托管集群。

部署如下应用部署计划,该 app 将部署一个 Deployment 和一个 Service,并把一些状态信息写入 ConfigMap。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: cm-with-message
  5. spec:
  6. components:
  7. - name: podinfo
  8. outputs:
  9. - name: message
  10. valueFrom: output.status.conditions[0].message
  11. - name: ip
  12. valueFrom: outputs.service.spec.clusterIP
  13. properties:
  14. image: stefanprodan/podinfo:4.0.3
  15. type: webservice
  16. traits:
  17. - type: expose
  18. properties:
  19. port: [ 80 ]
  20. - name: configmap
  21. properties:
  22. apiVersion: v1
  23. kind: ConfigMap
  24. metadata:
  25. name: deployment-msg
  26. type: raw
  27. inputs:
  28. - from: message
  29. parameterKey: data.msg
  30. - from: ip
  31. parameterKey: data.ip
  32. policies:
  33. - name: topo
  34. properties:
  35. clusters: [ "local","cluster-worker" ]
  36. type: topology
  37. - name: override
  38. properties:
  39. selector:
  40. - configmap
  41. - podinfo
  42. type: override
  1. $ vela status cm-with-message --tree
  2. CLUSTER NAMESPACE RESOURCE STATUS
  3. cluster-worker─── default ─┬─ ConfigMap/deployment-msg updated
  4. ├─ Service/podinfo updated
  5. └─ Deployment/podinfo updated
  6. local ─── default ─┬─ ConfigMap/deployment-msg updated
  7. ├─ Service/podinfo updated
  8. └─ Deployment/podinfo updated

检查集群中的 ConfigMap,这里仅检测了一个集群,在另一个集群中相同。

  1. $ kubectl get cm deployment-msg -oyaml |grep -C3 ^data
  2. apiVersion: v1
  3. data:
  4. ip: 10.43.223.14
  5. msg: Deployment has minimum availability.
  6. kind: ConfigMap

Last updated on 2023年2月9日 by dependabot[bot]