管理资源

受管资源(MR)代表 Provider 中的外部服务。 当用户创建一个新的受管资源时,Provider 会在 Provider 环境中创建一个外部资源来做出反应。 Crossplane 管理的每个外部服务都会映射到一个受管资源。

Note
crossplane 将 Kubernetes 内部的对象称为_managed resource_,将 Provider 内部的外部对象称为_external resource_。

管理资源的例子包括

Tip
您可以创建单独的托管资源,但 crossplane 建议您使用 Composition 和 claims 来创建托管资源。

受管资源字段

Provider 定义受管资源的组别、种类和版本。 Provider 还定义受管资源的可用设置。

组别、种类和版本

每个托管资源都是一个独特的 API 组端点,有自己的组、种类和版本。

例如,Upbound AWS Provider定义了 实例类中的 ec2.aws.upbound.io

1apiVersion: ec2.aws.upbound.io/v1beta1
2kind: Instance

删除政策

托管资源的 “删除策略 “会告诉 Provider 删除托管资源后要做什么。 如果 “删除策略 “是 “删除”,Provider 就会同时删除外部资源。 如果 “删除策略 “是 “orphan”,Provider 就会删除托管资源,但不会删除外部资源。

选项

  • 删除策略: Delete` - 默认 - 删除托管资源时删除外部资源。
  • deletionPolicy: Orphan - 删除托管资源时保留外部资源。

与管理政策的互动

在下列情况下,管理策略 优先于 “删除策略”:

  • 相关管理策略 alpha 功能已启用。
  • 该资源配置了默认值以外的管理策略。

详见下表。

| managementPolicies | deletionPolicy | result | |—————————–|——————|———| | “” (默认) | Delete (默认) | Delete | “” (默认) | Orphan | Orphan | | 包含 “删除” | Delete (默认) | Delete | 包含 “删除” | Orphan | Delete | 不包含 “删除” | Delete (默认) | Orphan | 不包含 “删除” | Orphan | Orphan | 不包含 “删除” | Orphan | Orphan |

为提供者

规格 会映射到外部资源的参数。

例如,在创建 AWS EC2 实例时,Provider 支持定义 AWS 区域和虚拟机大小,称为实例类型.

Note

Provider 定义了设置及其有效值。 Provider 还在 forProvider 定义中定义了必填值和可选值。

详情请参阅特定 Provider 的文档。

1apiVersion: ec2.aws.upbound.io/v1beta1
2kind: Instance
3# Removed for brevity
4spec:
5  forProvider:
6    region: us-west-1
7    instanceType: t2.micro
Important
Crossplane 将托管资源的 “for Provider “字段视为外部资源的 “真实来源”。 Crossplane 会覆盖在 Crossplane 之外对外部资源所做的任何更改。 如果用户在 Provider 的网络控制台内进行更改,Crossplane 会将更改还原为 “for Provider “设置中的配置。

引用其他资源

受管资源中的某些字段可能依赖于其他受管资源中的 Values。 例如,虚拟机可能需要使用虚拟网络的名称。

托管资源可以通过外部名称、名称引用或选择器引用其他托管资源。

按外部名称匹配

通过名称匹配资源时,crossplane 会在 Provider 中查找外部资源的名称。

例如,名为 “my-test-vpc “的 AWS VPC 对象的外部名称为 “vpc-01353cfe93950a8ff”。

1kubectl get vpc
2NAME READY SYNCED EXTERNAL-NAME AGE
3my-test-vpc True True vpc-01353cfe93950a8ff 49m

要按名称匹配 VPC,请引用外部名称。 例如,创建附加到此 VPC 的子网托管资源。

1apiVersion: ec2.aws.upbound.io/v1beta1
2kind: Subnet
3spec:
4  forProvider:
5    # Removed for brevity
6    vpcId: vpc-01353cfe93950a8ff
根据名称参考进行匹配

要根据管理资源的名称而不是 Provider 内部的外部资源名称来匹配资源,请使用 nameRef

例如,名为 “my-test-vpc “的 AWS VPC 对象的外部名称为 “vpc-01353cfe93950a8ff”。

1kubectl get vpc
2NAME READY SYNCED EXTERNAL-NAME AGE
3my-test-vpc True True vpc-01353cfe93950a8ff 49m

要通过名称引用匹配 VPC,请使用托管资源名称。 例如,创建附加到此 VPC 的子网托管资源。

1apiVersion: ec2.aws.upbound.io/v1beta1
2kind: Subnet
3spec:
4  forProvider:
5    # Removed for brevity
6    vpcIdRef: 
7      name: my-test-vpc
按选择器匹配

通过选择器匹配是最灵活的匹配方法。

Note
Composition](https://crossplane.devops.gold/master/concepts/compositions/) 部分涵盖了 matchControllerRef 选择器。

使用 “matchLabels “匹配被引用到资源的标签。 例如,此子网资源只匹配标签为 “my-label: label-value “的 VPC 资源。

1apiVersion: ec2.aws.upbound.io/v1beta1
2kind: Subnet
3spec:
4  forProvider:
5    # Removed for brevity
6    vpcIdSelector: 
7      matchLabels:
8        my-label: label-value

不可变字段

有些 Provider 不支持在创建后更改某些托管资源的字段。 例如,您不能更改 Amazon AWS RDSInstanceregion 字段。 这些字段是_不可更改字段_。 Amazon 要求您删除并重新创建资源。

Crossplane 允许你编辑托管资源的不可变字段,但不会应用更改。 Crossplane 绝不会根据 “forProvider “更改删除资源。

Note

Crossplane 的行为与 Terraform 等其他工具不同。 Terraform 会删除并重新创建资源,以更改不可变字段。 Crossplane 只有在相应的托管资源对象从 Kubernetes 中删除且 “deletionPolicy “为 “delete “时,才会删除外部资源。

初始化延迟

Crossplane 默认将托管资源视为真实值来源;它希望拥有 spec.forProvider 下的所有值,包括可选值。 如果未提供,Crossplane 将使用提供商分配的值填充空字段。 例如,考虑 regionavailabilityZone 等字段。 您可以只指定区域,让云提供商选择可用性区域。 在这种情况下,如果提供商分配了可用性区域,Crossplane 将使用该值填充 spec.forProviders.availabilityZone 字段。

Note

使用 managementPolicies,可以通过在 “managementPolicies “列表中不包含 “LateInitialize “策略来关闭此行为。

initProvider

Important
托管资源 initProvider 选项是一个测试版功能,与 managementPolicies.

启动initProvider定义了 Crossplane 仅在创建新托管资源时应用的设置。 Crossplane 会忽略在中定义的设置。字段中定义的设置。

Note

Crossplane始终会强制执行 “forProvider “中的设置。 Crossplane会恢复对外部资源中 “forProvider “字段的任何更改。

Crossplane不会强制执行 “initProvider “中的设置。 Crossplane会忽略外部资源中 “initProvider “字段的任何更改。

在设置 Provider 可能自动更改的初始 Values(如自动缩放组)时,使用 initProvider 非常有用。

例如,创建一个节点组的初始的节点组。的 NodeGroup 不会改变desiredSize设置。

Tip
crossplane 建议配置管理策略以避免与 initProvider 设置冲突。
 1apiVersion: eks.aws.upbound.io/v1beta1
 2kind: NodeGroup
 3metadata:
 4  name: sample-eks-ng
 5spec:
 6  managementPolicies: ["Observe", "Create", "Update", "Delete"]
 7  initProvider:
 8    scalingConfig:
 9      - desiredSize: 1
10  forProvider:
11    region: us-west-1
12    scalingConfig:
13      - maxSize: 4
14        minSize: 1

管理政策

Note

受管资源 “managementPolicies “选项是测试版功能。 Crossplane 默认启用测试版功能。

请参阅 “提供方 “的文件,查看 “提供方 “是否支持管理政策。

crossplane管理策略决定 Crossplane 可对受管资源及其相应的外部资源采取哪些行动。 应用一个或多个管理策略来确定 Crossplane 对资源的权限。

例如,要赋予 crossplane 创建和删除外部资源的权限,但不做任何更改,可将策略设置为["创建"、"删除"、"观察"] ..

1apiVersion: ec2.aws.upbound.io/v1beta1
2kind: Subnet
3spec:
4  managementPolicies: ["Create", "Delete", "Observe"]
5  forProvider:
6    # Removed for brevity

默认策略授予 crossplane 对资源的完全控制权。 使用空数组定义 managementPolicies 字段 [pauses](#paused)资源。

Important
请参阅 “提供方 “的文件,查看 “提供方 “是否支持管理政策。

Crossplane 支持以下策略:

| 策略 | 描述 | | — | — | | * | 默认策略。 Crossplane 可以完全控制资源。 | | Create | 如果外部资源不存在,Crossplane 会根据托管资源的设置创建它。 | | Delete | Crossplane 可以在删除托管资源时删除外部资源。 | | LateInitialize | Crossplane 会初始化托管资源的 spec.forProvider 中没有定义的一些外部资源设置。 更多详情,请参阅 late initialization 部分。https://crossplane.devops.gold/master/concepts/managed-resources/#late-initialization更多详情,请参阅the late initialization部分。 | | Observe | crossplane只观察资源,不做任何更改。 被引用到[observe only resources](https://crossplane.devops.gold/knowledge-base/guides/import-existing-resources/#import-resources-automatically| |Update | Crossplane 会在更改托管资源时更改外部资源。

以下是常见策略组合的列表:

Create Delete LateInitialize Observe Update Description
✔️ ✔️ ✔️ ✔️ ✔️ Default policy. Crossplane has full control over the resource.
✔️ ✔️ ✔️ ✔️ After creation any changes made to the managed resource aren’t passed to the external resource. Useful for immutable external resources.
✔️ ✔️ ✔️ ✔️ Prevent Crossplane from managing any settings not defined in the managed resource. Useful for immutable fields in an external resource.
✔️ ✔️ ✔️ Crossplane doesn’t import any settings from the external resource and doesn’t push changes to the managed resource. Crossplane recreateshttps://crossplane.devops.gold/knowledge-base/guides/import-existing-resources/#import-resources-automatically没有策略设置。 [暂停](#paused)资源的替代方法。

ProviderConfigRef

托管资源上的 providerConfigRef 会告诉 Provider 在创建托管资源时使用哪种 [ProviderConfighttps://crossplane.devops.gold/master/concepts/providers/#provider-configuration在创建托管资源时被引用的 [ProviderConfigRef]。

使用 ProviderConfig 定义与 Provider 通信时使用的身份验证方法。

Important
如果未引用 providerConfigRef,Provider 会使用名为 default 的 ProviderConfig。

例如,一个托管资源引用了名为用户键.

这与 名称的名称。

1apiVersion: ec2.aws.upbound.io/v1beta1
2kind: Instance
3spec:
4  forProvider:
5    # Removed for brevity
6  providerConfigRef: user-keys
1apiVersion: aws.crossplane.io/v1beta1
2kind: ProviderConfig
3metadata:
4  name: user-keys
5# Removed for brevity
Tip
每个受管资源可以引用不同的 ProviderConfigs,这样不同的受管资源就可以使用不同的凭据对同一个 Provider 进行身份验证。

ProviderRef

crossplane-runtime v0.10.0 中,crossplane 废弃了 providerRef 字段。使用 providerRef 的托管资源必须使用 providerConfigRef

writeConnectionSecretToRef

Provider 创建受管资源时,可能会生成特定于资源的详细信息,如用户名、密码或 IP 地址等连接详细信息。

crossplane 会将这些详细信息存储在由 writeConnectionSecretToRef 值指定的 Kubernetes Secret 对象中。

例如,当用 crossplane community AWS provider创建 AWS RDS 数据库实例时,会生成端点、密码、端口和用户名数据。 Provider 会将这些变量保存在 Kubernetes secret 中rds-secret中,由writeConnectionSecretToRef字段引用。

1apiVersion: database.aws.crossplane.io/v1beta1
2kind: RDSInstance
3metadata:
4  name: my-rds-instance
5spec:
6  forProvider:
7  # Removed for brevity
8  writeConnectionSecretToRef:
9    name: rds-secret

查看 Secret 对象会显示保存的字段。

1kubectl describe secret rds-secret
2Name:         rds-secret
3# Removed for brevity
4Data
5====
6port:      4 bytes
7username:  10 bytes
8endpoint:  54 bytes
9password:  27 bytes
Important
Provider 决定写入 Secret 对象的数据。 有关生成的 Secret 数据,请参阅特定 Provider 文档。

PublishConnectionDetailsTo

publishConnectionDetailsTo “字段扩展了writeConnectionSecretToRef,支持将托管资源信息存储为 Kubernetes Secret 对象或 Vault 等外部存储。

使用 “publishConnectionDetailsTo “需要启用 Crossplane 外部存储(ESS)。 在 Provider 中使用 DeploymentRuntimeConfig 启用 ESS,在 Crossplane 中使用”–enable-external-secret-stores “参数启用 ESS。https://crossplane.devops.gold/master/concepts/providers/#runtime-configuration) 并在 crossplane 中使用 --enable-external-secret-stores 参数启用 ESS。

Note
并非所有 Provider 都支持 “publishConnectionDetailsTo”,详情请查看 Provider 文档。

向 Kubernetes 发布secret

要将托管资源生成的数据发布为 Kubernetes Secret 对象,请提供一个publishConnectionDetailsTo.name

1apiVersion: rds.aws.upbound.io/v1beta1
2kind: Instance
3spec:
4  forProvider:
5  # Removed for brevity
6  publishConnectionDetailsTo:
7    name: rds-kubernetes-secret

crossplane 还可以通过使用publishConnectionDetailsTo.metadata.

 1apiVersion: rds.aws.upbound.io/v1beta1
 2kind: Instance
 3spec:
 4  forProvider:
 5  # Removed for brevity
 6  publishConnectionDetailsTo:
 7    name: rds-kubernetes-secret
 8    metadata:
 9      labels:
10        label-tag: label-value
11      annotations:
12        annotation-tag: annotation-value

向外部secret存储发布secret

向外部secret存储(如 HashiCorp Vault)发布secret数据依赖于一个publishConnectionDetailsTo.configRef.

配置configRef.name引用了一个存储配置对象。

1apiVersion: rds.aws.upbound.io/v1beta1
2kind: Instance
3spec:
4  forProvider:
5  # Removed for brevity
6  publishConnectionDetailsTo:
7    name: rds-kubernetes-secret
8    configRef: 
9      name: my-vault-storeconfig
1apiVersion: secrets.crossplane.io/v1alpha1
2kind: StoreConfig
3metadata:
4  name: my-vault-storeconfig
5# Removed for brevity
Tip
请阅读Vault 作为外部secret存储 指南,了解使用 StoreConfig 对象的详情。

Annotations

crossplane 将一套标准的 Kubernetes “Annotations “应用于托管资源。

Annotation Definition
crossplane.io/external-name The name of the managed resource inside the Provider.
crossplane.io/external-create-pending The timestamp of when Crossplane began creating the managed resource.
crossplane.io/external-create-succeeded The timestamp of when the Provider successfully created the managed resource.
crossplane.io/external-create-failed The timestamp of when the Provider failed to create the managed resource.
crossplane.io/paused Indicates Crossplane isn’t reconciling this resource. Read the Pause Annotation for more details.
crossplane.io/composition-resource-name For managed resource created by a Composition, this is the Composition’s resources.name value.

命名外部资源

默认情况下,Provider 会将外部资源命名为与 Kubernetes 对象相同的名称。

例如,一个名为my-rds-instance的托管资源的名称为 “my-rds-instance”,作为 Provider 环境中的外部资源。

1apiVersion: database.aws.crossplane.io/v1beta1
2kind: RDSInstance
3metadata:
4  name: my-rds-instance
1kubectl get rdsinstance
2NAME READY SYNCED EXTERNAL-NAME AGE
3my-rds-instance True True my-rds-instance 11m

使用已提供的 “crossplane.io/external-name “注解创建的托管资源会使用注解值作为外部资源名称。

例如,Provider 创建了名为my-rds-instance但被引用为 我的自定义名称作为 AWS 内部的外部资源。

1apiVersion: database.aws.crossplane.io/v1beta1
2kind: RDSInstance
3metadata:
4  name: my-rds-instance  
5  annotations: 
6    crossplane.io/external-name: my-custom-name
1kubectl get rdsinstance
2NAME READY SYNCED EXTERNAL-NAME AGE
3my-rds-instance True True my-custom-name 11m

创建 Annotations

当 AWS 等外部系统生成不确定的资源名称时,Provider 就有可能创建了一个资源,但却没有记录。 出现这种情况时,Provider 就无法管理该资源。

Tip
crossplane 将 Provider 创建但不管理的资源称为_leaked resources_。

Providers 设置了三个创建 Annotations,以避免和检测泄漏的资源:

  • crossplane.io/external-create-pending - Providers 上次准备创建资源的时间。
  • crossplane.io/external-create-succeeded - Provider 上次成功创建资源的时间。
  • crossplane.io/external-create-failed` - 上次 Providers 创建资源失败的时间。

