K8S Master節點災備與恢復 - ETCD


       上次搞了個Host文件Copy的方式來對Master節點進行備份和恢復,但是它個嚴重的問題就在備份前需要將etcd容器停止掉,否則會出現etcd恢復異常。今天我們就來看看另外一種不需要停止的備份方式etcd snapshot。

如何備份?

       ETCD不停機備份就需要使用etcdctl命令生成snapshot,我們就需要進入到ETCD容器當中去執行命令。備份需要定時執行,那么我們就通過K8S的CronJob定時任務。

1、構建CronJob,定義每3分鍾執行一次

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: etcd-backup
  namespace: kube-system
spec:
  schedule: "*/3 * * * *"
  jobTemplate:
    spec:

2、備份前我們先通過Init Pod做一些預處理操作

      注:這些操作更適合執行etcd備份后操作。但是etcd的鏡像采用的是閹割的bash系統,連最基的ls,data等命令都沒有,所以只能通過Init Pod在下次執行備份時處理上次備份遺留的問題。

template: spec: initContainers: - name: init image: busybox imagePullPolicy: IfNotPresent command: ["sh"] args: - "-c"
#保留最新的十個文件,刪除其它歷史備份
#如果目錄存在snapshot.db文件,則根據它的創建日期重命名(如:202011251831.db) - "cd /backups;ls -t | tail -n +11 | xargs rm -rf;file=$(ls -l snapshot.db --full-time | awk '{print $6,substr($7,0,5);}' | sed 's/[ :-]//g');if [ -n \"$file\" ]; then mv snapshot.db ${file}.db;fi;" volumeMounts: - mountPath: /backups name: backup

3、k8s master etcd是靜態pod形式運行,從/etc/kubernetes/manifests/etcd.yaml文件中找到k8s集群使用的etcd鏡像版本

          containers:
          - name: backup
            image: k8s.gcr.io/etcd:3.4.13-0
            imagePullPolicy: IfNotPresent
            env:
            - name: ETCDCTL_API
              value: "3

4、使用pod command執行shell,連接master節點etcd,並使用etcdctl執行備份

     這里備份名字固定命名用snapshot.db,下次備份時通過init pod來進行改名。網上很多文章中直接用date函數生成日期形式的備份文件名,那很可能是沒作用的,因為etcd采用的bash基礎鏡像已經刪除了date函數

            command: ["/bin/sh"]
            args: ["-c", "etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /backups/snapshot.db;"]

5、在備份etcd時需要使用到連接master etcd server的證書信息,和備份目錄,我們需要把Host目錄掛載進pod

            volumeMounts:
            - mountPath: /etc/kubernetes/pki/etcd
              name: etcd-certs
              readOnly: true
            - mountPath: /backups
              name: backup

6、為了可以使用127.0.0.1:2379訪問到etcd服務端,我們需要將Pod調度到master節點並且使用hostNetwork

          restartPolicy: OnFailure
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: "node-role.kubernetes.io/master"
                    operator: Exists
          tolerations:
          - effect: NoSchedule
            operator: Exists
          hostNetwork: true

7、定義volumeMounts

          volumes:
          - name: etcd-certs
            hostPath:
              path: /etc/kubernetes/pki/etcd
              type: DirectoryOrCreate
          - name: backup
            hostPath:
              path: /home/shendu/backups/etcd
              type: DirectoryOrCreate

如何恢復?

1、恢復/etc/kubernetes/pki/etcd/目錄下的證書信息

2、恢復備份至 /var/lib/etcd目錄

mkdir -p /var/lib/etcd
docker run --rm \
    -v '/home/shendu/backups/etcd:/backups' \
    -v '/var/lib/etcd:/var/lib/etcd' \
    --env ETCDCTL_API=3 \
    'k8s.gcr.io/etcd:3.4.13-0' \
    /bin/sh -c "etcdctl snapshot restore '/backups/202011271604.db' ; mv /default.etcd/member/ /var/lib/etcd/"

3、根據現有etcd構建master節點

kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd


 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM