Verrazzano在Keycloak中存储用户登录信息。Keycloak使用MySQL作为后端来存储所有持久性数据。本文体验一下如何备份和恢复存储在MySQL中的数据。
在命名空间keycloak中创建了一个secret mysql-backup-secret
MySQL Operator需要一个secret来与S3兼容的对象存储进行通信,因此我们创建一个backup-secret.txt文件,其中有对象存储的凭证。
[default]
aws_access_key_id=<object store access key>
aws_secret_access_key=<object store secret key>
MySQL Operator需要创建存储桶的区域名称,所以我们创建一个backup-region.txt文件,其中包含区域信息。
[default]
region=us-east-1
在命名空间keycloak中,创建一个Kubernetes secret,例如mysql-backup-secret。
kubectl create secret generic -n <backup-namespace> <secret-name> --from-file=<key>=<full_path_to_creds_file> --from-file=<key>=<full_path_to_config_file>
示例,
kubectl create secret generic -n keycloak mysql-backup-secret --from-file=credentials=backup-secret.txt --from-file=config=backup-region.txt
要启动MySQL备份,请创建以下示例的自定义资源YAML文件,该文件使用Minio对象存储作为后端。Operator使用spec.backupProfile.dumpInstance.storage.s3.config中引用的secret,与Minio对象存储进行验证。
default
。kubectl apply -f - <<EOF
apiVersion: mysql.oracle.com/v2
kind: MySQLBackup
metadata:
name: mysql-backup
namespace: keycloak
spec:
clusterName: mysql
backupProfile:
name: mysqlOneTime
dumpInstance:
storage:
s3:
bucketName: backup-bucket
config: mysql-backup-secret
endpoint: http://minio.minio:9000
prefix: mysql-demo
profile: default
EOF
要从现有的备份中启动MySQL还原操作,你需要重新创建MySQL集群。使用下面的步骤来成功进行MySQL还原操作。
将MySQL Helm Charts中的值备份到一个文件mysql-values.yaml。
helm get values -n keycloak mysql > mysql-values.yaml
MySQL备份在对象存储中创建一个备份文件夹。获取MySQL备份创建的备份文件夹前缀名称。
kubectl get mysqlbackup -n keycloak <mysql-backup-name> -o jsonpath={.status.output}
示例,
kubectl get mysqlbackup -n keycloak mysql-backup -o jsonpath={.status.output}
mysql-backup-20230312-023532
通常情况下,MySQL Helm Charts存在于Verrazzano平台Operator内部。获取Charts到一个名为mysql-charts的本地目录。
mkdir mysql-charts
kubectl cp -n verrazzano-install \
$(kubectl get pod -n verrazzano-install -l app=verrazzano-platform-operator \
-o custom-columns=:metadata.name --no-headers):platform-operator/thirdparty/charts/mysql \
-c verrazzano-platform-operator mysql-charts/
从系统中删除MySQL pods和PVC。
helm delete mysql -n keycloak
kubectl delete pvc -n keycloak -l tier=mysql
现在你已经从系统中删除了MySQL,通过安装Helm Charts触发MySQL恢复操作。
helm install mysql mysql-charts \
--namespace keycloak \
--set initDB.dump.name=<dump-name> \
--set initDB.dumpOptions.loadUsers=true \
--set initDB.dump.s3.profile=default \
--set initDB.dump.s3.prefix=<prefixName/backup folder name> \
--set initDB.dump.s3.bucketName=<OCI bucket name> \
--set initDB.dump.s3.config=<Credential Name> \
--set initDB.dump.s3.endpoint=<OCI S3 endpoint> \
--values <mysql values file>
示例,
helm install mysql mysql-charts \
--namespace keycloak \
--set initDB.dump.name=alpha \
--set initDB.dump.s3.profile=default \
--set initDB.dump.s3.prefix=mysql-demo/mysql-backup-20230312-023532 \
--set initDB.dump.s3.bucketName=backup-bucket \
--set initDB.dump.s3.config=mysql-backup-secret \
--set initDB.dump.s3.endpoint=http://minio.minio:9000 \
--values mysql-values.yaml
执行还原命令后,等待MySQL集群上线。确保STATUS是ONLINE,ONLINE下的计数与INSTANCES相符。
kubectl get innodbclusters -n keycloak mysql
等待所有的MySQL pods处于RUNNING状态。
kubectl wait -n keycloak --for=condition=ready pod -l tier=mysql --timeout=600s
在这一点上,MySQL集群已经从备份中成功恢复了,同时还有之前被删除的PVC。
移除和恢复MySQL集群可能会导致Keycloak pods进入崩溃状态,因为MySQL在恢复操作期间会离线。Keycloak被设置为自我修复,在所有后端都可用后,将进入运行状态。你也可以选择通过使用以下命令强制Keycloak进入运行状态。
KEYCLOAK_REPLICAS=$(kubectl get sts -n keycloak keycloak -o custom-columns=:status.replicas --no-headers)
kubectl scale sts -n keycloak keycloak --replicas=0
kubectl scale sts -n keycloak keycloak --replicas=${KEYCLOAK_REPLICAS}
kubectl wait -n keycloak --for=condition=ready pod -l app.kubernetes.io/instance=keycloak -timeout=600s
完结!