• Etcd集群备份及容灾恢复


    Etcd集群备份及容灾恢复

    在部署etcd集群时,建议使用基数个etcd实例,这样至少可以保证集群有(N-1)/2个实例是可以正常提供服务的。但是如果超过了(N-1)/2个实例故障。就需要使用备份的etcd数据对集群进行容灾恢复。

    在我们生产环境部署的etcd集群是5节点,3个节点是本地sata盘,2个节点是ceph盘。本想使用这种方式为数据做HA的。但是由于ceph磁盘的IO很高(至少10ms以上),经常导致集群不稳定(IO满导致机器假死,etcd实例还存活,但是网络不通)。所以后期直接全部切换到本地sata盘。

    etcd 证书制作

    由于v3版本的etcd证书是基于IP的,所以每次新增etcd节点都需要重新制作证书。 详情https://github.com/cloudflare/cfssl

    备份etcd数据

    只需要在单节点etcd上执行下面的命令就可以对etcd进行数据备份。我们是每两个小时备份一次数据,并上传到S3上,并保留最近两天的数据。

    # mkdir -p /var/lib/etcd_backup/
    # ETCDCTL_API=3 etcdctl snapshot  save /var/lib/etcd_backup/etcd_$(date "+%Y%m%d%H%M%S").db

    恢复etcd数据(集群不可用,灾难恢复)

    一、local恢复

    1、首先需要停止master节点的kube-apiserver服务

    # systemctl stop kube-apiserver

    确保kube-apiserver已经停止了,执行下列命令返回值为0

    # ps -ef|grep kube-api|grep -v grep |wc -l
    0

    2、停掉集群中的所有etcd服务

    # systemctl stop etcd

    确保所有etcd节点停止成功

    # ps -ef|grep etcd|grep -v etcd|wc -l
    0

    3、移除所有etcd服务实例的数据目录


    # mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd_bak
     
    # rm -f /var/lib/etcd/default.etcd_bak     // 可删除、可不删除,建议保留

    4、拷贝备份好的tar包至所有etcd节点

     
    mkdir /var/lib/etcd_backup                           // 若没有,创建etcd_backup目录;若有,则不用创建
    cp $BACKUP_FILE_NAME.tar /var/lib/etcd_backup       // 拷贝tar包至etcd_backup目录
    cd /var/lib/etcd_backup                              // 进入/var/lib/etcd_backup目录
    tar -xzvf $BACKUP_FILE_NAME.tar                     // 解压备份的tar包

    5、执行恢复命令,所有etcd节点依次执行

    etcdctl snapshot restore /var/lib/etcd_backup/$BACKUP_FILE_NAME/etcd_snapshot.db 
    --cacert=$ETCD_TRUSTED_CA_FILE 
    --cert=$ETCD_CERT_FILE 
    --key=$ETCD_KEY_FILE 
    --name $ETCD_NAME 
    --initial-cluster $ETCD_INITIAL_CLUSTER 
    --initial-advertise-peer-urls $ETCD_INITIAL_ADVERTISE_PEER_URLS 
    --data-dir=/var/lib/etcd/default.etcd

    备注 :vim /etc/etcd/etcd.conf,查看配置信息,以及所需字段:ETCD_TRUSTED_CA_FILE、ETCD_CERT_FILE、ETCD_KEY_FILE、ETCD_NAME、ETCD_INITIAL_CLUSTER、ETCD_INITIAL_ADVERTISE_PEER_URLS

    6、修改etcd数据目录权限

    chown -R etcd:etcd /var/lib/etcd/default.etcd;chmod -R 700 /var/lib/etcd/default.etcd

    7、同时启动etcd集群的所有etcd实例

    # systemctl start etcd

    8、检查所有节点etcd健康状态

    HOST_1=10.243.xxx.xxx
    HOST_2=10.243.xxx.xxx
    HOST_3=10.243.xxx.xxx
    ETCD_ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
     
    etcdctl 
    -w table --cacert=/etc/kubernetes/ssl/ca.pem 
    --cert=/etc/kubernetes/ssl/etcd.pem 
    --key=/etc/kubernetes/ssl/etcd-key.pem 
    --endpoints=${ETCD_ENDPOINTS} endpoint health

    9、启动master节点的所有kube-apiserver服务

     
    # systemctl start kube-apiserver
    # systemctl status kube-apiserver

    摘除etcd节点

    向我们遇到的问题,需要将ceph节点的机器换成本地sata盘的机器,就需要先将部署在ceph上的etcd实例从集群中先摘除掉,然后在增加新的etcd实例到集群中。

    1.查看etcd集群member信息

    #etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member list

    2.根据member信息移除具体的etcd实例

    #etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member remove <member_id>

    3.停止etcd集群中被移除的etcd实例

    # systemctl stop etcd
    # yum remove -y etcd-xxxx

    4.查看etcd实例是否从集群中被移除

    #etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member list

    新增etcd节点

    在已经存在的etcd节点上执行如下命令,增加新的etcd节点到集群中。

    # etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member add <etcd_name> http://<etcd_node_address>:2380
    ETCD_NAME=etcd01
    ETCD_INITIAL_CLUSTER="etcd01=http://ip1:2380,etcd02=http://ip2:2380,etcd03=http://ip3:2380,etcd04=http://ip4:2380,etcd05=http://ip5:2380"
    ETCD_INITIAL_CLUSTER_STATE="existing"

    注意:

    • etcd_name: etcd.conf配置文件中ETCD_NAME内容

    • etdc_node_address: etcd.conf配置文件中的ETCD_LISTEN_PEER_URLS内容

    此时新的etcd节点已经被加到了现有的etcd集群。修改新增加的etcd节点的配置文件/etc/etcd/etcd.conf, 将ETCD_INITIAL_CLUSTER修改成上面输出的内容,并增加相关的配置。

    启动新的etcd节点:

    # systemctl start etcd

    并对已经存在的etcd节点的配置项ETCD_INITIAL_CLUSTER增加<new_etcd_node_name>=http://<new_etcd_node_address>:2380参数。并“同时”重启所有的etcd。

    更新etcd节点

    ETCDCTL_API=3 etcdctl member update  <member-ID> http://<etcd_node_address_ip>:2380

    参考

    https://www.maideliang.com/index.php/archives/25/

    https://alexstocks.github.io/html/etcd.html

  • 相关阅读:
    【分布计算环境学习笔记】4 Enterprise Java Bean
    超详细的秒杀架构设计,运维,了解一下【转】
    Redis的监控指标【转】
    Windows netstat 查看端口、进程占用 查看进程路径
    wireshark抓包新手使用教程【转】
    关于设置sftp 指定端口【转】
    简单聊一聊Ansible自动化运维【转】
    tomcat启动报错SEVERE: Exception loading sessions from persistent storage【转】
    彻底搞懂 Kubernetes 的底层网络,看这几张图就够了【转】
    Java设计模式之(五)——代理模式
  • 原文地址:https://www.cnblogs.com/lizhewei/p/12938683.html
Copyright © 2020-2023  润新知