Compositions

Composition 是将多个受管资源创建为单一对象的模板。

Composition 将单个受管资源组composition一个更大的、可重复使用的解决方案。

Composition 模板将所有这些单独的资源连接在一起。

crossplane 有四个核心组件,用户通常会把它们混为一谈:

  • Composition - 本页。定义如何创建资源的模板。
  • Composition Resource Definition (XRD) - 一种自定义 API 规范。
  • 复合资源 (XR) - 通过使用 Composition Resource Definition 中定义的自定义 API 创建。XRs 使用 Composition 模板来创建新的托管资源。
  • Claim (XRC) - 类似于 Composition Resource,但具有名称空间范围。

创建 Composition

创作 Composition 包含以下内容:

Composition 还支持可选功能:

资源模板

资源资源字段的规格的资源字段定义了 Composition 资源创建的内容集。

Note
有关复合资源的更多信息,请参阅复合资源页面.

例如,Composition 可以定义一个模板来同时创建虚拟机和相关的存储桶。

资源 资源字段列出了带有名称。该名称用于识别 Composition 中的资源,与 Providers 被引用的外部名称无关。

模板一个受管资源

的内容的内容与创建独立的managed resource.

本例被引用upbound 的 Provider AWS来定义一个 S3 存储 存储桶和 EC2 计算 实例.

在定义了类型后,定义spec.forProvider字段,定义资源的设置。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - name: StorageBucket
 6      base:
 7        apiVersion: s3.aws.upbound.io/v1beta1
 8        kind: Bucket
 9        spec:
10          forProvider:
11            region: "us-east-2"
12    - name: VM
13      base:
14        apiVersion: ec2.aws.upbound.io/v1beta1
15        kind: Instance
16        spec:
17          forProvider:
18            ami: ami-0d9858aa3c6322f73
19            instanceType: t2.micro
20            region: "us-east-2"

复合资源使用此 Composition 模板时,复合资源会创建两个新的托管资源,其中包含所有提供的spec.forProvider设置创建两个新的托管资源。

规格 规范支持在托管资源中使用的任何设置,包括应用 “Annotations “和 “labels “或使用特定的 “providerConfigRef”。

Note

Composition 允许将 “metadata.name “应用到资源的但会忽略它。metadata.name “字段不会影响 crossplane 中的受管资源名称或 Provider 中的外部资源名称。

在资源上使用 crossplane.io/external-name 注解来影响外部资源名称。

一个 ProviderConfig 模板

Composition 可以像定义托管资源一样定义 ProviderConfig。 生成 ProviderConfig 可能有助于为每个部署提供唯一的凭据。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - name: my-aws-provider-config
 6      base:
 7        apiVersion: aws.upbound.io/v1beta1
 8        kind: ProviderConfig
 9        spec:
10          source: Secret
11          secretRef:
12            namespace: crossplane-system
13            name: aws-secret
14            key: creds

另一个 Composition 资源模板

Composition 可以被引用其他 Composite 资源来定义更复杂的模板。

常见的用例是一个 Composition 使用其他 Composition。 例如,创建一个 Composition 来创建一套标准网络资源,供其他 Composition 引用。

Note
两种 Composition 都必须有相应的 XRD。

此示例网络 Composition 定义了创建新 AWS 虚拟网络所需的资源集。 其中包括一个VPC,互联网网关子网.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - name: vpc-resource
 6      base:
 7        apiVersion: ec2.aws.upbound.io/v1beta1
 8        kind: VPC
 9        # Removed for Brevity
10    - name: gateway-resource
11      base:
12        apiVersion: ec2.aws.upbound.io/v1beta1
13        kind: InternetGateway
14        # Removed for Brevity
15    - name: subnet-resource
16      base:
17        apiVersion: ec2.aws.upbound.io/v1beta1
18        kind: Subnet
19        # Removed for Brevity
20  compositeTypeRef:
21    apiVersion: aws.platformref.upbound.io/v1alpha1
22    kind: XNetwork

复合类型 复合类型为该 Composition 提供了一个apiVersion类型以便在另一个 Composition 中引用。

