在 Kubernetes 中,ETCD 扮演着至关重要的角色:
1. 集群状态存储 2. 服务发现 3. 配置管理 4. 分布式锁和协调 5. 故障恢复
ETCD 存储了 Kubernetes 集群中所有的状态信息,包括节点、Pod、Service、ConfigMap、Secrets 等。ETCD 支持服务发现机制,帮助 Kubernetes 组件找到彼此并进行通信。Kubernetes API Server 会通过 ETCD 存储和检索集群的配置信息和状态数据。ETCD 还用于存储和管理 Kubernetes 集群的配置数据,包括网络配置、存储配置等,确保集群能够根据最新的配置进行调整和优化。使用 Raft 一致性算法来确保数据的一致性和高可用性,这使得它可以用于实现分布式锁和协调机制,确保在多节点环境下的操作一致性。当集群中的某个节点发生故障时,ETCD 中存储的数据可以用于快速恢复该节点的功能。
下面介绍如何对ETCD进行恢复与备份:
首先,如果集群中正在运行任何 API 服务器,则不应尝试还原 etcd 的实例。相反,请按照以下步骤还原 etcd:
- 停止所有API 服务器实例
- 为所有 etcd 实例恢复状态
- 重启所有 API 服务器实例
建议重启所有组件(例如 kube-scheduler
、kube-controller-manager
、kubelet
), 以确保它们不会依赖一些过时的数据。
列出 etcdctl 可用的各种选项。可以通过指定端点、证书和密钥来制作快照。
XML
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=<trusted-ca-file> \
--cert=<cert-file> \
--key=<key-file> \
snapshot save <backup-file-location>
将现有的 Kubernetes 配置和 ETCD 数据目录重命名为备份目录,以便在恢复过程中不被覆盖。
XML
mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak
mv /var/lib/etcd /var/lib/etcd.bak
etcd 支持从 major.minor 或其他不同 patch 版本的 etcd 进程中获取的快照进行恢复。 还原操作用于恢复失败的集群的数据。在启动还原操作之前,必须有一个快照文件。它可以是来自以前备份操作的快照文件, 也可以是来自剩余数据目录的快照文件。
XML
ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=<trusted-ca-file> \
--cert=<cert-file> \
--key=<key-file> \
--data-dir <data-dir-location> \
snapshot restore snapshot.db
**如果 <data-dir-location>
与之前的文件夹相同,请先删除此文件夹并停止 etcd 进程,再恢复集群。 否则,在恢复后更改 etcd 配置并重启 etcd 进程将使用新的数据目录: 首先将 /etc/kubernetes/manifests/etcd.yaml
中 name: etcd-data
对应条目的 volumes.hostPath.path
改为 <data-dir-location>
, 然后执行 kubectl -n kube-system delete pod <name-of-etcd-pod>
或 systemctl restart kubelet.service
(或两段命令都执行)。
然后将 Kubernetes 配置恢复到原始位置,并重启 kubelet
服务以应用更改。
XML
mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
systemctl restart kubelet.service
注意事项
验证备份和恢复:在执行这些操作之前,确保备份文件的完整性和可用性。
服务中断:在生产环境中执行这些操作时,可能会导致服务中断,请提前做好准备。
权限:确保执行这些命令的用户具有足够的权限。
结束