组件编排

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

    如: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. properties:
    20. repoType: helm
    21. url: https://presslabs.github.io/charts
    22. chart: mysql-operator
    23. version: "0.4.0"
    24. - name: mysql-cluster
    25. type: raw
    26. dependsOn:
    27. - mysql-controller
    28. - mysql-secret
    29. properties:
    30. apiVersion: mysql.presslabs.org/v1alpha1
    31. metadata:
    32. name: mysql-cluster
    33. spec:
    34. replicas: 1
    35. secretName: mysql-secret

    期望结果

    查看集群中的应用:

    一开始,由于 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 来指定要传输的数据。

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

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

    部署如下应用部署计划:

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

    期望结果

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