构建 MySQL 资源

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

我的收藏
本文介绍如何创建一个包含 MySQL、VPC 和对应子网的组合资源 XMySQL。为了构建XMySQL资源,需要创建并定义xrd.yamlcomposition.yamlxmysql.yamlsecret.yaml,然后执行这三个配置文件。

定义 XRD

首先我们需要创建自定义 API,即为后面创建的复合资源,定义该复合资源对应的参数和类型。
我们在 xrd.yaml 定义了 MySQL 相关的配置(例如规格,内存,计费类型等)和 VPC、子网资源配置。
其中vpcNamesubnetNameavailabilityZone 为必选参数,用于创建 VPC 和对应子网。
# xrd.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xmysqls.crd.tencentcloud.crossplane.io
spec:
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.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: composition-mysql
spec:
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.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-root-password
namespace: crossplane-system
stringData:
password: my-secure-password

创建 XMySQL 资源

现在,在xmysql.yaml 中为复合资源设置子网和实例配置。
# xmysql.yaml
apiVersion: crd.tencentcloud.crossplane.io/v1alpha1
kind: XMySQL
metadata:
name: xmysql-example # 复合资源前缀
namespace: crossplane-system
spec:
# 指定子网和可用区
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.yaml
kubectl apply -f secret.yaml
kubectl apply -f composition.yaml
kubectl apply -f xmysql.yaml
执行结果如下:
创建了前缀为 xmysql-example- 的 VPC,子网和 MySQL 实例。
kubectl get managed
NAME READY SYNCED EXTERNAL-NAME AGE
instance.mysql.tencentcloud.crossplane.io/xmysql-example-bqg56 True True cdb-071eyvvt 3m6s

NAME READY SYNCED EXTERNAL-NAME AGE
subnet.vpc.tencentcloud.crossplane.io/xmysql-example-b5jmh True True subnet-qmac9t04 16m

NAME READY SYNCED EXTERNAL-NAME AGE
vpc.vpc.tencentcloud.crossplane.io/xmysql-example-pc7dt True True vpc-124cxb6p 16m
此时,您可在控制台查看刚才创建的 MySQL 资源



查看 VPC 资源



查看 子网资源