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,再考虑是否要用覆盖恢复。

posted @ 2025-09-07 21:07  kennyy  阅读(30)  评论(0)    收藏  举报