使用 kubectl get 查看受管资源上的 annotations。 例如,AWS VPC 资源:

1$ kubectl get -o yaml vpc my-vpc
2apiVersion: ec2.aws.upbound.io/v1beta1
3kind: VPC
4metadata:
5  name: my-vpc
6  annotations:
7    crossplane.io/external-name: vpc-1234567890abcdef0
8    crossplane.io/external-create-pending: "2023-12-18T21:48:06Z"
9    crossplane.io/external-create-succeeded: "2023-12-18T21:48:40Z"

一个 Provider 会被引用crossplane.io/external-nameAnnotations 来查找外部系统中的托管资源。

Providers 会在外部系统中查找资源,以确定它是否存在,以及是否与托管资源的期望状态相匹配。 如果找不到资源,Providers 就会创建它。

有些外部系统不允许 Providers 在创建资源时指定资源名称,而是由外部系统生成一个非确定名称并返回给 Providers。

当外部系统生成资源名称时,Provider 会尝试将其保存到受管资源的 crossplane.io/external-name 注解中。 如果没有,它就会_泄露_资源。

Providers 无法保证能保存 Annotations。 Providers 可能会在创建资源和保存注释之间重新启动或失去网络连接。

Providers 可以检测到自己可能泄露了资源。 如果 Providers 认为自己可能泄露了资源,它就会停止对账,直到您告诉 Providers 可以安全继续。

