216 lines
5.8 KiB
Markdown
216 lines
5.8 KiB
Markdown
---
|
|
title: Component Orchestration
|
|
---
|
|
|
|
This section will introduce the dependencies in components and how to pass data between components.
|
|
|
|
> We use helm in the examples, make sure you enable the fluxcd addon:
|
|
> ```shell
|
|
> vela addon enable fluxcd
|
|
> ```
|
|
|
|
## Dependency
|
|
|
|
We can use `dependsOn` to specify the dependencies between components.
|
|
|
|
For example, component A depends on component B:
|
|
|
|
```yaml
|
|
...
|
|
components:
|
|
- name: A
|
|
type: helm
|
|
dependsOn:
|
|
- B
|
|
- name: B
|
|
type: helm
|
|
```
|
|
|
|
In this case, KubeVela will deploy B first, and then deploy A when the component B is running.
|
|
|
|
### How to use
|
|
|
|
If we want to apply a MySQL cluster, we need:
|
|
|
|
1. Apply a secret for MySQL password.
|
|
2. Apply MySQL controller.
|
|
3. Apply MySQL cluster.
|
|
|
|
Apply the following file:
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: Application
|
|
metadata:
|
|
name: mysql
|
|
namespace: default
|
|
spec:
|
|
components:
|
|
- name: mysql-secret
|
|
type: raw
|
|
properties:
|
|
apiVersion: v1
|
|
kind: Secret
|
|
metadata:
|
|
name: mysql-secret
|
|
type: kubernetes.io/opaque
|
|
stringData:
|
|
ROOT_PASSWORD: test
|
|
- name: mysql-controller
|
|
type: helm
|
|
properties:
|
|
repoType: helm
|
|
url: https://presslabs.github.io/charts
|
|
chart: mysql-operator
|
|
version: "0.4.0"
|
|
- name: mysql-cluster
|
|
type: raw
|
|
dependsOn:
|
|
- mysql-controller
|
|
- mysql-secret
|
|
properties:
|
|
apiVersion: mysql.presslabs.org/v1alpha1
|
|
kind: MysqlCluster
|
|
metadata:
|
|
name: mysql-cluster
|
|
spec:
|
|
replicas: 1
|
|
secretName: mysql-secret
|
|
```
|
|
|
|
### Expected Outcome
|
|
|
|
Check the application in the cluster:
|
|
|
|
```shell
|
|
$ vela ls
|
|
APP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIME
|
|
mysql 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
|
|
```
|
|
|
|
In the beginning, the status is running workflow since the mysql-controller is not ready.
|
|
|
|
```shell
|
|
$ vela ls
|
|
APP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIME
|
|
mysql 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
|
|
```
|
|
|
|
After a while, all components is running successfully. The `mysql-cluster` will be deployed after `mysql-controller` and `mysql-secret` is `healthy`.
|
|
|
|
> `dependsOn` use `healthy` to check status. If the component is `healthy`, then KubeVela will deploy the next component.
|
|
> If you want to customize the healthy status of the component, please refer to [Status Write Back](../../platform-engineers/traits/status)
|
|
|
|
|
|
## Inputs and Outputs
|
|
|
|
In KubeVela, we can use inputs and outputs in Components to pass data.
|
|
|
|
### Outputs
|
|
|
|
Outputs is made of `name` and `valueFrom`. Input will use `name` to reference output.
|
|
|
|
We can write `valueFrom` in the following ways:
|
|
1. Use value expression, eg. `valueFrom: output.metadata.name`. Note that `output` is a built-in field referring to the resource in the component that is rendered and deployed to the cluster.
|
|
2. Use CUE expressions, eg. use `+` to combine value and string: `valueFrom: output.metadata.name + "testString"` or you can import built-in packages in CUE like:
|
|
```
|
|
valueFrom: |
|
|
import "strings"
|
|
strings.Join(["1","2"], ",")
|
|
```
|
|
|
|
### Inputs
|
|
|
|
Inputs is made of `from` and `parameterKey`. Input uses `from` to reference output, `parameterKey` is a expression that assigns the value of the input to the corresponding field.
|
|
|
|
eg.
|
|
|
|
1. Specify inputs:
|
|
|
|
```yaml
|
|
...
|
|
- name: wordpress
|
|
type: helm
|
|
inputs:
|
|
- from: mysql-svc
|
|
parameterKey: properties.values.externalDatabase.host
|
|
```
|
|
|
|
2. The field parameterKey specifies the field path of the parameter key in component to be assigned after rendering:
|
|
|
|
Which means the input value will be passed into the below properties:
|
|
|
|
```yaml
|
|
...
|
|
- name: wordpress
|
|
type: helm
|
|
properties:
|
|
values:
|
|
externalDatabase:
|
|
host: <input value>
|
|
```
|
|
|
|
### How to use
|
|
|
|
In the following we will apply a WordPress server with the MySQL address passed from a MySQL component:
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: Application
|
|
metadata:
|
|
name: wordpress-with-mysql
|
|
namespace: default
|
|
spec:
|
|
components:
|
|
- name: mysql
|
|
type: helm
|
|
outputs:
|
|
# the output is the mysql service address
|
|
- name: mysql-svc
|
|
valueFrom: output.metadata.name + ".default.svc.cluster.local"
|
|
properties:
|
|
repoType: helm
|
|
url: https://charts.bitnami.com/bitnami
|
|
chart: mysql
|
|
version: "8.8.2"
|
|
values:
|
|
auth:
|
|
rootPassword: mypassword
|
|
- name: wordpress
|
|
type: helm
|
|
inputs:
|
|
# set the host to mysql service address
|
|
- from: mysql-svc
|
|
parameterKey: properties.values.externalDatabase.host
|
|
properties:
|
|
repoType: helm
|
|
url: https://charts.bitnami.com/bitnami
|
|
chart: wordpress
|
|
version: "12.0.3"
|
|
values:
|
|
mariadb:
|
|
enabled: false
|
|
externalDatabase:
|
|
user: root
|
|
password: mypassword
|
|
database: mysql
|
|
port: 3306
|
|
```
|
|
|
|
### Expected Outcome
|
|
|
|
Check the application in the cluster:
|
|
|
|
```shell
|
|
$ vela ls
|
|
|
|
APP COMPONENT TYPE TRAITS PHASE HEALTHY STATUS CREATED-TIME
|
|
wordpress-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
|
|
```
|
|
|
|
The WordPress with MySQL has been successfully applied. |