Version: v1.2
应用组件间的依赖和参数传递
本节将介绍如何在 KubeVela 中进行组件间的依赖关系和参数传递。
由于本节示例中使用了 helm 功能,所以需要开启 fluxcd 插件:
vela addon enable fluxcd
依赖关系
在 KubeVela 中,可以在组件中通过 dependsOn 来指定组件间的依赖关系。
如:A 组件依赖 B 组件,需要在 B 组件完成部署后再进行部署:
...components:- name: Atype: helmdependsOn:- B- name: Btype: helm
在这种情况下,KubeVela 会先部署 B,当 B 组件的状态可用时,再部署 A 组件。
如何使用
假设我们需要在本地启动一个 MySQL 集群,那么我们需要:
- 部署一个 Secret 作为 MySQL 的密码。
- 部署 MySQL controller。
- 部署 MySQL 集群。
部署如下文件:
apiVersion: core.oam.dev/v1beta1kind: Applicationmetadata:name: mysqlnamespace: defaultspec:components:- name: mysql-secrettype: rawproperties:apiVersion: v1kind: Secretmetadata:name: mysql-secrettype: kubernetes.io/opaquestringData:ROOT_PASSWORD: test- name: mysql-controllertype: helmproperties:repoType: helmurl: https://presslabs.github.io/chartschart: mysql-operatorversion: "0.4.0"- name: mysql-clustertype: rawdependsOn:- mysql-controller- mysql-secretproperties:apiVersion: mysql.presslabs.org/v1alpha1kind: MysqlClustermetadata:name: mysql-clusterspec:replicas: 1secretName: mysql-secret
期望结果
查看集群中的应用:
$ vela lsAPP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIMEmysql mysql-secret raw runningWorkflow 2021-10-14 12:09:55 +0800 CST├─ mysql-controller helm runningWorkflow 2021-10-14 12:09:55 +0800 CST└─ mysql-cluster raw runningWorkflow 2021-10-14 12:09:55 +0800 CST
一开始,由于 mysql-controller 尚未部署成功,三个组件状态均为 runningWorkflow。
$ vela lsAPP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIMEmysql mysql-secret raw running healthy 2021-10-14 12:09:55 +0800 CST├─ mysql-controller helm running healthy 2021-10-14 12:09:55 +0800 CST└─ mysql-cluster raw running 2021-10-14 12:09:55 +0800 CST
可以看到,所有组件都已成功运行.其中 mysql-cluster 组件的部署依赖于 mysql-controller 和 mysql-secret 部署状态达到 healthy。
dependsOn会根据组件是否healthy来确定状态,若已healthy,则表示该组件已成功运行,可以部署下一个组件。 如果你向自定义组件的健康状态,请查看 状态回写
参数传递
除了显示指定依赖关系以外,还可以在组件中通过 outputs 和 inputs 来指定要传输的数据。
Outputs
outputs 由 name 和 valueFrom 组成。name 声明了这个 output 的名称,在 input 中将通过 name 引用 output。
valueFrom 有以下几种写法:
- 直接通过字符串表示值,如:
valueFrom: testString。 - 通过表达式来指定值,如:
valueFrom: output.metadata.name。注意,output为固定内置字段,指向组件中被部署在集群里的资源。 - 通过
+来任意连接以上两种写法,最终值是计算后的字符串拼接结果,如:valueFrom: output.metadata.name + "testString"。
Inputs
inputs 由 from 和 parameterKey 组成。from 声明了这个 input 从哪个 output 中取值,parameterKey 为一个表达式,将会把 input 取得的值赋给对应的字段。
如:
- 指定 inputs:
...- name: wordpresstype: helminputs:- from: mysql-svcparameterKey: properties.values.externalDatabase.host
- 经过渲染后,该组件的
properties.values.externalDatabase.host字段中会被赋上值,效果如下所示:
...- name: wordpresstype: helmproperties:values:externalDatabase:host: <input value>
如何使用
假设我们希望在本地启动一个 WordPress,而这个 Wordpress 的数据存放在一个 MySQL 数据库中,我们需要将这个 MySQL 的地址传递给 WordPress。
部署如下应用部署计划:
apiVersion: core.oam.dev/v1beta1kind: Applicationmetadata:name: wordpress-with-mysqlnamespace: defaultspec:components:- name: mysqltype: helmoutputs:# 将 service 地址作为 output- name: mysql-svcvalueFrom: output.metadata.name + ".default.svc.cluster.local"properties:repoType: helmurl: https://charts.bitnami.com/bitnamichart: mysqlversion: "8.8.2"values:auth:rootPassword: mypassword- name: wordpresstype: helminputs:# 将 mysql 的 service 地址赋值到 host 中- from: mysql-svcparameterKey: properties.values.externalDatabase.hostproperties:repoType: helmurl: https://charts.bitnami.com/bitnamichart: wordpressversion: "12.0.3"values:mariadb:enabled: falseexternalDatabase:user: rootpassword: mypassworddatabase: mysqlport: 3306
期望结果
查看集群中的应用:
$ vela lsAPP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIMEwordpress-with-mysql mysql helm running healthy 2021-10-12 18:04:10 +0800 CST└─ wordpress helm running healthy 2021-10-12 18:04:10 +0800 CST
WordPress 已被成功部署,且与 MySQL 正常连接。