Crossplane

    云服务是应用程序的一部分。

    可以考虑以下做法:

    • 使用 ComponentDefinition 的场景:
      • 你想要允许最终用户明确声明云服务的实例并使用它,并在删除应用程序时释放该实例。
    • 使用 TraitDefinition 的场景:
      • 你不想让最终用户拥有声明或发布云服务的任何控制权,而只想给他们消费云服务,甚至可以由其他系统管理的云服务的方式。在这种情况下,会广泛使用 Service Binding 特性。

    在本文档中,我们将以阿里云的 RDS(关系数据库服务)和阿里云的 OSS(对象存储服务)为例。在单个应用程序中,它们是 Traits,在多个应用程序中,它们是 Components。此机制与其他云提供商相同。

    如果你想配置任何其他 Crossplane providers,请参阅 Crossplane Select a Getting Started Configuration

    provider.yaml 如下。

    1. apiVersion: v1
    2. kind: Namespace
    3. metadata:
    4. name: crossplane-system
    5. ---
    6. apiVersion: alibaba.crossplane.io/v1alpha1
    7. kind: ProviderConfig
    8. metadata:
    9. name: default
    10. spec:
    11. credentials:
    12. source: Secret
    13. secretRef:
    14. namespace: crossplane-system
    15. name: alibaba-account-creds
    16. key: credentials
    17. region: cn-beijing

    注意:我们目前仅使用阿里提供的 Crossplane。但是在不久的将来,我们将使用 作为 Kubernetes 的云资源供应商。

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: ComponentDefinition
    3. metadata:
    4. name: alibaba-oss
    5. namespace: vela-system
    6. annotations:
    7. definition.oam.dev/description: "Alibaba Cloud RDS Resource"
    8. spec:
    9. workload:
    10. apiVersion: oss.alibaba.crossplane.io/v1alpha1
    11. kind: Bucket
    12. schematic:
    13. template: |
    14. output: {
    15. apiVersion: "oss.alibaba.crossplane.io/v1alpha1"
    16. kind: "Bucket"
    17. spec: {
    18. name: parameter.name
    19. acl: parameter.acl
    20. storageClass: parameter.storageClass
    21. dataRedundancyType: parameter.dataRedundancyType
    22. writeConnectionSecretToRef: {
    23. namespace: context.namespace
    24. name: parameter.secretName
    25. }
    26. providerConfigRef: {
    27. name: "default"
    28. }
    29. deletionPolicy: "Delete"
    30. }
    31. }
    32. parameter: {
    33. // +usage=OSS bucket name
    34. name: string
    35. // +usage=The access control list of the OSS bucket
    36. acl: *"private" | string
    37. // +usage=The storage type of OSS bucket
    38. storageClass: *"Standard" | string
    39. // +usage=The data Redundancy type of OSS bucket
    40. dataRedundancyType: *"LRS" | string
    41. // +usage=Secret name which RDS connection will write to
    42. secretName: string
    43. }

    关键词是 annotation // + insertSecretTo = dbConn,KubeVela 将知道该参数是 K8s 的 secret,它将解析该 secret 并将数据绑定到 CUE 接口 dbConn 中。

    output 可以引用 dbConn 获取数据。dbConn 的名称没有限制。 关键词是 +insertSecretTo,它定义了数据绑定机制。以上只是一个例子。

    至于应用程序中的数据绑定,KubeVela 建议定义一个 trait 以完成工作。我们已经准备了一个方便的 trait。此 trait 非常适合将资源的信息绑定到 pod spec 的环境变量中.

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: TraitDefinition
    3. metadata:
    4. name: service-binding
    5. spec:
    6. appliesToWorkloads:
    7. - webservice
    8. - worker
    9. schematic:
    10. cue:
    11. template: |
    12. patch: {
    13. spec: template: spec: {
    14. // +patchKey=name
    15. containers: [{
    16. name: context.name
    17. // +patchKey=name
    18. env: [
    19. for envName, v in parameter.envMappings {
    20. name: envName
    21. valueFrom: {
    22. secretKeyRef: {
    23. name: v.secret
    24. if v["key"] != _|_ {
    25. key: v.key
    26. }
    27. if v["key"] == _|_ {
    28. key: envName
    29. }
    30. }
    31. }
    32. },
    33. ]
    34. }]
    35. }
    36. }
    37. parameter: {
    38. // +usage=The mapping of environment variables to secret
    39. envMappings: [string]: [string]: string
    40. }

    你可以通过查看 the end user usage workflow 了解其使用方式。