Important

只要外部系统生成了资源名称,Providers 就有可能泄露资源。

当 Providers 检测到自己可能泄露了资源时,最安全的做法就是停下来等待人工干预。

这样可以确保 Providers 不会重复创建泄漏的资源。 重复的资源可能代价高昂而且危险。

当 Provider 认为自己可能泄露了资源时,它会创建一个与托管资源相关的 “无法确定创建结果 “事件。 被引用 “kubectl describe “可查看该事件。

1kubectl describe queue my-sqs-queue
2
3# Removed for brevity
4
5Events:
6  Type Reason Age From Message
7  ----     ------                           ----                ----                                 -------
8  Warning CannotInitializeManagedResource 29m (x19 over 19h)  managed/queue.sqs.aws.crossplane.io cannot determine creation result - remove the crossplane.io/external-create-pending annotation if it is safe to proceed

Provider 使用创建 Annotations 来检测自己是否可能泄露了资源。

Providers 每次核对托管资源时都会检查资源的创建 Annotations。 如果 Providers 看到创建等待时间比最近的创建成功或创建失败时间更近,它就知道自己可能泄露了资源。

Note
Providers 不会删除创建注解。 他们会使用时间戳来确定哪个是最新的。 一个托管资源有几个创建注解是很正常的。

Provider 知道自己可能泄露了资源,因为它会同时更新资源的所有 Annotations。 如果 Provider 在创建资源后无法更新创建注解,那么它也无法更新 crossplane.io/external-name 注解。

