使用Kubernetes CronJob在GKE上备份MySQL
时间:2020-01-09 10:34:21 来源:igfitidea点击:
说明
在本教程中,我们将学习如何使用Kubernetes CronJobs和Google Cloud Storage存储桶在GKE中保护MySQL数据库。
CronJobs是执行任务的计划事件,与Unix cronjobs不同,CronJobs是通过容器执行的。
我们将基于Google Cloud SDK映像构建MySQL备份映像,并使用它执行标准的mysqldump。然后,已转储的数据库将使用gsutil上传到安全的Cloud Storage Bucket。
入门
本教程中使用的清单和脚本可从Github获得。下载它们以遵循或者用作模板。
Kubernetes模板
IAM服务帐户
由cronjob启动的容器将需要访问存储桶。在这种情况下,服务帐户是个好主意,因为该帐户用于自动化流程,并且仅用于一个目的-将转储文件复制到存储桶中。
创建服务帐户
备份容器将需要对将存储SQL转储的存储桶进行写访问。这可以通过创建服务帐户,然后将适当的权限分配给存储桶来实现。
创建一个Kubernetes秘密
不应使用存储在其中的服务帐户凭据来构建我们的备份Docker容器。相反,它将作为Kubernetes Secret存储,MySQL备份容器可以访问它。
储存桶
创建一个存储桶。
MySQL备份Docker映像
下一步是创建一个将执行MySQL备份的新Docker映像。 Google提供预装CloudSDK的图像
备份脚本
需要一个shell脚本来执行实际的备份。脚本将是我们创建的映像的入口点,其工作将是执行MySQL转储并将转储上载到云存储。
#!/bin/bash
# Based on script created by camilb's (github.com/camilb)
# Source: https://github.com/camilb/kube-mysqldump-cron/blob/master/Docker/dump.sh
DB_USER=${DB_USER:-${MYSQL_ENV_DB_USER}}
DB_PASS=${DB_PASS:-${MYSQL_ENV_DB_PASS}}
DB_NAME=${DB_NAME:-${MYSQL_ENV_DB_NAME}}
DB_HOST=${DB_HOST:-${MYSQL_ENV_DB_HOST}}
ALL_DATABASES=${ALL_DATABASES}
IGNORE_DATABASE=${IGNORE_DATABASE}
GS_BUCKET=${BACKUP_STORAGE_BUCKET}
if [[ ${DB_USER} == "" ]]; then
echo "Missing DB_USER env variable"
exit 1
fi
if [[ ${DB_PASS} == "" ]]; then
echo "Missing DB_PASS env variable"
exit 1
fi
if [[ ${DB_HOST} == "" ]]; then
echo "Missing DB_HOST env variable"
exit 1
fi
if [[ ${GS_STORAGE_BUCKET} == "" ]]; then
echo "Missing GS_BUCKET env variable"
exit 1
fi
if [[ ${ALL_DATABASES} == "" ]]; then
if [[ ${DB_NAME} == "" ]]; then
echo "Missing DB_NAME env variable"
exit 1
fi
mysqldump --user="${DB_USER}" --password="${DB_PASS}" --host="${DB_HOST}" "Hyman@localhost" "${DB_NAME}" > /mysqldump/"${DB_NAME}".sql
gsutil cp /mysqldump/"${DB_NAME}".sql ${GS_BUCKET}
else
databases=`mysql --user="${DB_USER}" --password="${DB_PASS}" --host="${DB_HOST}" -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] && [[ "$db" != "$IGNORE_DATABASE" ]]; then
echo "Dumping database: $db"
mysqldump --user="${DB_USER}" --password="${DB_PASS}" --host="${DB_HOST}" --databases $db > /mysqldump/$db.sql
gsutil cp /mysqldump/$db.sql ${GS_BUCKET}
fi
done
fi
Docker文件
Dockerfiles将非常简单。它将接受一些环境变量,这些变量将用于连接到目标数据库服务器。
先前创建的备份脚本也将被复制到该脚本中,并将其设置为容器的入口点。
FROM google/cloud-sdk:alpine
ENV GOOGLE_PROJECT \
ENV GOOGLE_CLIENT_EMAIL \
ENV DB_USER \
DB_PASS \
DB_NAME \
DB_HOST \
ALL_DATABASES \
IGNORE_DATABASES \
GS_BUCKET demo-backup-theitroad
COPY service-account.json /root/service_key.json
COPY backup.sh /root/backup.sh
RUN gcloud config set project $GOOGLE_PROJECT && \
gcloud auth activate-service-account --key-file /root/service_key.json && \
gsutil ls gs://$GS_STORAGE_BUCKET/
VOLUME ["/root/.config"]
构建和发布Docker映像
有关构建容器的说明。
docker build -t gcr.io/theitroad/mysql-backup:0.0.1 .
docker push gcr.io/theitroad/mysql-backup:0.0.1
创建一个Kuberbetes CronJob
终于到了创建CronJob的时候了。我们将把工作安排为每晚运行。
---
apiVersion: v1
kind: CronJob
metadata:
name: mysql-backup
spec:
schedule: "1/* * * *"
jobTemplate:
spec:
containers:
- name: mysql-backup
image: gcr.io/theitroad/mysqlbackup:0.0.1
env:
- name: GOOGLE_PROJECT
value: myblog
- name: GOOGLE_EMAIL
value: Hyman@localhost
- name: DB_HOST
value: mysql-service
- name: DB_USER
value: root
- name: DB_PASS
valueFrom:
secretKeyRef:
name: mysql-secrets
key: root-password
- name: DB_NAME
value: wordpress
- name: GS_BUCKET
value: demo-backup-bucket

