Crossplane 扩展了 Kubernetes,使其能够创建和管理 Kubernetes 集群外部的资源。Crossplane 使用了多个核心组件来管理通过 Kubernetes 构建和管理外部资源的各个元素。它们之间的关系如下:
云资源供应商(Provider)
云资源供应商(Provider)使 Crossplane 能够在外部服务上配置基础设施。Provider 创建新的 Kubernetes API 并将它们映射到外部 API。云资源供应商负责连接非 Kubernetes 资源的各个方面。腾讯云作为 Crossplane 的供应商 一员,提供对应腾讯云资源的支持和服务。
安装 Provider
在开始使用 Crossplane 前,我们需要先安装 Provider 程序。
apiVersion: pkg.crossplane.io/v1 kind: Provider metadata: name: provider-tencentcloud spec: package: xpkg.upbound.io/crossplane-contrib/provider-tencentcloud:v0.7.1
托管资源(Managed Resources,MR)
托管资源(Managed Resources,MR)是表示 Provider 在 Kubernetes 外部创建的事物的 Kubernetes 对象。在 Kubernetes 中创建托管资源需要 Provider 来创建相应的外部资源。删除托管资源需要提供者删除关联的外部资源。例如,腾讯云提供了 CVM、MySQL、Ckafka 等资源,这些资源在 Kubernetes 中以托管资源的形式存在。
一个可用的托管资源如下:
apiVersion: vpc.tencentcloud.crossplane.io/v1alpha1kind: VPCmetadata:name: resource-vpcnamespace: crossplane-systemspec:forProvider:cidrBlock: 10.1.0.0/16name: crossplane-test-vpc
group,kind 和 version
每个托管资源都是一个独特的 API 端点,具有自己的组、种类和版本信息。
例如,以下定义了一个组、种类和版本分别为 vpc.tencentcloud.crossplane.io、VPC、v1alpha1的资源。
apiVersion: vpc.tencentcloud.crossplane.io/v1alpha1kind: VPC
forProvider
spec.forProvider
用于定义映射到外部资源的参数。spec:forProvider: # 定义外部资源的参数cidrBlock: 10.1.0.0/16 # cidrname: crossplane-test-vpc # 名称
name
name
标识该资源在 Kubernetes 中的名称,EXTERNAL-NAME
为该资源的真实 Id。❯ k get managedNAME READY SYNCED EXTERNAL-NAME AGEresource-vpc-m8zgg True True vpc-hbgs1o5r 2d16h
组合(Composition)
组合是用于将多个托管资源创建为单个对象的模板。组合描述了更复杂的部署,组合了多个托管资源和任何资源自定义,例如数据库或云提供商区域的大小。
以下是一个名为 "composition-cvm" 的组合示例:
apiVersion: apiextensions.crossplane.io/v1kind: Compositionmetadata:name: composition-cvmspec:compositeTypeRef:apiVersion: crd.tencentcloud.crossplane.io/v1alpha1kind: XCvmresources:- name: vpc(略)- name: subnet(略)- name: cvm(略)
在这个示例中,我们将多个不同类型的资源(vpc、subnet、cvm)定义在一起,以便一并进行部署和管理。
compositeTypeRef
定义了该组合实际应用于哪个 Composite Resource Definition (XRD) 上,通过
apiVersion
和kind
匹配对应的 XRD。base
base
用于定义该资源实际应用在哪个资源上,通过 apiVersion
和 kind
匹配实际资源。resources:- name: cvmbase:apiVersion: cvm.tencentcloud.crossplane.io/v1alpha1kind: Instancespec:forProvider:# imageId: "img-9qrfy1xt"patches:(略)
patches
pathches
用户定义外部资源和配置中参数的映射,您可以通过该字段,将不同名称或来源的参数在此进行映射匹配。例如,在上述示例中,为 cvm 资源的
vpcId
和subnetId
参数定义来源。resources:- name: cvmbase:(略)patches:- fromFieldPath: status.share.vpcIdtoFieldPath: spec.forProvider.vpcId- fromFieldPath: status.share.subnetIdtoFieldPath: spec.forProvider.subnetId
复合资源定义(Composition Resource Definition,XRD)
XRD 代表自定义 API,由平台工程师创建并由开发人员或最终用户使用。最终用户参考 XRD,即可知道如何使用该复合资源。
以下为一个 XRD 的示例:
apiVersion: apiextensions.crossplane.io/v1kind: CompositeResourceDefinitionmetadata:name: xcvms.crd.tencentcloud.crossplane.iospec:group: crd.tencentcloud.crossplane.ionames:kind: XCvmplural: xcvmsversions:- name: v1alpha1served: truereferenceable: trueschema:openAPIV3Schema:type: objectproperties:spec:type: objectproperties:vpcName:type: string(略)required:- vpcName(略)status:description: A Status represents the observed stateproperties:share:(略)type: object
group、kind
# composition.yamlapiVersion: apiextensions.crossplane.io/v1kind: Compositionmetadata:name: composition-cvmspec:compositeTypeRef:apiVersion: crd.tencentcloud.crossplane.io/v1alpha1kind: XCvm
versions
可为 XRD 定义多套参数,提供给多个 Composition 复用,用版本进行管理。
properties
用于定义
spec
和status
。spec
定义组合可以接收的参数。required 为必选参数。
properties:spec:type: objectproperties:vpcName:type: string(略)required:- vpcName(略)
status
定义组合可以提供访问的参数。用户通过
share.stauts
访问。properties:status:description: A Status represents the observed stateproperties:share:description: Freeform field containing status informationtype: objectx-kubernetes-preserve-unknown-fields: truetype: object
复合资源(Composition Resource,XR)
复合资源将一组托管资源表示为单个 Kubernetes 对象。当用户访问 XRD 中定义的自定义 API 时,Crossplane 会创建复合资源。
用户参考 XRD 中的参数定义,在 XR 中指定实际参数值。
以下为一个复合资源的示例:
apiVersion: crd.tencentcloud.crossplane.io/v1alpha1kind: XCvmmetadata:name: xcvm-examplespec:vpcName: xvpcName # 指定具体vpcNamesubnetName: xsubnetName # 指定具体subnetNameavailabilityZone: ap-guangzhou-3 # 指定可用区# imageId: img-9qrfy1xt # 指定镜像(非必选参数)
声明(Claim)
类似于复合资源,但存在于 Kubernetes 命名空间中。每个声明都链接到单个集群范围的复合资源。平台用户在其独特的命名空间中创建声明,将其资源与其他命名空间中的其他团队隔离。详情请参见官网文档,获取 Claims 更多信息。