Tip

如果资源出现 “无法确定创建结果 “错误,请检查外部系统。

使用来自 crossplane.io/external-create-pending 注解的时间戳来确定 Providers 可能泄露资源的时间。 查找在此时间前后创建的资源。

如果发现泄漏的资源,而且安全的话,请将其从外部系统中删除。

在确定不存在泄漏资源后,从托管资源中移除 “crossplane.io/external-create-pending “注解。 这将告诉 Providers 恢复调节并重新创建托管资源。

Provider 也会使用创建 Annotations 来避免资源泄露。

当 Providers 写入 “crossplane.io/external-create-pending “注解时,它知道自己正在调和最新版本的托管资源。 如果 Providers 正在调和旧版本的托管资源,写入将失败。

如果 Providers 将旧版本与过时的 crossplane.io/external-name 注解进行核对,它可能会错误地判定该资源不存在。 Providers 会创建一个新资源,并泄漏现有资源。

有些外部系统在 Providers 创建资源和系统报告资源存在之间会有延迟。 Providers 会使用最近的创建成功时间来解释这一延迟。

如果 Providers 没有考虑到延迟,它可能会错误地判断该资源不存在。 Providers 会创建一个新资源,并泄漏现有资源。

暂停

手动应用 crossplane.io/paused 注解会导致 Provider 停止调节托管资源。

