简介
在当今的云原生时代,Kubernetes 已经成为了管理和部署应用的首选平台。同时,MySQL 作为最流行的开源关系型数据库,也在许多应用中发挥着重要的作用。本文将介绍如何使用 MySQL Operator 在 Kubernetes 上部署和管理 MySQL 集群。MySQL Operator 是一种基于 Kubernetes Operator 模式构建的工具,它封装了有状态应用程序的复杂性,使得我们可以更简单地管理和运维 MySQL 集群。
MySQL Operator 的主要功能
MySQL Operator 提供了以下主要功能:
-
自动化部署:通过简单的 YAML 文件描述你的 MySQL 集群,MySQL Operator 会自动创建并配置集群。
-
自动备份:MySQL Operator 可以定期自动备份你的 MySQL 集群
-
自动扩展:根据工作负载的需求,MySQL Operator 可以自动增加或减少节点的数量。
-
版本升级:MySQL Operator 可以帮助你轻松地升级 MySQL 集群到新版本。
下面,我们将详细介绍如何使用 MySQL Operator。
案例的 yaml 地址
https://github.com/bboysoulcn/kubernetes-sample/tree/master/mysql-operator
如何部署 MySQL Operator
首先,我们需要部署 MySQL Operator。我个人更倾向于直接使用 YAML 文件进行部署,而不是使用 Helm。MySQL Operator 的 YAML 文件可以在以下链接中找到:
https://github.com/mysql/mysql-operator/tree/trunk/deploy
deploy-crds.yaml
deploy-operator.yaml
你也可以直接使用我在 GitHub 仓库中的 YAML 文件。只需使用 kubectl apply
命令应用这两个 YAML 文件,就可以启动 MySQL Operator 的 Pod,完成部署。
如何创建第一个 MySQL 集群
要创建 MySQL 集群,首先需要创建一个 Secret 来存储集群的初始账户和密码。以下是一个示例:
apiVersion: v1
kind: Secret
metadata:
name: mypwds
stringData:
rootUser: root
rootHost: '%'
rootPassword: pass
创建 Secret 后,我们可以创建 MySQL 集群。以下是一个示例:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: idc-with-custom-config
spec:
secretName: mypwds
instances: 3
router:
instances: 1
tlsUseSelfSigned: true
datadirVolumeClaimTemplate:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 300Gi
mycnf: |
[mysqld]
innodb_buffer_pool_size=200M
innodb_log_file_size=2G
service:
type: LoadBalancer
version: 8.2.0 # 版本一定要 x.x.x
backupProfiles:
- name: myfancyprofile # Embedded backup profile
dumpInstance: # MySQL Shell Dump
# dumpOptions:
# excludeTables: "[world.country]" # Example to exclude one table
storage:
persistentVolumeClaim:
claimName: mysqlbackup-pvc # store to this pre-existing PVC
backupSchedules:
- name: mygreatschedule
schedule: "0 0 * * *" # Daily, at midnight
backupProfileName: myfancyprofile # reference the desired backupProfiles's name
enabled: true # backup schedules can be temporarily disabled
以下是一些关键参数的解释:
secretName
是之前创建的 Secret 的名称。instances
是 MySQL 实例的数量。router.instances
是 Router 实例的数量。datadirVolumeClaimTemplate
中定义了 PVC 相关的参数,例如我在这里定义了storageClassName
为我集群中的managed-nfs-storage
。mycnf
定义了 MySQL 相关的配置参数。service
定义了 Router 对外的 service 类型。version
指定了 MySQL 的版本,注意版本需要使用x.x.x
这种格式。
如何配置 MySQL 集群的备份
如果你需要备份 MySQL 集群,你需要在 InnoDBCluster
中定义 MySQL 备份相关的配置。以下是一个示例:
backupProfiles:
- name: myfancyprofile # Embedded backup profile
dumpInstance: # MySQL Shell Dump
# dumpOptions:
# excludeTables: "[world.country]" # Example to exclude one table
storage:
persistentVolumeClaim:
claimName: mysqlbackup-pvc # store to this pre-existing PVC
backupSchedules:
- name: mygreatschedule
schedule: "0 0 * * *" # Daily, at midnight
backupProfileName: myfancyprofile # reference the desired backupProfiles's name
enabled: true # backup schedules can be temporarily disabled
在配置备份之前,你需要创建一个 PVC 来存储备份。以下是一个示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysqlbackup-pvc
spec:
storageClassName: managed-nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
配置完成后,在 Kubernetes 中就创建了一个 CronJob。你可以通过这个 CronJob 手动创建一个 Job 来备份,也可以直接创建 MySQLBackup
资源来创建一个备份。以下是一个示例:
apiVersion: mysql.oracle.com/v2
kind: MySQLBackup
metadata:
name: a-cool-one-off-backup
namespace: mysql-operator
spec:
clusterName: idc-with-custom-config
backupProfileName: myfancyprofile
结论和下一步
其他详细的参数你可以在
https://dev.mysql.com/doc/mysql-operator/en/mysql-operator-properties.html
这里找到,同时备份的话不一定要创建一个 pv 来存储备份,是支持直接上传备份到 oci对象存储 和 s3 的
欢迎关注我的博客www.bboy.app
Have Fun