• 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


    
    
  • 相关阅读:
    linux uniq 命令实用手册
    linux sort 命令实用手册
    linux awk 命令实用手册
    如何高效使用vim
    15个有趣好玩的linux shell 命令
    一篇文章带你编写10种语言HelloWorld
    如何用hugo 搭建博客
    c++中的exit()
    枚举数据类型C++
    常见的字符测试函数
  • 原文地址:https://www.cnblogs.com/lswweb/p/14048610.html
Copyright © 2020-2023  润新知