这篇说说如何创建一个包含 CVM、VPC 和对应子网的组合资源XCvm。为了构建XCvm资源,需要创建并定义xrd.yaml、composition.yaml、xcvm.yaml,然后执行这三个配置文件。
一、定义 XRD
首先我们需要创建自定义 API,即为后面创建的复合资源,定义该复合资源对应的参数和类型。
我们在 xrd.yaml 定义了vpcName, subnetName, availabilityZone 作为必选参数,用户使用该复合资源时,必须提供这三个参数,用于创建 VPC 和对应子网。其余如 imageId,availabilityZone,instanceType,instanceChargeType为可选参数。
# xrd.yamlapiVersion: apiextensions.crossplane.io/v1kind: CompositeResourceDefinitionmetadata: name: xcvms.crd.tencentcloud.crossplane.iospec: 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.yamlapiVersion: apiextensions.crossplane.io/v1kind: Compositionmetadata: name: composition-cvmspec: 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.yamlapiVersion: crd.tencentcloud.crossplane.io/v1alpha1kind: XCvmmetadata: name: xcvm-example # 复合资源前缀spec: vpcName: xvpcName # 指定VPC和子网名称 subnetName: xsubnetName availabilityZone: ap-guangzhou-3 # 指定可用区 # imageId: img-xxxx # 使用指定镜像 Id
使用 kubectl apply 命令依次执行上述配置文件,完成资源的创建。
kubectl apply -f xrd.yamlkubectl apply -f composition.yamlkubectl apply -f xcvm.yaml
执行结果如下:
创建了前缀为 xcvm-example- 的 VPC、子网和 CVM 实例。
❯ kubectl get managedNAME READY SYNCED EXTERNAL-NAME AGEinstance.cvm.tencentcloud.crossplane.io/xcvm-example-75vc2 True True ins-7d5rb9us 3m4sNAME READY SYNCED EXTERNAL-NAME AGEsubnet.vpc.tencentcloud.crossplane.io/xcvm-example-zlshp True True subnet-2hmfd8go 5mNAME READY SYNCED EXTERNAL-NAME AGEvpc.vpc.tencentcloud.crossplane.io/xcvm-example-rd5gq True True vpc-3ofo55dx 5m
此时,你可在控制台查看刚才创建的 CVM 资源。
查看 VPC 资源。
查看 子网资源。