zoukankan      html  css  js  c++  java
  • Kubernetes etcd灾备与节点问题处理

    前言:

      k8s集群的灾备与恢复基于etcd的灾备与恢复,etcd的数据默认会存放在命令的工作目录(即master的/var/lib/etcd/)中,数据所在的目录,会被分为两个文件夹snap与wal:

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

      单节点etcd数据备份和恢复基于数据文件的备份,Kubeadm的默认安装时,将etcd的数据以文件形式存储在宿主机的/var/lib/etcd/目录,将此目录下的文件定期备份起来,etcd的数据出现问题,需要恢复时,直接将文件还原到此目录下,新库加载文件,就实现了单节点的etcd数据库的重建。

    一、etcd的备份:

    在做etcd单点备份之前,需要注意两个问题:

    • 如果etcd容器正在启动,是不能覆盖的,这时只需要将etcd的manifest文件[/etc/kubernetes/manifests/etcd.yaml]里的etcd版本号更改一下,然后用docker stop命令停止etcd容器,就不会自动重启了。数据还原后,将etcd版本再回到正确的版本,kubelet服务就会自动将etcd容器重启起来。
    • etcd 目前最新的版本的 v3.1.1,但它的 API 有 v3 和 v2 之分,使用 v3 备份数据时存在 v2 的数据则不影响恢复,若使用 v2 备份数据时存在 v3 的数据则恢复失败。(简单的来说就是不能用低版本数据备份恢复在高版本服务器上
    查看API版本的方法:
    docker exec -it <容器id> sh
    
    etcdctl --version
    
    etcdctl version: 3.0.4
    
    API version: 2

     

    备份实例:

    cp /var/lib/etcd/ <backup file>

     恢复实例:

    cp etcd /var/lib/ (master节点/var/lib/etcd与etcd容器的/varlib/etcd为映射关系)
    
    修改/etc/kubernetes/manifests/etcd.yaml中image项(随便修改一个数字,稍后要改回来)
    
    使用docker ps | grep -v pause | grep etcd 命令查看etcd容器,etcd容器消失后将image项改回来
    
    稍等片刻kubelet就会将etcd服务启动
    
    使用docker ps | grep -v pause | grep etcd 命令便可查看到新etcd容器

    二、kubernetes生产环境灾备场景:


    生产环境中的k8s集群可能出现的问题分以下两种情况:

    •  node节点出现问题
    •  master节点出现问题

    这两种情况的解决办法如下:

    node节点问题:

      node节点出现问题一般不会影响到集群的对外服务,处理node节点崩溃相对比较简单,只需创建一个新节点并将其添加到集群中。加入集群步骤如下:(附:如果需要将老node加入新的cluser,则需要在node上执行kubeadm reset后,再重新加入)

    生成token
    
    kubeadm token create
    
    查看ca的hash编码
    
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    
    然后加入集群
    
    kubeadm join 192.168.10.11:6443 --token yhns57.4s3y2yll21ew8mta 
    --discovery-token-ca-cert-hash sha256:ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a

     

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

    master节点问题:

    k8s集群在master节点发生故障时,不会影响已有的pod运行和服务开放,所以对服务没有影响,master节点的重建需要etcd数据库的重建和master与k8s集群的重置,找到合适的机会重置master即可。

    重置master节点需要备份文件,需要备份的文件有:

    etcd数据库备份:
    /etc/kubernetes/目录下的所有文件(证书,manifest文件)

    • admin.conf
    • controller-manager.conf
    • kubelet.conf
    • manifests
    • pki
    • scheduler.conf

     用户主目录下.kube/config文件(kubectl连接认证)
     /var/lib/kubelet/目录下所有文件(plugins容器连接认证)

    • config.yaml
    • device-plugins
    • pki
    • plugins
    • pod-resources
    • cpu_manager_state
    • kubeadm-flags.env
    • plugin-containers
    • plugins_registry
    • pods

    修复步骤:

    重置master

    kubeadm reset
    iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    
    恢复etcd数据
    
    将之前备份的/etc/kubernetes/与/var/lib/kubelet/目录下的文件依次还原。
    
    tar -zxvf <back file> -C /etc/kubernetes/
    tar -zxvf <back file> -C /var/lib/kubelet/
    
    
     删除/etc/kubernetes/manifest/目录下的所有文件
    
    
    rm -rf /etc/kubernetes/manifest/*
    
    初始化集群
    
    kubeadm init 
    --pod-network-cidr=10.244.0.0/16 
    --kubernetes-version v1.13.3 
    --image-repository registry.aliyuncs.com/google_containers 
    --ignore-preflight-errors=DirAvailable--var-lib-etcd
    
    
    创建.kube目录与config文件
    
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
    

     新机器使用备份重建master:

    1.安装好与之前备份版本相同的master.

    2.关闭kublet服务(10250端口).

    3.根据备份恢复/etc/kubernetes/与/var/lib/kubelet/和/var/lib/etcd目录

    4.开启kubelet服务,kubelet服务就会将容器启动。

    5.检验集群回复情况。

    三、当集群不可用:

      如果是整个集群的崩溃的话,需要做的工作就是重建集群,当然,服务肯定会中断,恢复的方法是重建master并恢复etcd数据库,新建node节点并加入该master集群,新的pod就会自动建立,因为我们用的是etcd单点,且是低版本v2API,所以恢复etcd数据库还是比较简单的(十分钟),这样决定服务中断时间的就是master和node的重建。数据损失取决于etcd备份的时间差。

    参考链接:

    https://blog.csdn.net/weixin_43046724/article/details/103504800

  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/xiaoyuxixi/p/12612452.html
Copyright © 2011-2022 走看看