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