Note
启用 Composition 资源](#enabling-composite-resources) 部分描述了compositeTypeRef字段。

第二个 Composition 定义了其他资源,在本例中是 AWS Elastic Kubernetes 集群,可以引用之前的XNetwork

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - name: nested-network-composition
 6      base:
 7        apiVersion: aws.platformref.upbound.io/v1alpha1
 8        kind: XNetwork
 9        # Removed for brevity
10    - name: eks-cluster-resource
11      base:
12        apiVersion: eks.aws.upbound.io/v1beta1
13        kind: Cluster
14        # Removed for brevity

当复合资源从该 Composition 中创建所有受管资源时,由XNetwork定义的资源与 EKS 集群.

Note

这个缩写示例来自 upbound AWS 参考平台

在参考平台的 package 目录 中查看完整的 Composition。

跨资源参考

在 Composition 内部,一些资源会使用其他资源的标识符或名称。 例如,创建一个新的 network 并将网络标识符应用于虚拟机。

Composition 中的资源可以通过匹配标签或_controller reference_(控制器引用)来交叉引用其他资源。

Note

Providers 允许按资源匹配标签和控制器引用。 请查看特定 Provider 资源的文档,了解支持哪些功能。

不同 Provider 不支持匹配标签和控制器。

匹配资源标签

要匹配资源标签,首先应用标签并使用匹配标签在第二个资源中使用

此示例创建了一个 AWS角色并应用标签。第二个资源是一个 角色策略附件需要附加到现有的 “角色”。

被引用资源的角色选择器的可确保该角色策略附件引用匹配的角色,即使不知道唯一的角色标识符。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - base:
 6        apiVersion: iam.aws.upbound.io/v1beta1
 7        kind: Role
 8        name: iamRole
 9        metadata:
10          labels:
11            role: controlplane
12    - base:
13        apiVersion: iam.aws.upbound.io/v1beta1
14        kind: RolePolicyAttachment
15        name: iamPolicy
16        spec:
17          forProvider:
18            roleSelector:
19              matchLabels:
20                role: controlplane
21  # Removed for brevity
匹配控制器参考

匹配控制器引用可确保匹配的资源在同一 Composition 资源中。

只匹配控制器参考信息可简化匹配过程,无需标签或更多信息。

例如,创建一个 AWS互联网网关需要一个VPC.

互联网网关 网关可以匹配一个标签,但该 Composition 创建的每个 VPC 都共享同一个标签。

被引用 matchControllerRef只能匹配在创建了互联网网关.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - base:
 6        apiVersion: ec2.aws.upbound.io/v1beta1
 7        kind: VPC
 8        name: my-vpc
 9        spec:
10          forProvider:
11          # Removed for brevity
12    - base:
13        apiVersion: ec2.aws.upbound.io/v1beta1
14        kind: InternetGateway
15        name: my-gateway
16        spec:
17          forProvider:
18            vpcIdSelector:
19              matchControllerRef: true
20# Removed for brevity

资源可以同时匹配标签和控制器引用,以匹配更大的 Composition 资源中的特定资源。

例如,此 Composition 会创建两个VPC资源,但网关必须只匹配一个。

应用 标签对第二个 VPC允许互联网网关匹配标签类型: 互联网并只匹配同一复合资源中的对象,并使用matchControllerRef.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - base:
 6        apiVersion: ec2.aws.upbound.io/v1beta1
 7        kind: VPC
 8        name: my-first-vpc
 9        metadata:
10          labels:
11            type: backend
12        spec:
13          forProvider:
14          # Removed for brevity
15    - base:
16        apiVersion: ec2.aws.upbound.io/v1beta1
17        kind: VPC
18        name: my-second-vpc
19        metadata:
20          labels:
21            type: internet
22        spec:
23          forProvider:
24          # Removed for brevity
25    - base:
26        apiVersion: ec2.aws.upbound.io/v1beta1
27        kind: InternetGateway
28        name: my-gateway
29        spec:
30          forProvider:
31            vpcIdSelector:
32              matchControllerRef: true
33              matchLabels:
34                type: internet
35# Removed for brevity

启用 Composition 资源

Composition 只是一个定义如何创建托管资源的模板。 Composition 限制哪些复合资源可以使用此模板。

一个 Composition 的 定义了哪种复合资源类型可以使用此 Composition。

Note
有关复合资源的更多信息,请参阅复合资源页面.

在 Composition 的规范中定义 Composition 资源apiVersion类型被引用。

1apiVersion: apiextensions.crossplane.io/v1
2kind: Composition
3metadata:
4  name: dynamodb-with-bucket
5spec:
6  compositeTypeRef:
7    apiVersion: custom-api.example.org/v1alpha1
8    kind: database
9  # Removed for brevity

更改资源字段

大多数 Composition 都需要自定义资源字段,包括应用唯一密码、修改资源部署位置或应用标签或 Annotations。

更改资源的主要方法是使用资源[修补和转换](https://crossplane.devops.gold/master/concepts/patch-and-transform/补丁和变换可以匹配特定的输入字段,对其进行修改并应用到被管理的资源中。

Important

关于创建补丁和变换及其选项的详细信息,请参阅补丁和变换页面.

本节介绍如何将修补程序和变换应用到 Composition 中。

使用补丁字段应用补丁。

例如,将位置claims 中提供的位置,并将其应用到区域值。

1apiVersion: example.org/v1alpha1
2kind: ExampleClaim
3metadata:
4  name: my-example-claim
5spec:
6  location: "eu-north-1"

Composition 补丁被引用为字段路径来匹配位置字段,而字段路径来定义要在 Composition 中更改的字段。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6    - name: s3Bucket
 7      base:
 8        apiVersion: s3.aws.upbound.io/v1beta1
 9        kind: Bucket
10        spec:
11          forProvider:
12            region: "us-east-2"
13      patches:
14      - type: FromCompositeFieldPath
15        fromFieldPath: "spec.location"
16        toFieldPath: "spec.forProvider.region"

补丁套件

有些 Composition 的资源需要应用相同的补丁,与其重复相同的 “patches “字段,资源可以引用单一的 “patchSet”。

定义一个 补丁集名称补丁操作。

然后 apply补丁集应用到每个资源类型: patchSet,引用 名称中的补丁集名称字段中的名称。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  patchSets:
 6    - name: reusable-patch
 7      patches:
 8      - type: FromCompositeFieldPath
 9        fromFieldPath: "location"
10        toFieldPath: "spec.forProvider.region"
11  resources:
12    - name: first-resource
13      base:
14      # Removed for Brevity
15      patches:
16        - type: PatchSet
17          patchSetName: reusable-patch
18    - name: second-resource
19      base:
20      # Removed for Brevity
21      patches:
22        - type: PatchSet
23          patchSetName: reusable-patch

补丁与 EnvironmentConfigs

Crossplane 使用 EnvironmentConfigs 来创建内存数据存储。 Composition 可以从该数据存储中读写,这是补丁程序的一部分。

Important
EnvironmentConfigs 是一项 alpha 功能,默认情况下不会启用。

EnvironmentConfigs 可以预定义 Composition 可以引用的数据,或者 Composite Resource 可以将数据写入其内存环境,供其他资源读取。

Note

阅读 EnvironmentConfigs 页面,了解有关使用 EnvironmentConfigs 的更多信息。

要使用 EnvironmentConfigs 引用补丁,首先要使用environment.environmentConfigs.

使用引用selector 来标识要使用的 EnvironmentConfigs。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  environment:
 6    environmentConfigs:
 7      - ref:
 8          name: example-environment
 9  resources:
10  # Removed for Brevity
Patch 一个 Composition 资源

要在 Composition 资源和内存环境之间打补丁,请使用补丁内的环境.

被引用到复合字段路径将数据从内存环境复制到 Composition 资源。 使用从复合字段路径将数据从 Composition 资源复制到内存环境。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  environment:
 6  # Removed for Brevity
 7      patches:
 8      - type: ToCompositeFieldPath
 9        fromFieldPath: tags
10        toFieldPath: metadata.labels[envTag]
11      - type: FromCompositeFieldPath
12        fromFieldPath: metadata.name
13        toFieldPath: newEnvironmentKey

单个资源可以使用写入其内存环境的任何数据。

补丁单个资源

要为单个资源打补丁,请在补丁内,使用环境字段路径将数据从资源复制到内存环境。 使用 从环境字段路径将数据从内存环境复制到资源。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  environment:
 6  # Removed for Brevity
 7  resources:
 8  # Removed for Brevity
 9    - name: vpc
10      base:
11        apiVersion: ec2.aws.upbound.io/v1beta1
12        kind: VPC
13        spec:
14          forProvider:
15            cidrBlock: 172.16.0.0/16
16      patches:
17        - type: ToEnvironmentFieldPath
18          fromFieldPath: status.atProvider.id
19          toFieldPath: vpcId
20        - type: FromEnvironmentFieldPath
21          fromFieldPath: tags
22          toFieldPath: spec.forProvider.tags

EnvironmentConfigs](https://crossplane.devops.gold/master/concepts/environment-configs/) 页面有更多关于 EnvironmentConfigs 选项和用法的信息。

被引用的composition函数

Composition 函数(简称函数)是模板化 crossplane 资源的自定义程序。 您可以使用 Go 或 Python 等通用编程语言编写函数模板化资源。 使用通用编程语言,函数可以使用更高级的逻辑模板化资源,如循环和条件。

Important
composition功能是一项测试版功能。 Crossplane 默认启用测试版功能。 在composition功能 页面解释了如何禁用 Composition 功能。

要使用composition功能,请设置composition模式Pipelines.

定义一个 Pipelines步骤。每个步骤都会调用一个函数。

每个 步骤被引用一个函数来引用名称的名称。

某些函数还允许您指定一个输入。函数定义了输入输入。

Important

被引用的composition 模式: Pipelines不能使用 resources 字段指定资源模板。

使用功能 “修补和转换 “创建资源模板。

本示例使用了函数 Pipelines 和 Transform。 函数 Pipelines 和 Transform 是一个实现 crossplane 资源模板的函数。 您可以使用函数 Pipelines 和 Transform 与其他函数一起在管道中指定资源模板。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  # Removed for Brevity
 6  mode: Pipeline
 7  pipeline:
 8  - step: patch-and-transform
 9    functionRef:
10      name: function-patch-and-transform
11    input:
12      apiVersion: pt.fn.crossplane.io/v1beta1
13      kind: Resources
14      resources:
15      - name: storage-bucket
16        base:
17          apiVersion: s3.aws.upbound.io/v1beta1
18          kind: Bucket
19          spec:
20            forProvider:
21              region: "us-east-2"

请阅读 Composition functions 页面,了解构建和使用 Composition 函数的详情。

存储连接详情

一些托管资源会生成独特的详细信息,如用户名、密码、IP 地址、端口或其他连接详细信息。

当 Composition 中的资源创建连接详情时,crossplane 会为每个生成连接详情的托管资源创建一个 Kubernetes secret 对象。

Note

本节讨论创建 Kubernetes secret。 crossplane 还支持使用外部secret存储,如 HashiCorp Vault

请阅读外部secret存储指南 以获取更多有关与外部secret存储一起使用 crossplane 的信息。

复合资源组合secret

crossplane 可以将 Composition 内部资源生成的所有 secret 合并为一个 Kubernetes secret,并可选择复制该 secret 对象用于 claims.

设置的值设置为的值设置为 crossplane 应存储组合secret对象的名称空间。

1apiVersion: apiextensions.crossplane.io/v1
2kind: Composition
3# Removed for Brevity
4spec:
5  writeConnectionSecretsToNamespace: my-namespace
6  resources:
7  # Removed for brevity

汇编资源secret

规格中,定义writeConnectionSecretToRefnamespace名称资源的 secret 对象。

如果writeConnectionSecretToRef未定义,则 crossplane 不会向 secret 写入任何密钥。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  writeConnectionSecretsToNamespace: other-namespace
 5  resources:
 6    - name: key
 7      base:
 8        apiVersion: iam.aws.upbound.io/v1beta1
 9        kind: AccessKey
10        spec:
11          forProvider:
12          # Removed for brevity
13          writeConnectionSecretToRef:
14            namespace: docs
15            name: key1

crossplane 会保存一个secret,其名称为名称的secret保存在namespaceProviders.

1kubectl get secrets -n docs
2NAME TYPE DATA AGE
3key1 connection.crossplane.io/v1alpha1 4 4m30s
Tip

crossplane 建议使用 Patch 为每个secret创建一个唯一的名称。

例如补丁将资源的唯一标识符添加为键名。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  # Removed for brevity
 5  resources:
 6    - name: key
 7      base:
 8        apiVersion: iam.aws.upbound.io/v1beta1
 9        kind: AccessKey
10        spec:
11        # Removed for brevity
12          writeConnectionSecretToRef:
13            namespace: docs
14            name: key1
15      patches:
16        - fromFieldPath: "metadata.uid"
17          toFieldPath: "spec.writeConnectionSecretToRef.name"
18          transforms:
19            - type: string
20              string:
21                fmt: "%s-secret"

定义secret密钥

Composition 必须用连接详情对象创建的特定秘钥。

| Secret Type | Description | | — | — | | | | | fromConnectionSecretKey| 创建与资源生成的 Secret 密钥相匹配的 Secret 密钥。 fromFieldPath| 创建与资源的字段路径相匹配的秘钥。 Values| 创建带有预定义值的密钥。
Note

Values类型必须被引用为字符串值。

Values不会添加到单个资源 secret 对象中。Values只出现在组合的 Composition 资源secret中。

 1kind: Composition
 2spec:
 3  writeConnectionSecretsToNamespace: other-namespace
 4  resources:
 5    - name: key
 6      base:
 7        # Removed for brevity
 8        spec:
 9          forProvider:
10          # Removed for brevity
11          writeConnectionSecretToRef:
12            namespace: docs
13            name: key1
14      connectionDetails:
15        - name: myUsername
16          fromConnectionSecretKey: username
17        - name: myFieldSecret
18          fromFieldPath: spec.forProvider.user
19        - name: myStaticSecret
20          value: "docs.crossplane.io"

连接连接详情可以引用资源中的 secret,并使用从连接秘钥或资源中另一个字段的字段路径或静态定义的值。Values.

crossplane 将秘钥设置为名称Values 值。

描述secret,查看secret对象内的密钥。

Tip

如果有多个资源生成具有相同密钥名称的secret,则 crossplane 只保存一个值。

被引用的自定义 名称创建唯一的 Secret 密钥。

Important
crossplane 只添加在连接详情中定义的任何连接secret。连接详情都不会添加到组合secret对象中。
 1kubectl describe secret
 2Name:         my-access-key-secret
 3Namespace:    default
 4Labels:       <none>
 5Annotations:  <none>
 6
 7Type:  connection.crossplane.io/v1alpha1
 8
 9Data
10====
11myUsername:      20 bytes
12myFieldSecret:   24 bytes
13myStaticSecret:  18 bytes
Note

CompositeResourceDefinition 还可以限制 Crossplane 从组合资源中存储哪些密钥。 默认情况下,XRD 会将组合资源 “connectionDetails “中列出的所有密钥写入组合密钥对象。

请阅读 CompositeResourceDefinition 文档 获取更多关于限制秘钥的信息。

有关连接secret的更多信息,请阅读连接secret知识库文章.

Warning
您不能更改连接详情您必须删除并重新创建 Composition 才能更改连接细节.

将连接详细信息存储到外部secret存储中

crossplane 外部secret存储 将secret和连接详情写入外部secret存储,如 HashiCorp Vault。

Important

外部secret存储是 alpha 功能。

crossplane 默认禁用外部secret存储。

被引用publishConnectionDetailsWithStoreConfigRef代替 writeConnectionSecretsToNamespace 来定义存储配置以保存连接详细信息。

例如,被引用的存储配置名称为"Vault “的存储配置,使用publishConnectionDetailsWithStoreConfigRef.name名称相匹配的在本例中为 “vault”。

 1apiVersion: gcp.crossplane.io/v1alpha1
 2kind: StoreConfig
 3metadata:
 4  name: vault
 5# Removed for brevity.
 6---
 7apiVersion: apiextensions.crossplane.io/v1
 8kind: Composition
 9# Removed for Brevity
10spec:
11  publishConnectionDetailsWithStoreConfigRef: 
12    name: vault
13  resources:
14  # Removed for brevity

更多详情请阅读 External Secret Stores 集成指南。

资源准备情况检查

默认情况下,当所有已创建资源的状态均为 “类型: 就绪 “和 “状态: 真 “时,Crossplane 会将 Composition 资源或 claims 视为 “已就绪”。

有些资源(例如 ProviderConfig)没有 Kubernetes 状态,永远不会被视为 “就绪”。

自定义就绪检查允许 Composition 定义资源 “就绪 “需要满足的自定义条件。

Tip
如果资源必须满足多个条件才能成为 “就绪”,则使用多重就绪检查。

使用准备检查字段定义自定义就绪检查。

检查具有类型类型定义如何匹配资源,而 字段路径的字段路径。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: <match type>
12          fieldPath: <resource field>

Composition 通过以下方式支持资源字段的匹配:

匹配字符串

匹配字符串认为,当composition资源的字段值与指定字符串匹配时,该资源已准备就绪。

Note

crossplane 只支持精确的字符串匹配,不支持子字符串和正则表达式的就绪检查。

例如,匹配字符串在线字符串匹配资源的status.atProvider.state字段中的字符串。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: MatchString
12          fieldPath: status.atProvider.state
13          matchString: "Online"

匹配一个整数

匹配整数当composition资源的字段值与指定整数相匹配时,该资源将被视为已准备就绪。

Note

crossplane 不支持匹配 0

例如,匹配数字4资源的status.atProvider.state字段中的数字 4。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: MatchInteger
12          fieldPath: status.atProvider.state
13          matchInteger: 4

匹配一个字段是否存在

非空认为当一个字段存在值时,composition的资源已就绪。

Note

Crossplane 将数值为 “0 “或空字符串视为空。

例如,要检查资源的status.atProvider.state字段不是空的。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: NonEmpty
12          fieldPath: status.atProvider.state
Tip
检查 非空不需要设置任何其他字段。

始终考虑准备好资源

认为composition的资源在创建后立即就绪。 在声明资源就绪之前,crossplane 不会等待任何其他条件。

例如,请考虑我的资源一创建就准备就绪。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: None

匹配条件

条件认为composition的资源在找到预期的条件类型时已准备就绪,其 status.conditions 中有预期的状态。

例如,请考虑我的资源,如果有一个类型为类型的状态为成功.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: MatchCondition
12          matchCondition:
13            type: MyType
14            status: Success

匹配布尔值

有两种类型的检查用于匹配布尔字段:

  • `MatchTrue
  • 匹配错误

MatchTrue “认为,当composition的资源中某个字段的值为 “true “时,该资源已准备就绪。

MatchFalse 认为,当composition的资源中某个字段的值为 false时,该资源已准备就绪。

例如,请考虑我的资源如果status.atProvider.config.status.ready.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: MatchTrue
12          fieldPath: status.atProvider.manifest.status.ready
Tip
检查 匹配为真不需要设置任何其他字段。

MatchFalse 会匹配表达值为 false 的准备就绪的字段。

例如,请考虑我的资源如果status.atProvider.config.manifest.status.pending为 false.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for Brevity
 4spec:
 5  resources:
 6  # Removed for Brevity
 7    - name: my-resource
 8      base:
 9        # Removed for brevity
10      readinessChecks:
11        - type: MatchFalse
12          fieldPath: status.atProvider.manifest.status.pending
Tip
检查 MatchFalse不需要设置任何其他字段。

验证一个composition

使用 kubectl get composition 查看所有可用的 Composition。

1kubectl get composition
2NAME XR-KIND XR-APIVERSION AGE
3xapps.aws.platformref.upbound.io XApp aws.platformref.upbound.io/v1alpha1 123m
4xclusters.aws.platformref.upbound.io XCluster aws.platformref.upbound.io/v1alpha1 123m
5xeks.aws.platformref.upbound.io XEKS aws.platformref.upbound.io/v1alpha1 123m
6xnetworks.aws.platformref.upbound.io XNetwork aws.platformref.upbound.io/v1alpha1 123m
7xservices.aws.platformref.upbound.io XServices aws.platformref.upbound.io/v1alpha1 123m
8xsqlinstances.aws.platformref.upbound.io XSQLInstance aws.platformref.upbound.io/v1alpha1 123m

XR-KIND 列出了允许使用 Composition 模板的复合资源 "类型"。 XR-APIVERSION 列出了允许使用 Composition 模板的复合资源 API 版本。

Note

kubectl get composition的 Output 与kubectl get composite` 不同。

kubectl get composition 列出所有可用的 Composition。

kubectl get composite 列出所有已创建的 Composite 资源及其相关 Composition。

Composition validation

在创建 Composition 时,crossplane 会自动验证其完整性,例如检查 Composition 是否成型良好:

如果被引用 mode: Resources:

  • 资源 “字段不是空的。
  • 所有资源要么被引用,要么没有。Composition 不能同时使用已命名和未命名的资源。
  • 资源名称不能重复。
  • 补丁集必须有名称。
  • 需要提供 fromFieldPath 值的补丁必须提供。
  • 需要提供 toFieldPath 值的补丁。
  • 需要 combine 字段的补丁必须提供。
  • 使用 matchString 的就绪检查不是空的。
  • 使用 matchInteger 的就绪检查不是 0
  • 需要 fieldPath 值的就绪检查提供该值。

如果被引用 mode: Pipeline (Composition Functions):

  • Pipelines” 字段不是空的。
  • 没有重复的步骤名称。

構成模式感知驗證

crossplane 还会对 Composition 执行模式感知验证。 模式验证会根据资源模式检查 “补丁”、“就绪检查 “和 “连接细节 “是否有效。 例如,根据源和目标资源模式检查补丁的源和目标字段是否有效。

Note

Composition 模式感知验证是一项测试功能。 Crossplane 默认启用测试功能。

在 crossplane pod 上设置--enable-composition-webhook-schema-validation=false标志,禁用模式感知验证。

Crossplane Pods](https://crossplane.devops.gold/master/concepts/pods/#edit-the-deployment) 页面有更多关于启用 crossplane flag 的信息。

模式感知验证模式

如果出现完整性错误,crossplane 始终会拒绝 Composition。

设置模式感知验证模式,以配置 crossplane 如何处理资源模式缺失和模式感知验证错误。

Note
如果缺少资源模式,crossplane 会跳过模式识别验证,但仍会对完整性错误返回错误,对缺少的模式返回警告或错误。

可使用以下模式

| 模式 | 缺少模式 | 模式感知错误 | 完整性错误 | | ——– | ————– |——————–|—————–| | warn | Warning | Warning | Error | | loose | Warning | Error | Error | | strict | Error | Error | Error

使用来更改 Composition 的验证模式。Annotations 来更改组合体的验证模式。

如果未指定,默认模式为 “警告”。

例如,要启用 “宽松 “模式检查,请将 Annotations 值设置为.

1apiVersion: apiextensions.crossplane.io/v1
2kind: Composition
3metadata:
4  annotations:
5    crossplane.io/composition-schema-aware-validation-mode: loose
6  # Removed for brevity
7spec:
8  # Removed for brevity
Important

验证模式也适用于由配置包定义的 Composition。

根据在 Composition 中配置的模式,模式识别验证问题可能会导致警告或拒绝接受 Composition。

查看 crossplane 日志,查看验证警告。

如果出现验证错误,crossplane 会将配置设为不健康状态。 使用 kubectl describe configuration 查看配置详细信息,以查看具体错误。