Kubernetes Master節點災備恢復操做指南---升級版

本文檔簡述了Kubernetes主節點災備恢復的相關步驟,供在發生k8s master崩潰時操做。html

就算是在k8s裏部署了etcd羣集, 主節點控制組件的高可用節點,災備恢復也是必需要實現的操做,才能造成完備的企業級服務方案。node

K8s集羣在master節點發生故障時,並不會影響已有的pod運行和服務開放,因此對服務是沒有影響的。故而咱們能夠在發生故障以後,挑選合適的時間窗口進行維護和恢復,能夠對外部客戶形成最低的影響。docker

嚴格來說,經過kubeadm安裝的k8s主節點包括兩大類的災備恢復,etcd數據存儲恢復和主節點控制組件恢復(包括但不限於kube-apiserver,kube-controller-manager,kube-scheduler,flannel,coreDns,dashboard)。api

因此本文檔也會相應的分紅兩個章節來進行描述。spa

以前的文檔是全手工操做,而這次升級版,參考了國外比較正規的做法,造成了天天自動備份的機制。主要參考URL:rest

https://labs.consol.de/kubernetes/2018/05/25/kubeadm-backup.html日誌

一,Etcd數據備份及恢復

etcd的數據默認會存放在咱們的命令工做目錄中,咱們發現數據所在的目錄,會被分爲兩個文件夾中:code

  • snap: 存放快照數據,etcd防止WAL文件過多而設置的快照,存儲etcd數據狀態。
  • wal: 存放預寫式日誌,最大的做用是記錄了整個數據變化的所有歷程。在etcd中,全部數據的修改在提交前,都要先寫入到WAL中。

A,單節點etcd數據備份

此方案備份etcd的數據時,爲了部署方便和兼容,使用了k8s安裝時自己的images做爲運行容器(k8s.gcr.io/etcd-amd64:3.1.12)。使用如下yaml文件,運行在k8s的master上,即天天備份etcd的數據了。server

etcd-backup.yamlhtm

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: backup
  namespace: kube-system
spec:
  # activeDeadlineSeconds: 100
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            # Same image as in /etc/kubernetes/manifests/etcd.yaml
            image: k8s.gcr.io/etcd-amd64:3.1.12
            env:
            - name: ETCDCTL_API
              value: "3"
            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 /backup/etcd-snapshot-$(date +%Y-%m-%d_%H:%M:%S_%Z).db"]
            volumeMounts:
            - mountPath: /etc/kubernetes/pki/etcd
              name: etcd-certs
              readOnly: true
            - mountPath: /backup
              name: backup
          restartPolicy: OnFailure
          nodeSelector:
            node-role.kubernetes.io/master: ""
          tolerations:
          - key: "node-role.kubernetes.io/master"
            effect: "NoSchedule"
          hostNetwork: true
          volumes:
          - name: etcd-certs
            hostPath:
              path: /etc/kubernetes/pki/etcd
              type: DirectoryOrCreate
          - name: backup
            hostPath:
              path: /tmp/etcd_backup/
              type: DirectoryOrCreate

從上面的yaml文件中,咱們能夠看到其實現思路:

1, 定義爲CronJob,這個pod天天凌晨會自動運行(schedule: "0 0 * * *")。

2, 此pod是運行在master上的(nodeSelector + tolerations 實現)。

3, 掛載了master機器上的/tmp/etcd_backup/做爲備份目錄,這個目錄生產環境最好掛載或及時cp到其它機器,防止機器自己的意外狀況。

4, 傳進的參數爲ETCDCTL_API版本3的命令進行備份。

Args參數中的"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 /backup/etcd-snapshot-$(date +%Y-%m-%d_%H:%M:%S_%Z).db"即爲備份命令。它按照時間的格式命名etcd的備份數據。

 

B,單節點etcd數據恢復

    若是已有備份數據,在只有etcd數據損壞的下,可根據如下步驟進行恢復。

1, 將/etc/kubernetes/manifests/ kube-apiserver.yaml文件裏的鏡像版本更改,中止kube-api server服務。

2, 將/etc/kubernetes/manifests/ etcd.yaml文件裏的鏡像版本更改,中止etcd server服務。

