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数据》