在修改 Provider 或编辑 Kubernetes 对象时,暂停资源非常有用。

apply a crossplane.io/paused: "true"注释来暂停调和托管资源。

Note
只有值"true"才会暂停调和。
 1apiVersion: ec2.aws.upbound.io/v1beta1
 2kind: Instance
 3metadata:
 4  name: my-rds-instance
 5  annotations:
 6    crossplane.io/paused: "true"
 7spec:
 8  forProvider:
 9    region: us-west-1
10    instanceType: t2.micro

删除 Annotations,恢复对账。

Finalizer

crossplane 对托管资源应用 Finalizer 来控制其删除。

Note
Kubernetes 无法使用 Finalizer 删除对象。

当 crossplane 删除受管资源时,Provider 会开始删除外部资源,但受管资源仍会保留,直到外部资源被完全删除。

外部资源完全删除后,crossplane 会移除 Finalizer 并删除托管资源对象。

条件

crossplane 有一套标准的受管资源 “条件 “集。 使用 kubectl describe<managed_resource> 查看受管资源的 “条件”。

Note
提供商可以定义自己的自定义 “条件”。

可用

Reason: Available “表示 Provider 创建了托管资源,并已准备好供使用。

1Conditions:
2  Type:                  Ready
3  Status:                True
4  Reason:                Available

