说明
目前 K8S 已相当成熟,完全具备生产环境的落地应用。在各应用复杂的运行场景下,有时也会将 MySQL 这类有状态应用也部署至 K8S 中,但是部署后,如何保证其数据的安全性,却成了运维人员一个棘手的问题,本文将论述,如何使用 CronJob 将 MySQL 实例数据备份至MinIO S3
存储中,来保证其数据安全性。
备份
下述 YAML 中所使用的镜像,我已整理至下述仓库中 。
CronJob 部署清单
更改下述 Secret
环境变量为你实际环境中所对应的。
更改下述 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"
|
使用后效果
总结
使用上述方法就能将对应MySQL实例中所有数据进行备份了,实现方式也比较简单,感兴趣的朋友可以看一下项目的源码。如果有多个MySQL实例需要备份时,可以创建多个CronJob
解决。后面有时间把基于 PVC 文件备份的同时也做实现一下。