介绍
更新过程是每个团队都应考虑的重要操作。但是,手动做可能会筋疲力尽。作为辛劳,您只需创建一个cronjob即可将备份并上传到所需的对象存储中。
本文说明了如何使用cronjob自动化数据库备份并将其上传到云S3。 Postgres已被视为数据库,但是您可以将其推广到您想要的任何其他数据库或数据类型。
步骤1:创建ConfigMap
要执行备份和上传,我们需要一个bash脚本。它应该首先通过oc login
命令登录云。然后获取所需的数据库POD名称。执行转储命令,将其拉动并通过rsync
命令下载。最后,它将其上传到AWS S3对象存储。
在运行脚本和转储之前,它会从用户中得到一个提示,您确定吗? >
所有凭据,例如 okd令牌或 postgres密码均以环境变量传递给应用程序。
通过将此bash脚本放在配置映射中,可以将其作为clonjob中的音量安装。请记住,用您的项目名称替换PROJECT_HERE
并根据您的项目规格自定义bash脚本中的变量。
kind: ConfigMap
apiVersion: v1
metadata:
name: bash-script
namespace: PROJECT_HERE
data:
backup.sh: >
#!/bin/bash
# This file provides a backup script for postgres
# Variables: Modify your variables according to the okd projects and database secrets
NAMESPACE=PROJECT_HERE
S3_URL=https://s3.mycompany.com
STATEFULSET_NAME=postgres
BACKUP_NAME=backup-$(date "+%F")
S3_BUCKET=databases-backup
# Exit the script anywhere faced the error
set -e
# Define the confirm option about user prompt (yes or no)
confirm=""
# Parse command-line options
while getopts "y" opt; do
case $opt in
y)
confirm="y"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
# Login to OKD
oc login ${S3_URL} --token=${OKD_TOKEN}
POD_NAME=$(oc get pods -n ${NAMESPACE} | grep ${STATEFULSET_NAME} | cut -d' '
-f1)
echo The backup of database in pod ${POD_NAME} will be dumped in ${BACKUP_NAME}
file.
DUMP_COMMAND='PGPASSWORD="'${POSTGRES_USER_PASSWORD}'" pg_dump -U
'${POSTGRES_USER}' '${POSTGRES_DB}' > /bitnami/postgresql/backup/'${BACKUP_NAME}
GZIP_COMMAND='gzip /bitnami/postgresql/backup/'${BACKUP_NAME}
REMOVE_COMMAND='rm /bitnami/postgresql/backup/'${BACKUP_NAME}.gz
# Prompt the user for confirmation if the -y option was not provided
if [[ $confirm != "y" ]]; then
read -r -p "Are you sure you want to proceed? [y/N] " response
case "$response" in
[yY][eE][sS] | [yY])
confirm="y"
;;
*)
echo "Aborted"
exit 0
;;
esac
fi
# Dump the backup and zip it
oc exec -n ${NAMESPACE} "${POD_NAME}" -- sh -c "${DUMP_COMMAND} && ${GZIP_COMMAND}"
echo Transfer it to current local folder
oc rsync -n ${NAMESPACE} ${POD_NAME}:/bitnami/postgresql/backup/ /backup-files
&&
oc exec -n ${NAMESPACE} "${POD_NAME}" -- sh -c "${REMOVE_COMMAND}"
# Send backup files to AWS S3
aws --endpoint-url "${S3_URL}" s3 sync /backup-files
s3://${S3_BUCKET}
步骤2:创建秘密
数据库,AWS和OC凭证应作为秘密保存。首先,我们将创建一个包含AWS CA捆绑包的秘密。下载捆绑包后,您可以从中制作一个秘密文件:
$ oc create secret -n PROJECT_HERE generic certs --from-file ca-bundle.crt
您应该用项目名称替换PROJECT_HERE
。
现在,让我们为其他凭据创建另一个秘密。考虑您应该用=/certs/ca-bundle.crt
指定AWS_CA_BUNDLE
kind: Secret
apiVersion: v1
metadata:
name: mysecret
namespace: PROJECT_HERE
data:
AWS_CA_BUNDLE:
OKD_TOKEN:
POSTGRES_USER_PASSWORD:
POSTGRES_USER:
POSTGRES_DB:
AWS_SECRET_ACCESS_KEY:
AWS_ACCESS_KEY_ID:
type: Opaque
步骤3:创建Cronjob
要创建Cronjob,我们需要一个能够运行OC和AWS命令的Docker映像。如果您倾向于自定义。
现在让我们创建Cronjob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: database-backup
namespace: PROJECT_HERE
spec:
schedule: 0 3 * * *
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: hamedkarbasi/aws-cli-oc:1.0.0
command: ["/bin/bash", "-c", "/backup-script/backup.sh -y"]
envFrom:
- secretRef:
name: mysecret
volumeMounts:
- name: script
mountPath: /backup-script/backup.sh
subPath: backup.sh
- name: certs
mountPath: /certs/ca-bundle.crt
subPath: ca-bundle.crt
- name: kube-dir
mountPath: /.kube
- name: backup-files
mountPath: /backup-files
volumes:
- name: script
configMap:
name: backup-script
defaultMode: 0777
- name: certs
secret:
secretName: certs
- name: kube-dir
emptyDir: {}
- name: backup-files
emptyDir: {}
restartPolicy: Never
再次,您应该用所需的运行率替换项目名称和计划参数。通过将所有清单放在名为backup
的文件夹中,我们可以将其应用于Kubernetes:
$ oc apply -f backup
此cronjob每天晚上3:00运行,将数据库丢弃并上传到AWS S3。
结论
总而言之,使用cronjob自动到AWS S3的数据库备份可以节省您的时间和精力,同时确保您的宝贵数据牢固地存储在云中。遵循本指南中概述的步骤,您可以轻松设置备份时间表,以满足您的需求,并将备份上传到AWS S3进行保管。请记住要定期测试备份,以确保可以在需要时恢复它们,并确保您的AWS凭据和权限安全以防止未经授权的访问。考虑到这些最佳实践,您可以放心地知道您的数据库备份是自动化的并牢固地存储在云中。