• 使用 Etcd 快照文件恢复 Etcd 数据:应对单节点及高可用集群情况


    1、概述

      在 Kubernetes 集群中,所有操作的资源数据都存储在 Etcd 数据库上。为了确保在节点故障、集群迁移或其他异常情况下能够尽快恢复集群数据,我们需要定期对 Etcd 数据进行容灾备份操作。

      在 Kubernetes 集群中,可以非常方便的针对 Etcd 数据进行备份,通常,只需在一个节点上对 Etcd 进行快照,即可完成数据备份。快照文件包含了所有 Kubernetes 的状态和关键信息。有了 Etcd 集群数据的备份,即使在灾难性场景下(如丢失所有控制平面节点),也能够快速恢复 Kubernetes 集群。

    注意:您可以参考博文《定时备份etcd数据》,详细了解 Etcd 数据备份的步骤。即便是高可用 Etcd 集群,只需要在一个节点上进行 Etcd 数据备份即可。然而,为了预防节点故障,强烈建议在所有 Etcd 节点上进行数据备份,并且建议定期将备份的 Etcd 快照数据传输到专门的数据存储服务器进行保存。

    2、使用 Etcd 快照文件恢复 Etcd 数据实战

    2.1 单节点恢复

    描述: 当单节点资源清单数据丢失时,我们可采用如下方式进行快速恢复数据。

    操作流程:

    (1)停止单节点 Etcd 服务

    1
    systemctl stop etcd

    (2)备份 Etcd 数据目录

    1
    mv /var/lib/etcd /var/lib/etcd.bak

    (3)使用 Etcd 快照文件恢复 Etcd 数据

    1
    2
    3
    4
    5
    etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem  --endpoints 10.20.30.31:2379 snapshot restore  /var/backups/kube_etcd/etcd-2024-0206-snapshot.db \
    --name=etcd01 \
    --initial-cluster=etcd01=https://10.20.30.31:2380 \
    --initial-advertise-peer-urls=https://10.20.30.31:2380 \
    --data-dir=/var/lib/etcd

    注意 1:本博文 etcdctl 客户端命令默认使用 v3 版本 API。 

    注意 2:执行恢复命令时,命令中涉及的节点IP、私钥、证书、快照文件等信息需要集群实际情况进行替换。

    (4)启动单节点 Etcd 服务

    1
    systemctl start etcd

    (5)查看 Etcd 节点状态

    通过查看 Etcd 服务状态、Etcd 日志以及通过 Etcd 客户端查看 Etcd 节点状态、查看 Etcd 快照中保存的 key 来检查 Etcd 节点数据恢复情况。如果检查 Etcd 节点状态正常的话,至此单节点 Etcd 恢复正常。下面仅粘贴通过 Etcd 客户端查看 Etcd 节点状态命令。

    1
    etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://10.20.30.31:2379" endpoint status --write-out=table

    2.2 高可用集群恢复

    对于使用 Etcd 快照文件恢复高可用 Etcd 集群数据,需要对每个 Etcd 节点进行数据恢复,下面以 3 个节点 Etcd 集群为例,实战下对于高可用 Etcd 集群恢复。

    (1)待恢复高可用集群节点信息

    模拟高可用集群三台节点全部数据损坏情况,针对三台节点数据全部损坏并没法恢复情况, 需要重新安装高可用 Etcd 集群,并基于存储服务器上保存的 Etcd 快照文件进行数据恢复。

    新安装 Etcd 集群 etcd.service 配置文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # /usr/lib/systemd/system/etcd.service
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
      
    [Service]
    Type=notify
    EnvironmentFile=/opt/etcd/cfg/etcd.conf
    ExecStart=/opt/etcd/bin/etcd
    Restart=on-failure
    LimitNOFILE=65536
      
    [Install]
    WantedBy=multi-user.target

    新安装 Etcd 集群 etcd 节点配置文件,这里仅展示 103 节点配置文件,104 和 105 节点配置文件仅是 ip 不同。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #[Member]
    ETCD_NAME="etcd01"
    ETCD_DATA_DIR="/var/lib/etcd"
    ETCD_LISTEN_PEER_URLS="https://10.20.31.103:2380"
    ETCD_LISTEN_CLIENT_URLS="https://10.20.31.103:2379,http://127.0.0.1:2379"
      
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.20.31.103:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://10.20.31.103:2379"
    ETCD_INITIAL_CLUSTER="etcd01=https://10.20.31.103:2380,etcd02=https://10.20.31.104:2380,etcd03=https://10.20.31.105:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    ETCD_ENABLE_V2="true"
      
    #[Security]
    ETCD_CERT_FILE="/opt/etcd/ssl/server.pem"
    ETCD_KEY_FILE="/opt/etcd/ssl/server-key.pem"
    ETCD_TRUSTED_CA_FILE="/opt/etcd/ssl/ca.pem"
    ETCD_CLIENT_CERT_AUTH="true"
    ETCD_PEER_CERT_FILE="/opt/etcd/ssl/server.pem"
    ETCD_PEER_KEY_FILE="/opt/etcd/ssl/server-key.pem"
    ETCD_PEER_TRUSTED_CA_FILE="/opt/etcd/ssl/ca.pem"
    ETCD_PEER_CLIENT_CERT_AUTH="true"

    通过 etcdctl 客户端查看当前新安装 Etcd 集群节点信息。

    1
    2
    3
    4
    5
    6
    7
    8
    [root@xxx ~]# /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://10.20.31.103:2379,https://10.20.31.104:2379,https://10.20.31.105:2379" endpoint status --write-out=table
    +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    |         ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    | https://10.20.31.103:2379 | 3681f3c1503c3f87 |  3.4.13 |   20 kB |      true |      false |         2 |          8 |                  8 |        |
    | https://10.20.31.104:2379 | 24b3b3c0efa27a98 |  3.4.13 |   20 kB |     false |      false |         2 |          8 |                  8 |        |
    | https://10.20.31.105:2379 | 7acc5e40b5c32ffd |  3.4.13 |   20 kB |     false |      false |         2 |          8 |                  8 |        |
    +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

    通过 etcdmanager 客户端查看当前新安装 Etcd 集群节点信息。

    通过 etcdctl 客户端查看当前新安装 Etcd 集群存储的 key。

    1
    2
    [root@xxx ~]# /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://10.20.31.103:2379,https://10.20.31.104:2379,https://10.20.31.105:2379" get --prefix "" --keys-only=true
    [root@xxx ~]#

    通过 etcdmanager 客户端查看当前新安装 Etcd 集群存储的 key。

     注意 1:高可用 Etcd 集群安装步骤可以参考 《搭建高可用Kubernetes集群之etcd v3.4.13集群搭建(一)》这篇博文,本文不再赘余。

    (2)所有 Etcd 节点停止 Etcd 服务

    三台 Etcd 节点分别停止 Etcd 服务。

    1
    systemctl stop etcd

    (3)所有 Etcd 节点备份 Etcd 数据目录

    三台 Etcd 节点分别备份 Etcd 数据目录。

    1
    mv /var/lib/etcd /var/lib/etcd.bak

    (4)所有 Etcd 节点使用快照文件恢复 Etcd 数据

    10.20.31.103 节点使用快照文件恢复 Etcd 数据:注意 data-dir 需要与 etcd 节点配置文件中配置路径一致,不然后面启动 etcd 服务会基于 etcd 节点配置文件中配置的路径作为新节点数据目录。

    1
    2
    3
    4
    5
    6
    /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot restore  snapshot.db \
    --name etcd01 \
    --initial-cluster=etcd01=https://10.20.31.103:2380,etcd02=https://10.20.31.104:2380,etcd03=https://10.20.31.105:2380 \
    --initial-cluster-token=etcd-cluster \
    --initial-advertise-peer-urls=https://10.20.31.103:2380 \
    --data-dir=/var/lib/etcd

    10.20.31.104节点使用快照文件恢复 Etcd 数据注意 data-dir 需要与 etcd 节点配置文件中配置路径一致,不然后面启动 etcd 服务会基于 etcd 节点配置文件中配置的路径作为新节点数据目录。

    1
    2
    3
    4
    5
    6
    /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot restore  snapshot.db \
    --name etcd02 \
    --initial-cluster=etcd01=https://10.20.31.103:2380,etcd02=https://10.20.31.104:2380,etcd03=https://10.20.31.105:2380 \
    --initial-cluster-token=etcd-cluster \
    --initial-advertise-peer-urls=https://10.20.31.104:2380 \
    --data-dir=/var/lib/etcd

    10.20.31.105节点使用快照文件恢复 Etcd 数据注意 data-dir 需要与 etcd 节点配置文件中配置路径一致,不然后面启动 etcd 服务会基于 etcd 节点配置文件中配置的路径作为新节点数据目录。

    1
    2
    3
    4
    5
    6
    /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot restore  snapshot.db \
    --name etcd03 \
    --initial-cluster=etcd01=https://10.20.31.103:2380,etcd02=https://10.20.31.104:2380,etcd03=https://10.20.31.105:2380 \
    --initial-cluster-token=etcd-cluster \
    --initial-advertise-peer-urls=https://10.20.31.105:2380 \
    --data-dir=/var/lib/etcd

    注意 1:本博文 etcdctl 客户端命令默认使用 v3 版本 API。 

    注意 2:执行恢复命令时,命令中涉及的节点IP、私钥、证书、快照文件等信息需要集群实际情况进行替换。

    (5)所有节点启动 Etcd 服务

    1
    systemctl start etcd

    (6)查看 Etcd 集群状态

    通过 etcdctl 客户端查看当前新安装 Etcd 集群节点信息。

    1
    [root@xxx ~]# /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://10.20.31.103:2379,https://10.20.31.104:2379,https://10.20.31.105:2379" endpoint status --write-out=table

    通过 etcdctl 客户端查看当前新安装 Etcd 集群存储的 key。

    1
    2
    [root@xxx ~]# /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://10.20.31.103:2379,https://10.20.31.104:2379,https://10.20.31.105:2379" get --prefix "" --keys-only=true
    [root@xxx ~]#

     至此,高可用 Etcd 集群通过 Etcd 快照文件恢复集群数据成功, Etcd 集群能够在快照数据基础上对外提供服务了。

    3、总结

    只要一个快照文件,就能恢复 Etcd 集群,使用 etcdctl snapshot restore 命令,创建一个新的 Etcd 数据目录,所有节点都将从同一个快照文件进行恢复。恢复会覆写快照文件中一些元数据,例如 member ID 和 cluster ID,这些节点也就丢失它们之前的身份信息。抹掉元数据是为了防止新节点不小心加入别的 etcd 集群。

    高可用 Etcd 集群安装:《搭建高可用Kubernetes集群之etcd v3.4.13集群搭建(一)

    定时备份 Etcd 数据:定时备份etcd数据

  • 相关阅读:
    啥,要我前端去对接外部?我也不会呀
    conda创建环境、安装包到环境迁移
    深度学习概述:从基础概念、计算步骤到调优方法
    C练题笔记之:Leetcode-137. 只出现一次的数字 II
    Python pyenv install 下载安装慢(失败)完美解决
    Java框架(四)--Spring AOP面向切面编程(3)--Spring AOP实现原理
    spring源码解析——IOC之bean创建
    CentOS 7 下 Ruby 环境搭建(编译安装)
    open graph协议
    MaxPool2d详解--在数组和图像中的应用
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/18010039