Crossplane 核心概念

最近更新时间:2024-05-21 11:42:42

我的收藏
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/v1alpha1
kind: VPC
metadata:
name: resource-vpc
namespace: crossplane-system
spec:
forProvider:
cidrBlock: 10.1.0.0/16
name: crossplane-test-vpc

group,kind 和 version

每个托管资源都是一个独特的 API 端点,具有自己的种类版本信息
例如,以下定义了一个种类版本分别为 vpc.tencentcloud.crossplane.io、VPC、v1alpha1的资源。
apiVersion: vpc.tencentcloud.crossplane.io/v1alpha1
kind: VPC

forProvider

spec.forProvider 用于定义映射到外部资源的参数。
spec:
forProvider: # 定义外部资源的参数
cidrBlock: 10.1.0.0/16 # cidr
name: crossplane-test-vpc # 名称

name

name 标识该资源在 Kubernetes 中的名称,EXTERNAL-NAME 为该资源的真实 Id。
❯ k get managed
NAME READY SYNCED EXTERNAL-NAME AGE
resource-vpc-m8zgg True True vpc-hbgs1o5r 2d16h

组合(Composition)

组合是用于将多个托管资源创建为单个对象的模板。组合描述了更复杂的部署,组合了多个托管资源和任何资源自定义,例如数据库或云提供商区域的大小。
以下是一个名为 "composition-cvm" 的组合示例:
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: composition-cvm
spec:
compositeTypeRef:
apiVersion: crd.tencentcloud.crossplane.io/v1alpha1
kind: XCvm
resources:
- name: vpc
(略)
- name: subnet
(略)
- name: cvm
(略)
在这个示例中,我们将多个不同类型的资源(vpc、subnet、cvm)定义在一起,以便一并进行部署和管理。

compositeTypeRef

定义了该组合实际应用于哪个 Composite Resource Definition (XRD) 上,通过apiVersionkind匹配对应的 XRD。

base

base用于定义该资源实际应用在哪个资源上,通过 apiVersionkind 匹配实际资源。
resources:
- name: cvm
base:
apiVersion: cvm.tencentcloud.crossplane.io/v1alpha1
kind: Instance
spec:
forProvider:
# imageId: "img-9qrfy1xt"
patches:
(略)

patches

pathches用户定义外部资源和配置中参数的映射,您可以通过该字段,将不同名称或来源的参数在此进行映射匹配。
例如,在上述示例中,为 cvm 资源的vpcIdsubnetId参数定义来源。
resources:
- name: cvm
base:
(略)
patches:
- fromFieldPath: status.share.vpcId
toFieldPath: spec.forProvider.vpcId
- fromFieldPath: status.share.subnetId
toFieldPath: spec.forProvider.subnetId

复合资源定义(Composition Resource Definition,XRD)

XRD 代表自定义 API,由平台工程师创建并由开发人员或最终用户使用。最终用户参考 XRD,即可知道如何使用该复合资源。
以下为一个 XRD 的示例:
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xcvms.crd.tencentcloud.crossplane.io
spec:
group: crd.tencentcloud.crossplane.io
names:
kind: XCvm
plural: xcvms
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
vpcName:
type: string
(略)
required:
- vpcName
(略)
status:
description: A Status represents the observed state
properties:
share:
(略)
type: object

group、kind

groupkind字段用于匹配 组合(Composition)里的compositeTypeRef字段。
# composition.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: composition-cvm
spec:
compositeTypeRef:
apiVersion: crd.tencentcloud.crossplane.io/v1alpha1
kind: XCvm

versions

可为 XRD 定义多套参数,提供给多个 Composition 复用,用版本进行管理。

properties

用于定义specstatus
spec
定义组合可以接收的参数。required 为必选参数。
properties:
spec:
type: object
properties:
vpcName:
type: string
(略)
required:
- vpcName
(略)
status
定义组合可以提供访问的参数。用户通过share.stauts访问。
properties:
status:
description: A Status represents the observed state
properties:
share:
description: Freeform field containing status information
type: object
x-kubernetes-preserve-unknown-fields: true
type: object

复合资源(Composition Resource,XR)

复合资源将一组托管资源表示为单个 Kubernetes 对象。当用户访问 XRD 中定义的自定义 API 时,Crossplane 会创建复合资源。
用户参考 XRD 中的参数定义,在 XR 中指定实际参数值。
以下为一个复合资源的示例:
apiVersion: crd.tencentcloud.crossplane.io/v1alpha1
kind: XCvm
metadata:
name: xcvm-example
spec:
vpcName: xvpcName # 指定具体vpcName
subnetName: xsubnetName # 指定具体subnetName
availabilityZone: ap-guangzhou-3 # 指定可用区
# imageId: img-9qrfy1xt # 指定镜像(非必选参数)

声明(Claim)

类似于复合资源,但存在于 Kubernetes 命名空间中。每个声明都链接到单个集群范围的复合资源。平台用户在其独特的命名空间中创建声明,将其资源与其他命名空间中的其他团队隔离。详情请参见官网文档,获取 Claims 更多信息。