3, 運行以下命令,將損壞的數據文件移至其它地方。

      mv /var/lib/etcd/* /tmp/

4, 運行如下命令,以臨時docker運行的方式,將數據從備份裏恢復到/var/lib/etcd/。

    docker run --rm \

    -v '/tmp:/backup' \

    -v '/var/lib/etcd:/var/lib/etcd' \

    --env ETCDCTL_API=3 \

    'k8s.gcr.io/etcd-amd64:3.1.12' \

    /bin/sh -c "etcdctl snapshot restore '/backup/etcd-snapshot-xxx_UTC.db' ; mv /default.etcd/member/ /var/lib/etcd/"

[上面的命令中,假定咱們已將待還原數據放置於/tmp/目錄下]

5, 改回/etc/kubernetes/manifests/kube-apiserver.yaml文件裏的鏡像版本,恢復etcd server服務。

6, 改回/etc/kubernetes/manifests/etcd.yaml文件裏的鏡像版本,恢復kube-api server服務。

二,Master節點控制組件的備份及恢復

通常來講,若是master節點須要備份恢復,那除了誤操做和刪除,極可能就是整個機器已出現了故障,故而可能須要同時進行etcd數據的恢復。

而在恢復時,有個前提條件,就是在待恢復的機器上,機器名稱和ip地址須要與崩潰前的主節點配置完成同樣,由於這個配置是寫進了etcd數據存儲當中的。

A,主節點數據備份

主節點數據的備份包括三個部分:

1,/etc/kubernetes/目錄下的全部文件(證書,manifest文件)

2,用戶主目錄下.kube/config文件(kubectl鏈接認證)

3,/var/lib/kubelet/目錄下全部文件(plugins容器鏈接認證)

[最好這一步,也做成cronjob的yaml,天天自動運行]

k8s-master-backup.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: k8s-master-backup
  namespace: kube-system
spec:
  # activeDeadlineSeconds: 100
  schedule: "5 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: k8s-master-backup
            image: 3rd_part/alpine:alpine-3.8_glibc-2.28
            command: ["/bin/sh"]
            args: ["-c", "tar -zcvf /backup/k8s-master-$(ifconfig eth0 | grep 'inet addr:' | awk '{print $2}' | cut -c 6-)-$(date +%Y-%m-%d_%H:%M:%S_%Z).tar.gz /kubernetes /kubelet"]
            volumeMounts:
            - mountPath: /backup
              name: backup
            - mountPath: /kubernetes
              name: kubernetes
            - mountPath: /kubelet
              name: kubelet
          restartPolicy: OnFailure
          nodeSelector:
            node-role.kubernetes.io/master: ""
          tolerations:
          - key: "node-role.kubernetes.io/master"
            effect: "NoSchedule"
          hostNetwork: true
          volumes:
          - name: backup
            hostPath:
              path: /tmp/k8s_master_backup/
              type: DirectoryOrCreate
          - name: kubernetes
            hostPath:
              path: /etc/kubernetes/
              type: DirectoryOrCreate
          - name: kubelet
            hostPath:
              path: /var/lib/kubelet/
              type: DirectoryOrCreate

代碼解釋:

1, 經過hostPath方式掛載了/etc/kubernetes目錄

2, 以hostPath方式掛載了/var/lib/kubelet目錄

3, 以hostNetwork: true方式運行,能讀取主機IP地址。

4, 以nodeSelector方式,運行於k8s master節點。

5, Backup目錄默認掛載於宿主機/tmp/k8s_master_backup/,也須要及時保持到其它機器。

B,主節點組件恢復

    主節點組件的恢復可按如下步驟進行:

        1,按以前的安裝腳本進行全新安裝(kubeadm reset,iptables –X…)

        2,恢復etcd數據(參見第一章節操做)。

        3,將以前備份的兩個目錄依次還原(.kube/config文件不用還原,根據第4步的提示,還須要先刪除/etc/kubernetes/manifest/目錄下的文件,及/var/lib/kubelet/pki/目錄下的文件)。

        4,運行以下命令,從新安裝k8s master節點,並使用之前認證和數據。

    kubeadm init  \

    --pod-network-cidr=10.244.0.0/16 \

    --kubernetes-version=${K8S_VERSION} \

    --feature-gates=CoreDNS=true \

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

        5,一杯咖啡,稍等片刻,待全部組件啓動成功後,根據輸出提示,運行以下兩條命令,將新的config文件cp到指定位置,進行驗證。

             mkdir -p $HOME/.kube

             cp -f /etc/kubernetes/admin.conf $HOME/.kube/config

相關文章
相關標籤/搜索