如何使用Cronjob安排数据库备份并上传到AWS S3
#aws #database #kubernetes #自动化

介绍

更新过程是每个团队都应考虑的重要操作。但是,手动做可能会筋疲力尽。作为辛劳,您只需创建一个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凭据和权限安全以防止未经授权的访问。考虑到这些最佳实践,您可以放心地知道您的数据库备份是自动化的并牢固地存储在云中。