一、定义 XRD
首先我们需要创建自定义 API,即为后面创建的复合资源,定义该复合资源对应的参数和类型。
我们在 xrd.yaml 定义了 MySQL 相关的配置(例如规格,内存,计费类型等)和 VPC、子网资源配置。
其中vpcName,subnetName,availabilityZone 为必选参数,用于创建 VPC 和对应子网。
# xrd.yamlapiVersion: apiextensions.crossplane.io/v1kind: CompositeResourceDefinitionmetadata: name: xmysqls.crd.tencentcloud.crossplane.iospec: group: crd.tencentcloud.crossplane.io names: kind: XMySQL plural: xmysqls versions: – name: v1alpha1 served: true referenceable: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: vpcName: type: string subnetName: type: string availabilityZone: type: string instanceName: type: string default: test-crossplane-mysql # 实例默认值 chargeType: type: string default: POSTPAID # 默认按量计费 intranetPort: type: integer default: 3306 # 默认端口 parameters: type: object properties: maxConnections: type: integer default: 1000 # 默认最大链接数 character_set_server: type: string default: utf8 # 默认字符集 volumeSize: type: integer default: 200 # 默认容量 memSize: type: integer default: 4000 # 默认内存值 sgId: type: string securityGroups: type: array items: 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 下的 MySQL 实例。
用户可在资源创建后,通过 status.share 获取 MySQL 的实例 Id。
# composition.yamlapiVersion: apiextensions.crossplane.io/v1kind: Compositionmetadata: name: composition-mysqlspec: compositeTypeRef: apiVersion: crd.tencentcloud.crossplane.io/v1alpha1 kind: XMySQL resources: # vpc 配置 – 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 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: mysql base: apiVersion: mysql.tencentcloud.crossplane.io/v1alpha1 kind: Instance spec: forProvider: rootPasswordSecretRef: # password 配置 key: password namespace: crossplane-system name: mysql-root-password patches: – fromFieldPath: status.share.vpcId # 使用上面创建的 VPC toFieldPath: spec.forProvider.vpcId – fromFieldPath: status.share.subnetId # 使用上面创建的子网 toFieldPath: spec.forProvider.subnetId – fromFieldPath: spec.securityGroups toFieldPath: spec.forProvider.securityGroups – fromFieldPath: spec.chargeType toFieldPath: spec.forProvider.chargeType – fromFieldPath: spec.availabilityZone toFieldPath: spec.forProvider.availabilityZone – fromFieldPath: spec.instanceName toFieldPath: spec.forProvider.instanceName – fromFieldPath: spec.volumeSize toFieldPath: spec.forProvider.volumeSize – fromFieldPath: spec.memSize toFieldPath: spec.forProvider.memSize – fromFieldPath: spec.intranetPort toFieldPath: spec.forProvider.intranetPort – fromFieldPath: spec.parameters toFieldPath: spec.forProvider.parameters – type: ToCompositeFieldPath fromFieldPath: status.atProvider.id toFieldPath: status.share.mysqlId # 实例 Id
然后,在 secret.yaml中定义 MySQL 实例的密码:
# secret.yamlapiVersion: v1kind: Secretmetadata: name: mysql-root-password namespace: crossplane-systemstringData: password: my-secure-password
三、创建 XMySQL 资源
现在,在xmysql.yaml 中为复合资源设置子网和实例配置。
# xmysql.yamlapiVersion: crd.tencentcloud.crossplane.io/v1alpha1kind: XMySQLmetadata: name: xmysql-example # 复合资源前缀 namespace: crossplane-systemspec: # 指定子网和可用区 vpcName: test-crossplane-vpc subnetName: test-crossplane-subnet availabilityZone: ap-guangzhou-3 # 实例配置 volumeSize: 30 memSize: 2000 instanceName: test-crossplane-mysql-instance # 安全组配置 securityGroups: – sg-xxxxxx
使用 kubectl apply 命令依次执行上述配置文件,完成资源的创建。
kubectl apply -f xrd.yamlkubectl apply -f secret.yamlkubectl apply -f composition.yamlkubectl apply -f xmysql.yaml
执行结果如下:
创建了前缀为 xmysql-example- 的 VPC,子网和 MySQL 实例。
❯ kubectl get managedNAME READY SYNCED EXTERNAL-NAME AGEinstance.mysql.tencentcloud.crossplane.io/xmysql-example-bqg56 True True cdb-071eyvvt 3m6sNAME READY SYNCED EXTERNAL-NAME AGEsubnet.vpc.tencentcloud.crossplane.io/xmysql-example-b5jmh True True subnet-qmac9t04 16mNAME READY SYNCED EXTERNAL-NAME AGEvpc.vpc.tencentcloud.crossplane.io/xmysql-example-pc7dt True True vpc-124cxb6p 16m
此时,你可在控制台查看刚才创建的 MySQL 资源。
查看 VPC 资源。
查看 子网资源。