K8S Master节点灾备与恢复

       上次搞了个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



原文地址:https://www.cnblogs.com/lswweb/p/14048610.html