创建

原因: 正在创建 “表示 Provider 正在尝试创建托管资源。

1Conditions:
2  Type:                  Ready
3  Status:                False
4  Reason:                Creating

删除

原因: 正在删除 “表示 Provider 正在尝试删除托管资源。

1Conditions:
2  Type:                  Ready
3  Status:                False
4  Reason:                Deleting

ReconcilePaused

Reason:ReconcilePaused “表示受管资源有[Pause](#paused)注解

1Conditions:
2  Type:                  Synced
3  Status:                False
4  Reason:                ReconcilePaused

ReconcileError

原因: ReconcileError “表示 Crossplane 在调节托管资源时遇到错误。 条件 “的 “Message: “值有助于识别 Crossplane 的错误。

1Conditions:
2  Type:                  Synced
3  Status:                False
4  Reason:                ReconcileError

ReconcileSuccess

Reason:ReconcileSuccess “表示 Provider 创建并正在监控托管资源。

1Conditions:
2  Type:                  Synced
3  Status:                True
4  Reason:                ReconcileSuccess

无法提供

Reason:Unavailable”(原因: 不可用)表示 crossplane 预计受管资源可用,但 Provider 报告该资源不健康。

1Conditions:
2  Type:                  Ready
3  Status:                False
4  Reason:                Unavailable

未知

Reason: Unknown 表示 Provider 与托管资源发生了意外错误。 conditions.message提供了出错原因的更多信息。

1Conditions:
2  Type:                  Unknown
3  Status:                False
4  Reason:                Unknown

Upjet Providers 条件

Upjet是生成 Crossplane Providider 的开源工具,它也有一套标准的 “条件”。

AsyncOperation

有些资源的创建时间可能超过一分钟,基于 Upjet 的 Provider 可以通过异步操作,在创建托管资源前完成 Kubernetes 命令。

已完成

原因: 已完成 “表示异步操作已成功完成。

1Conditions:
2  Type:                  AsyncOperation
3  Status:                True
4  Reason:                Finished
进行中

原因: 正在进行 “表示受管资源操作仍在进行中。

1Conditions:
2  Type:                  AsyncOperation
3  Status:                True
4  Reason:                Ongoing

LastAsyncOperation

Upjet Type: LastAsyncOperation 捕获上一次异步操作的状态,即 “成功 “或失败 “原因”。

ApplyFailure

Reason: ApplyFailure 表示 Provider 向托管资源应用设置失败。 conditions.message提供了更多有关出错原因的信息。

1Conditions:
2  Type:                  LastAsyncOperation
3  Status:                False
4  Reason:                ApplyFailure
DestroyFailure

Reason: DestroyFailure 表示 Provider 删除托管资源失败。 conditions.message提供了更多关于出错原因的信息。

1Conditions:
2  Type:                  LastAsyncOperation
3  Status:                False
4  Reason:                DestroyFailure
成功

原因: 成功 “表示 Provider 成功地异步创建了托管资源。

1Conditions:
2  Type:                  LastAsyncOperation
3  Status:                True
4  Reason:                Success