CRD-KubeBlocks-配置数据库主从定时备份
安装 Snapshot Controller
前言
KubeBlocks 是一个面向云原生环境的数据库管理平台,它能够帮助开发者和运维人员在 Kubernetes 集群上轻松部署、管理和运维各种数据库。本文将详细介绍如何在已有的 Kubernetes 集群上安装 KubeBlocks,包括环境准备、安装步骤以及验证方法。
kubectl get crd volumesnapshotclasses.snapshot.storage.k8s.io
kubectl get crd volumesnapshots.snapshot.storage.k8s.io
kubectl get crd volumesnapshotcontents.snapshot.storage.k8s.io
安装步骤
使用 Helm 添加仓库并安装:
helm repo add piraeus-charts https://piraeus.io/helm-charts/
helm repo update
helm search repo kubeblocks/kubeblocks --versions
helm install snapshot-controller piraeus-charts/snapshot-controller -n kb-system --create-namespace
验证安装:
安装 KubeBlocks
KubeBlocks 支持多种安装方式,下面介绍三种常用方法:
# Helm 需要访问 Kubernetes API Server(https://lb.kubesphere.local:6443)
来创建资源。
# 你设置了代理 (192.168.100.100:7890),但是 API Server 是内网地址,走了代理导致连接被 reset。
# 也就是 内网流量不能走外网代理。
# 设置 NO_PROXY 避免内网走代理
export NO_PROXY=lb.kubesphere.local,192.168.6.0/24,127.0.0.1
# Step 1: Install CRDs
kubectl create -f https://github.com/apecloud/kubeblocks/releases/download/{{VERSION}}/kubeblocks_crds.yaml
# Step 2: Configure Helm Repository
helm repo add kubeblocks https://apecloud.github.io/helm-charts
helm repo update
# Step 3: Deploy KubeBlocks
helm install kubeblocks kubeblocks/kubeblocks --namespace kb-system --create-namespace --version={{VERSION}}
安装kbcli
[root@k8s-master1 kubeblocks]# curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash
Your system is linux_amd64
Installing kbcli ...
Getting the latest kbcli ...
Downloading ...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
100 33.6M 100 33.6M 0 0 3167k 0 0:00:10 0:00:10 --:--:-- 4254k
kbcli installed successfully.
Kubernetes: v1.28.2
KubeBlocks: 1.0.0
kbcli: 1.0.0
Make sure your docker service is running and begin your journey with kbcli:
kbcli playground init
For more information on how to get started, please visit:
https://kubeblocks.io
[root@k8s-master1 kubeblocks]# kbcli version
Kubernetes: v1.28.2
KubeBlocks: 1.0.0
kbcli: 1.0.0
# 启用kbcli自动补全
# 临时生效
source <(kbcli completion bash)
# 永久生效(写入 .bashrc)
echo 'source <(kbcli completion bash)' >> ~/.bashrc
验证安装
安装完成后,可以通过以下方式验证 KubeBlocks 是否正常运行:
使用 kubectl 验证
kubectl -n kb-system get pods
预期输出应显示所有 KubeBlocks 组件 Pod 都处于 Running 状态。
使用 kbcli 验证
kbcli kubeblocks status
该命令会显示 KubeBlocks 的部署状态和各个组件的运行情况。
注意事项
安装和卸载必须使用相同的工具(Helm、kubectl 或 kbcli)
确保 kubectl、Helm 或 kbcli 已正确安装
安装前必须确保 Snapshot Controller 已正确部署
版本兼容性:kbcli 和 KubeBlocks 的主版本号应保持一致
结语
通过本文的指导,您应该已经成功在 Kubernetes 集群上部署了 KubeBlocks。KubeBlocks 提供了强大的数据库管理能力,接下来您可以开始探索如何用它来部署和管理各种数据库实例。如果在安装过程中遇到任何问题,可以参考官方文档或社区资源获取更多帮助。
使用kbctl安装Mysql
创建MySQL集群
# 列出 Kubeblocks 支持安装的组件及其可用版本(例如 MySQL、PostgreSQL 等数据库)
kbcli componentversion list
# 查看 MySQL 集群定义及其支持的版本、配置模板等详细信息
kbcli clusterdefinition describe mysql
# 创建 MySQL 集群 mycluster,使用默认版本(最新稳定版)
kbcli cluster create mysql mycluster
kbcli cluster create mycluster --mode=raftGroup # 建议使用这种模式(生产)
# 创建 MySQL 集群 mycluster-02,并指定版本为 5.7.44
kbcli cluster create mysql mycluster-02 --mode=raftGroup --version=5.7.44
主要参数解释
kbcli cluster create mysql --help
| 参数 | 含义 | 说明 |
|---|---|---|
--cpu |
CPU 核数 | 可选 0.5~64 |
--memory |
内存大小(Gi) | 可选 0.5~1000 |
--storage |
存储大小(Gi) | 可选 1~10000 |
--version |
MySQL 版本 | 可选值:[8.0.39, 8.0.38, 8.0.37, 8.0.36, 8.4.2, 8.4.1, 8.4.0, 5.7.44] |
--replicas |
副本数 | 可选 1~5 |
--topology |
拓扑类型 | semisync, semisync-proxysql, mgr, mgr-proxysql, orc, orc-proxysql |
--pod-anti-affinity |
Pod 反亲和 | Preferred 或 Required |
--node-labels |
节点选择器 | 指定要调度的节点标签 |
--tolerations |
容忍污点 | 用于节点调度 |
--tenancy |
资源分配策略 | SharedNode(共享节点)/ DedicatedNode(独占节点) |
--termination-policy |
删除策略 | DoNotTerminate(禁止删除)、Delete(删除)、WipeOut(删除并清理数据) |
--disable-exporter |
是否启用监控 | true/false |
--dry-run |
模拟执行 | client:只打印对象,不发送;server:提交但不持久化 |
--edit |
编辑资源 | 创建前可手动修改配置 |
-o, --output |
输出格式 | JSON 或 YAML |
--proxysql.* |
ProxySQL 相关 CPU/内存/副本数 | 当拓扑使用 ProxySQL 时设置 |
--storage-class |
PVC 使用的 StorageClass | 指定存储类型 |
--topology-keys |
拓扑亲和键 | 配合拓扑调度使用 |
额外参数
# 修改集群规格
$ kbcli cluster vscale mycluster --memory 2Gi--components mysql
# 修改 max connections 为500
$ kbcli cluster configure mycluster --set max_connections=500
# 交互式修改集群参数
$ kbcli cluster edit-config mycluster --config-spec=mysql-consensusset-config
指定StorageClass (必要条件)
创建 MySQL 集群时需要 PVC,如果集群中存在默认 StorageClass,会自动使用它进行绑定;
如果没有默认 StorageClass,可以使用以下命令手动指定或设置默认 SC。
[root@k8s-master1 kubeblocks]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage nfs-diy Retain Immediate true 17m
# 设置某个 StorageClass 为默认
kubectl patch storageclass nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
会多出default默认标识

