etcd中存储的数据分为: flanned网络数据和k8s的容器数据。
1.直接备份etcd的数据目录(一般用于单节点)
etcd的数据默认会存放在我们的命令工作目录中,我们发现数据所在的目录,会被分为两个文件夹中:
snap: 存放快照数据,etcd防止WAL文件过多而设置的快照,存储etcd数据状态。
wal: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中。
一般etcd组件的数据目录在/var/lib/etcd下,可以直接打包该目录下的文件,
对于多节点的etcd服务,不能使用直接备份和恢复目录文件的方法。
备份之前先使用docker stop停止相应的服务,然后再启动即可。
如果停止etcd服务,备份过程中服务会中断。
缺省配置情况下,每隔10000次改变,etcd将会产生一个snap。
如果只备份/var/lib/etcd/member/snap下的文件,不需要停止服务
2.使用etcd的命令快照备份数据
数据恢复
etcdctl snapshot restore backup.db --data-dir=/var/lib/etcd
3.使用kubernetes的cronjob实现定期自动化备份。
这里使用k8s提供的定时任务来执行备份任务,定时任务的pod要和etcd的pod要在同一个node上面(使用nodeAffinity)。
yml文件(未验证)
apiVersion: batch/v2alpha1kind: CronJobmetadata: name: etcd-disaster-recovery namespace: cronspec: schedule: "0 22 * * *" jobTemplate: spec: template: metadata: labels: app: etcd-disaster-recovery spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/role operator: In values: - master containers: - name: etcd image: coreos/etcd:v3.0.17 command: - sh - -c - "export ETCDCTL_API=3; \ etcdctl --endpoints $ENDPOINT snapshot save /snapshot/$(date +%Y%m%d_%H%M%S)_snapshot.db; \ echo etcd backup sucess" env: - name: ENDPOINT value: "127.0.0.1:2379" volumeMounts: - mountPath: "/snapshot" name: snapshot subPath: data/etcd-snapshot - mountPath: /etc/localtime name: lt-config - mountPath: /etc/timezone name: tz-config restartPolicy: OnFailure volumes: - name: snapshot persistentVolumeClaim: claimName: cron-nas - name: lt-config hostPath: path: /etc/localtime - name: tz-config hostPath: path: /etc/timezone hostNetwork: true