说明

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


备份

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

CronJob 部署清单

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

  • MINIO_SERVER: Minio 实例地址

  • MINIO_ACCESS_KEY: MinIO 用户

  • MINIO_SECRET_KEY: MinIO 密码

  • MINIO_BUCKET: 存储桶 / 存放路径

  • 1
    
    MINIO_BUCKET
    

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

  • dbhost: mysql service 地址
  • all_databases: 是否备份所有数据库
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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 文件备份的同时也做实现一下。