一、 前言

本文档简述了Kubernetes主节点及node灾备恢复的相关步骤,供在发生k8s master崩溃时操作。

就算是在k8s里部署了etcd群集, 主节点控制组件的高可用节点,灾备恢复也是必须要实现的操作,才能形成完备的企业级服务方案。

K8s集群在master节点发生故障时,并不会影响已有的pod运行和服务开放,所以对服务是没有影响的。故而我们可以在发生故障之后,挑选合适的时间窗口进行维护和恢复,可以对外部客户造成最低的影响。

严格来讲,通过kubeadm安装的k8s主节点包括三大类的灾备恢复,证书的备份恢复,etcd数据存储恢复和主节点控制组件恢复(包括但不限于kube-apiserver,kube-controller-manager,kube-scheduler,flannel,coreDns,dashboard)。

参考链接  https://labs.consol.de/kubernetes/2018/05/25/kubeadm-backup.html

二、node节点发生崩溃

处理node节点崩溃相对比较简单,当一个节点发生关机,停电等意外情况时,主节点将检测到node节点的不可用并将工作负载重新调度到其他节点。要重新到所需的节点数量,只需创建一个新节点并

将其添加到集群中。为了向现有集群添加新节点,首先需要使用kubeadm(kubeadm token create --print-join-command)在主机上创建令牌,然后在新节点上使用该令牌使用kubeadm连接加入集群。

重新加入集群以后,master就会根据负载均衡策略,把负载高的节点上的pod调度到该新node,重新达到平衡

三、master节点发生崩溃

一般来说,如果master节点需要备份恢复,那除了误操作和删除,很可能就是整个机器已出现了故障,故而可能需要同时进行etcd数据的恢复。

而在恢复时,有个前提条件,就是在待恢复的机器上,机器名称和ip地址需要与崩溃前的主节点配置完成一样,因为这个配置是写进了etcd数据存储当中的。

master的灾备恢复主要分为三大块:

3.1 证书的备份与恢复

      证书是k8s里面组件间通信认证的关键所在,所以必须要备份一份,因为证书在集群初始化时就已经确定了,所以只需要备份一次

      主要把根证书备份到glusterfs或者nfs即可,主节点数据的备份包括三个部分:   

           1,/etc/kubernetes/目录下的所有文件(证书,manifest文件)

           2,用户主目录下.kube/config文件(kubectl连接认证)

           3,/var/lib/kubelet/目录下所有文件(plugins容器连接认证)

       恢复时,把上面的对应文件夹中的文件,拷贝到恢复后机器的对应的目录中去

 3.2 etcd的备份与恢复

      3.2.1 etcd的数据默认会存放在我们的命令工作目录中,我们发现数据所在的目录,会被分为两个文件夹中:

  • snap: 存放快照数据,etcd防止WAL文件过多而设置的快照,存储etcd数据状态。
  • wal: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中。

      3.2.2 定时任务脚本备份

      etcd的恢复,有赖于etcd的数据备份,因为etcd里面的数据实时都在有写入和查询,所以如果master奔溃,为了减少线上环境的影响,理想情况下我们需要对etcd进行一个实时的备份,但是备份也需

      要时间,再考虑到磁盘和性能等方面,采用定时的备份,即每天的每个小时的0分,10分,20分,30分,40分, 50分来备份etcd数据,这样如果发生奔溃,顶多影响十分钟的的业务。

      etcd的具体备份和恢复:

      3.2.3 glusterfs或者nfs挂载

      采用glusterfs来挂载etcd的数据目录(这种是接近实时的备份数据,未尝试)

3.3 组件的恢复

        主节点组件的恢复可按以下步骤进行:

        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