构建 CVM 资源

最近更新时间:2024-05-20 18:23:32

我的收藏
利用 Crossplane 的 XRD 特性,我们可以通过 Composition 来定义自定义的组合资源,将需要的资源组合在一起部署和管理;通过在 XRD 中定义和配置对应的 API,提供该组合资源对外暴露的参数。
本文介绍如何创建一个包含 CVM、VPC 和对应子网的组合资源XCvm。为了构建XCvm资源,需要创建并定义xrd.yamlcomposition.yamlxcvm.yaml,然后执行这三个配置文件。

定义 XRD

首先我们需要创建自定义 API,即为后面创建的复合资源,定义该复合资源对应的参数和类型。
我们在 xrd.yaml 定义了vpcName, subnetName, availabilityZone 作为必选参数,用户使用该复合资源时,必须提供这三个参数,用于创建 VPC 和对应子网。其余如 imageIdavailabilityZoneinstanceTypeinstanceChargeType为可选参数。
# xrd.yaml
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
subnetName:
type: string
imageId:
type: string
default: "img-9qrfy1xt" # 默认值
availabilityZone:
type: string
instanceType:
type: string
instanceChargeType:
type: string
required: # 必选参数
- vpcName
- subnetName
- availabilityZone
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

接着,在 composition.yaml 中定义复合资源,包括一个 VPC,一个子网,和在该 VPC 下的 CVM 实例。
用户可在资源创建后,通过 status.share 获取 CVM 的实例 Id。
# composition.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: composition-cvm
spec:
compositeTypeRef:
apiVersion: crd.tencentcloud.crossplane.io/v1alpha1
kind: XCvm
resources:
- name: vpc
base:
apiVersion: vpc.tencentcloud.crossplane.io/v1alpha1
kind: VPC
spec:
forProvider:
cidrBlock: "10.1.0.0/16"
patches:
- fromFieldPath: spec.vpcName
toFieldPath: spec.forProvider.name
- type: ToCompositeFieldPath
fromFieldPath: status.atProvider.id
toFieldPath: status.share.vpcId

- name: subnet
base:
apiVersion: vpc.tencentcloud.crossplane.io/v1alpha1
kind: Subnet
spec:
forProvider:
cidrBlock: "10.1.2.0/24"
patches:
- fromFieldPath: status.share.vpcId # 使用上面创建的vpc
toFieldPath: spec.forProvider.vpcId
- fromFieldPath: spec.subnetName
toFieldPath: spec.forProvider.name
- fromFieldPath: spec.availabilityZone
toFieldPath: spec.forProvider.availabilityZone
- type: ToCompositeFieldPath
fromFieldPath: status.atProvider.id
toFieldPath: status.share.subnetId

- name: cvm
base:
apiVersion: cvm.tencentcloud.crossplane.io/v1alpha1
kind: Instance
spec:
forProvider:
instanceName: test-crossplane-cvm
# imageId: "img-9qrfy1xt"
patches:
- fromFieldPath: status.share.vpcId # 使用上面创建的vpc
toFieldPath: spec.forProvider.vpcId
- fromFieldPath: status.share.subnetId # 使用上面创建的subnet
toFieldPath: spec.forProvider.subnetId
- fromFieldPath: spec.availabilityZone
toFieldPath: spec.forProvider.availabilityZone
- fromFieldPath: spec.imageId
toFieldPath: spec.forProvider.imageId
- type: ToCompositeFieldPath
fromFieldPath: status.atProvider.id
toFieldPath: status.share.cvmId # cvm 实例Id

创建 XCvm 资源

xcvm.yaml 中为复合资源设置子网名称和可用区。
# xcvm.yaml
apiVersion: crd.tencentcloud.crossplane.io/v1alpha1
kind: XCvm
metadata:
name: xcvm-example # 复合资源前缀
spec:
vpcName: xvpcName # 指定VPC和子网名称
subnetName: xsubnetName
availabilityZone: ap-guangzhou-3 # 指定可用区
# imageId: img-xxxx # 使用指定镜像 Id
使用 kubectl apply 命令依次执行上述配置文件,完成资源的创建。
kubectl apply -f xrd.yaml
kubectl apply -f composition.yaml
kubectl apply -f xcvm.yaml
执行结果如下:
创建了前缀为 xcvm-example- 的 VPC、子网和 CVM 实例。
kubectl get managed
NAME READY SYNCED EXTERNAL-NAME AGE
instance.cvm.tencentcloud.crossplane.io/xcvm-example-75vc2 True True ins-7d5rb9us 3m4s

NAME READY SYNCED EXTERNAL-NAME AGE
subnet.vpc.tencentcloud.crossplane.io/xcvm-example-zlshp True True subnet-2hmfd8go 5m

NAME READY SYNCED EXTERNAL-NAME AGE
vpc.vpc.tencentcloud.crossplane.io/xcvm-example-rd5gq True True vpc-3ofo55dx 5m
此时,您可在控制台查看刚才创建的 CVM 资源



查看 VPC 资源



查看 子网资源