k8s中etcd數據的備份

    etcd中存儲的數據分爲: flanned網絡數據和k8s的容器數據。

    image.png

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的命令快照備份數據

    image.png

    數據恢復

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章