今日天气
  1. 博客/

K8S 使用 CronJob 备份 MySQL 数据至 MInIO

·527 字·2 分钟· ·
SRE backup mysql
Johny
作者
Johny
熟练的 云原生搬砖师
Table of Contents

说明
#

目前 K8S 已相当成熟,完全具备生产环境的落地应用。在各应用复杂的运行场景下,有时也会将 MySQL 这类有状态应用也部署至 K8S 中,但是部署后,如何保证其数据的安全性,却成了运维人员一个棘手的问题,本文将论述,如何使用 CronJob 将 MySQL 实例数据备份至MinIO S3存储中,来保证其数据安全性。


备份
#

下述 YAML 中所使用的镜像,我已整理至下述仓库中 。

CronJob 部署清单
#

更改下述 Secret 环境变量为你实际环境中所对应的。

  • MINIO_SERVER: Minio 实例地址

  • MINIO_ACCESS_KEY: MinIO 用户

  • MINIO_SECRET_KEY: MinIO 密码

  • MINIO_BUCKET: 存储桶 / 存放路径

  • MINIO_BUCKET
    

更改下述 ConfigMap 环境变量为你实际环境中所对应的

  • dbhost: mysql service 地址
  • all_databases: 是否备份所有数据库
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: mysqldump
spec:
  schedule: 0 4 * * *
  failedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 3
  suspend: false
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: mysqldump
            image: cdryzun/kube-mysqldump-tominio-cron:v0.1.0
            env:
            # Injecting NAME_SPACE using Downward API
              - name: MYSQL_ENV_NAME_SPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: ALL_DATABASES
                valueFrom:
                  configMapKeyRef:
                    name: mysqldump
                    key: all_databases
              - name: DB_HOST
                valueFrom:
                  configMapKeyRef:
                    name: mysqldump
                    key: dbhost
              - name: DB_USER
                value: root
              - name: DB_PASS
                valueFrom:
                  secretKeyRef:
                    name: mysql-server
                    key: mysql-root-password
              - name: MINIO_SERVER
                valueFrom:
                  secretKeyRef:
                    name: miniocreds
                    key: MINIO_SERVER
              - name: MINIO_ACCESS_KEY
                valueFrom:
                  secretKeyRef:
                    name: miniocreds
                    key: MINIO_ACCESS_KEY
              - name: MINIO_SECRET_KEY
                valueFrom:
                  secretKeyRef:
                    name: miniocreds
                    key: MINIO_SECRET_KEY
              - name: MINIO_BUCKET
                valueFrom:
                  secretKeyRef:
                    name: miniocreds
                    key: MINIO_BUCKET
            imagePullPolicy: Always
            volumeMounts:
              - mountPath: /mysqldump
                name: mysqldump
          volumes:
            - name: mysqldump
              emptyDir: {}
          restartPolicy: OnFailure
---
apiVersion: v1
data:
  dbhost: "mysql-server"
  all_databases: "true"
kind: ConfigMap
metadata:
  name: mysqldump
---
apiVersion: v1
kind: Secret
metadata:
  name: miniocreds
type: Opaque
stringData:
  MINIO_SERVER: http://oss.example.com:9000
  MINIO_ACCESS_KEY: root
  MINIO_SECRET_KEY: iexample
  MINIO_BUCKET: "mysql-backups/example-dev"

使用后效果
#

image-20230724165405908

image-20230724165656176


总结
#

使用上述方法就能将对应MySQL实例中所有数据进行备份了,实现方式也比较简单,感兴趣的朋友可以看一下项目的源码。如果有多个MySQL实例需要备份时,可以创建多个CronJob解决。后面有时间把基于 PVC 文件备份的同时也做实现一下。

相关文章

修复 SSH 免密无法连接
·296 字·1 分钟·
SRE linux sshd
Velero 备份迁移工具的安装
·279 字·1 分钟·
devops k8s Velero docker-compose backup
Linux 使用 LVM 来扩充分区
·143 字·1 分钟·
SRE linux lvm
Argocd Cli Usage Tips
·269 字·1 分钟·
devops argocd
记录一次 Nexus3 Pypi 私服 Blob Storage 异常的修复
·1234 字·3 分钟·
devops neuxs3 fix pypi jenkins pipeline
Git Docs
·307 字·1 分钟·
devops git