查看集群架构
kbcli cluster describe mycluster

验证连接MySQL
# 查看创建的资源信息
[root@k8s-master1 kubeblocks]# kubectl get po
NAME READY STATUS RESTARTS AGE
mycluster-mysql-0 4/4 Running 0 26s
mycluster-mysql-1 4/4 Running 0 14s
前缀为集群名称

获取Mysql账号密码
[root@k8s-master1 kubeblocks]# kubectl get secret mycluster-mysql-account-root -n default -o yaml
apiVersion: v1
data:
password: NE95RzRWMTN1Mg==
username: cm9vdA==
kind: Secret
metadata:
creationTimestamp: "2025-09-04T13:38:27Z"
finalizers:
- component.kubeblocks.io/finalizer
labels:
app.kubernetes.io/instance: mycluster
app.kubernetes.io/managed-by: kubeblocks
apps.kubeblocks.io/component-name: mysql
apps.kubeblocks.io/system-account: root
name: mycluster-mysql-account-root
namespace: default
ownerReferences:
- apiVersion: apps.kubeblocks.io/v1
blockOwnerDeletion: true
controller: true
kind: Component
name: mycluster-mysql
uid: 92dda5a3-88c6-4e4b-9dc4-e3b831a5c5c4
resourceVersion: "71390"
uid: 96bb0445-bb30-43d2-b51f-c220b78e3d27
type: Opaque
# 进行base64解码
[root@k8s-master1 kubeblocks]# kubectl get secret mycluster-mysql-account-root -n default -o jsonpath="{.data.username}" | base64 --decode
root[root@k8s-master1 kubeblocks]# echo
[root@k8s-master1 kubeblocks]# kubectl get secret mycluster-mysql-account-root -n default -o jsonpath="{.data.password}" | base64 --decode
4OyG4V13u2[root@k8s-master1 kubeblocks]#
集群内部连接Mysql
[root@k8s-master1 kubeblocks]# kubectl exec -it mycluster-mysql-0 -- bash
bash-5.1# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.39 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
# 修改root密码
-- 修改 root 用户密码
ALTER USER 'root'@'%' IDENTIFIED BY '123';
-- 如果 root 只允许本地登录
ALTER USER 'root'@'localhost' IDENTIFIED BY '123';
-- 刷新权限
FLUSH PRIVILEGES;
# 创建test库并创建一张t1表
create database test;
use test;
CREATE TABLE t1 (
id INT PRIMARY KEY,
name VARCHAR(50)
);
# 这里插入中文需要带中文环境
kubectl exec -it mycluster-mysql-0 -- env LANG=C.UTF-8 bash
INSERT INTO t1 (id, name) VALUES (1, "张三");
部署minio
假设在集群外部部署了一个minio用于异地存储,我们可以把MySQL的备份数据存入minio
# 192.168.6.11
docker pull minio/minio
docker run -d --name minio --restart=always \
-p 9000:9000 -p 9090:9090 \
-e "MINIO_ROOT_USER=IT@Zhukang" \
-e "MINIO_ROOT_PASSWORD=IT@Zhukang" \
-v /data:/data \
minio/minio server /data \
--address ":9000" \
--console-address ":9090"

