跳到主要内容

配置 BackupPolicy

配置加密密钥

为了确保恢复的集群能够正常访问,KubeBlocks 在备份集群时会将集群的连接密码加密,并将其安全地存储在 Backup 对象的 Annotation 中。因此,为了保障您的数据安全,强烈建议谨慎分配备份对象的 Get/List 权限,并在安装或升级 KubeBlocks 时,务必指定加密密钥。这些措施将有助于确保你的数据得到妥善保护。

KubeBlocks v0.9.0 版本集成了 datasafed 的数据加密功能,目前已支持 AES-128-CFBAES-192-CFBAES-256-CFB 等加密算法。在写入存储之前,备份数据会被加密。您的加密密钥不仅可以用于加密连接密码,还可以备份数据。用户可以根据实际需要,直接引用已有的 secret 对象,或给数据库集群创建不同的密钥,从而进行备份加密。

引用已有的 key

如果 Secret 对象已存在,您可以选择直接引用,而无需设置 dataProtection.encryptionKey。KubeBlocks 提供了快速引用已有 encryptionKey 进行加密的方式。

假设已经有一个名为 dp-encryption-key 的 Secret,其中包含一个名为 encryptionKey 的密钥。例如,通过以下命令创建了一个密钥:

kubectl create secret generic dp-encryption-key \
--from-literal=encryptionKey='S!B\*d$zDsb='

您可以在安装或升级 KubeBlocks 时引用该密钥。

helm install kubeblocks kubeblocks/kubeblocks --namespace kb-system --create-namespace 
--set dataProtection.encryptionKeySecretKeyRef.name="dp-encryption-key" \
--set dataProtection.encryptionKeySecretKeyRef.key="encryptionKey"

创建新的 key

如果无需默认开启备份加密,或者需要使用独立的 encryptionKey,您可以按照以下步骤创建一个 Secret 对象,手动开启备份加密。

  1. 创建 Secret,用于存储加密密钥。

    kubectl create secret generic backup-encryption \
    --from-literal=secretKey='your secret key'
  2. 修改 BackupPolicy,开启备份加密。此处需要引用之前创建的密钥:

    kubectl --type merge patch backuppolicy mysqlcluster-mysql-backup-policy \
    -p '{"spec":{"encryptionConfig":{"algorithm":"AES-256-CFB","passPhraseSecretKeyRef":{"name":"backup-encryption","key":"secretKey"}}}}'

配置完成,可照常执行备份和恢复操作。

危险

请不要修改或删除在第一步创建的 Secret,否则将来可能无法解密备份。

默认情况下,encryptionKey 仅用于加密连接密码。如果您想用它加密备份数据,请在上述命令中添加 --set dataProtection.enableBackupEncryption=true。然后,所有新建的数据库集群都会默认开启备份加密。

创建集群

准备一个集群,用于后续测试备份恢复功能。本文创建了一个名为 mycluster 的 ApeCloud MySQL 集群,具体操作可参考创建 ApeCloud MySQL 集群

cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: default
spec:
clusterDefinitionRef: apecloud-mysql
clusterVersionRef: ac-mysql-8.0.30
terminationPolicy: Delete
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
tolerations:
- key: kb-data
operator: Equal
value: 'true'
effect: NoSchedule
componentSpecs:
- name: mysql
componentDefRef: mysql
enabledLogs:
- error
- general
- slow
disableExporter: true
replicas: 3
serviceAccountName: kb-acmysql-cluster
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF

如无特殊设置,所有备份都会保存在全局默认仓库中,可以执行如下命令查看所有 BackupRepo,其中 DEFAULT 字段为 true,表示该 BackupRepo 为默认 BackupRepo。

# 查看 BackupRepo
kubectl get backuprepo

查看 BackupPolicy

使用 KubeBlocks 创建数据库集群后,对于支持备份的数据库,会自动为其创建一个备份策略(BackupPolicy),可以执行如下命令查看集群的备份策略:

kubectl get backuppolicy | grep mycluster
>
mycluster-mysql-backup-policy Available 35m
mycluster-mysql-backup-policy-hscale Available 35m

备份策略中包含了该集群支持的备份方法,执行以下命令进行查看备份方法:

kubectl get backuppolicy mycluster-mysql-backup-policy -o yaml

对于 MySQL 集群而言,默认支持两种备份方法:xtrabackupvolume-snapshot,前者使用备份工具 xtrabackup 将 MySQL 数据备份至对象存储中;后者则使用云存储的卷快照能力,通过快照方式对数据进行备份。创建备份时,可以指定要使用哪种备份方法进行备份。