创建一个桶为MySQL用于测试备份数据

MySQL数据备份
创建备份仓库
# 创建备份仓库
kbcli backuprepo create my-repo \
--provider minio \
--endpoint http://192.168.6.11:9000 \
--bucket mysql \
--access-key-id IT@Zhukang \
--secret-access-key IT@Zhukang \
--default
Successfully create backup repo "my-repo".
my-repo # 备份仓库名称,自己定义的标识符,后续创建集群备份时用到。
--provider minio # 备份存储类型,这里指定使用 MinIO/S3 兼容存储。其他可能值:aws-s3、gcs、azure 等。
--endpoint http://192.168.6.11:9000 # MinIO 服务地址,注意必须带协议(http 或 https)。
--bucket mysql # MinIO 桶名称,备份数据会存储在这个桶里。
--access-key-id IT@Zhukang # MinIO 访问密钥 ID,相当于用户名,用于认证。
--secret-access-key IT@Zhukang # MinIO 密钥,相当于密码,用于认证。
--default # 指定这个仓库为默认备份仓库,当你在集群上开启自动备份但不指定仓库时,会使用这个仓库。
# 查看备份仓库repo, Ready代表正常
[root@k8s-master1 kubeblocks]# kbcli backuprepo list
NAME STATUS STORAGE-PROVIDER ACCESS-METHOD DEFAULT BACKUPS TOTAL-SIZE
my-repo Ready minio Tool true 0 0 B
备份集群
# 备份集群 (这条命令使用的是全量备份)
[root@k8s-master1 kubeblocks]# kbcli cluster backup mycluster --method xtrabackup
Backup backup-default-mycluster-20250904220747 created successfully, you can view the progress:
kbcli cluster list-backups --name=backup-default-mycluster-20250904220747 -n default
kbcli cluster backup # 对指定的 KubeBlocks 集群执行备份操作。
mycluster # 指定要备份的集群名称,这里是 mycluster。
--method xtrabackup # 指定备份方法。
# 查看备份的记录 (主要查看STATUS是否为Completed)
kbcli cluster list-backups -n default
再来到Minio查看MySQL桶里面已经有数据了

结合定时任务自动备份
kbcli cluster update mycluster --backup-enabled=true \
--backup-method=xtrabackup --backup-repo-name=my-repo \
--backup-retention-period=7d --backup-cron-expression="0 2 * * *"
cluster.apps.kubeblocks.io/mycluster updated
--backup-enabled指示是否启用计划备份。
--backup-method指定备份方法。您可以使用kbcli cluster describe-backup-policy mycluster命令查看支持的备份方法。
--backup-repo-name指定 BackupRepo 的名称。
--backup-retention-period指定备份的保留期,在示例中为 7 天。
--backup-cron-expression在 UTC 时区中使用 cron 表达式指定备份计划。表达式格式请参阅 cron。
启用计划备份后,执行以下命令以检查是否创建了 CronJob 对象:
kubectl get cronjob

还可以执行以下命令来查看群集信息,其中Data Protection:部分显示自动备份的配置细节。

从备份恢复集群
# 查看备份记录
kbcli cluster list-backups
# 从备份恢复集群
kbcli cluster restore myrestore --backup backup-default-mycluster-20231025174658
覆盖原集群恢复(风险高,慎用)
直接把现有的 mycluster 恢复到某个备份点。
命令类似:
kbcli cluster restore mycluster \
--backup backup-default-mycluster-20250904204029 \
-n default
⚠️ 这种方式会 清空原集群数据并替换成备份数据,测试环境可以用,生产慎用。
恢复到一个新集群(推荐测试用)
可以从备份生成一个新的集群,避免破坏原有集群:
kbcli cluster restore mycluster-restore \
--backup backup-default-mycluster-20250904204029 \
-n default
这样会新建一个名为 mycluster-restore 的数据库集群,数据内容来自刚才的备份。
查看恢复进度
恢复也是一个异步任务,可以通过:
kbcli cluster list-restores -n default
或者直接查看集群状态:
kbcli cluster list -n default
验证恢复结果
恢复完成后,你可以进入新集群,连上 MySQL 检查是否有你之前的数据:
kbcli cluster connect mycluster-restore -n default
然后在 mysql 里执行:
show databases;
检查数据是否和备份前一致。
⚠️ 建议:第一次先用 新集群恢复(mycluster-restore),确认流程 OK,再考虑是否要用覆盖恢复。
浙公网安备 33010602011771号