一、ETCD基础概念及相关参数
etcd是一个高可用的分布式键值对存储系统,常用于配置共享和服务发现。它由CoreOS公司发起,基于Raft算法实现,确保了强一致性和高可用性。etcd的名称源自两个概念:Linux的/etc文件夹和分布式系统。
etcd的基本概念
etcd使用Raft算法来解决分布式系统中的一致性问题。Raft算法通过选举过程选择一个领导者来处理所有数据操作,确保了系统的稳定性和数据一致性。etcd支持多种配置参数,包括成员名称、数据存储目录、日志目录等,这些参数可以通过命令行参数进行配置。
etcd的配置参数
etcd的配置参数包括:
--name
:为成员指定一个易读的名称。--data-dir
:数据存储目录的路径。--wal-dir
:用于存放Write-Ahead Log的目录路径。--snapshot-count
:触发快照到磁盘的已提交事务数量。--heartbeat-interval
:心跳间隔时间(毫秒)。--election-timeout
:选举超时时间(毫秒)。--listen-peer-urls
:用于监听对等节点流量的URL列表。--listen-client-urls
:用于监听客户端gRPC和HTTP流量的URL列表。
etcd的使用场景和服务发现机制
etcd主要用于服务发现和配置共享。服务发现通过在etcd中注册服务并设置key TTL来实现,定时保持服务的心跳以监控健康状态。etcd作为服务存储目录,确保了强一致性和高可用性,是服务发现的三大支柱之一。
二、备份ETCD数据
Kubesphere集群使用的etcd通常运行在控制平台节点上,可以通过etcdctl工具来备份etcd数据。
1. 安装etcdctl
如果etcdctl没有安装,可以使用以下命令安装etcdctl工具。
apt-get install etcd-client
2. 确认ETCD环境变量
在控制平台节点上,etcd 的 API 通过 HTTPS 进行保护。因此,你需要指定一系列证书文件和 etcd 服务的端点。
export ETCDCTL_API=3 #用于设置etcdctl的API版本为3
export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379 #设置监听地址及端口,这里为监控本机地址及默认的2379端口
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt #CA证书
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt #客户端证书
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key #客户端密钥
3. 创建 etcd 备份
执行以下命令来创建 etcd
数据的快照文件:
ETCDCTL_API=3 etcdctl --endpoints=${ETCDCTL_ENDPOINTS} \
--cacert=${ETCDCTL_CACERT} \--cert=${ETCDCTL_CERT} \
--key=${ETCDCTL_KEY} \
snapshot save /path/to/backup/etcd-snapshot.db
示例:
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /var/backups/etcd-snapshot-$(date +%Y-%m-%d).db
这个命令会生成一个快照文件(例如:etcd-snapshot-2024-10-12.db
),包含当前 etcd
的所有数据。使用变量有可能提示变量冲突,最好使用–cacert=/etc/kubernetes/pki/etcd/ca.crt 这个非变量模式执行。其中的证书参数,可以在kube-apiserver启动中查找。
4、 验证备份
备份完成后,可以通过以下命令验证备份文件的有效性:
ETCDCTL_API=3 etcdctl --write-out=table snapshot status /path/to/backup/etcd-snapshot.db
输出示例:
+---------+----------+------------+------------+
| HASH | VERSION | TOTAL KEYS | DB SIZE |
+---------+----------+------------+------------+
| abcd... | 3.4.13 | 10000 | 4.2 MB |
+---------+----------+------------+------------+
5、 定期备份
注:该步骤可以不做
你可以使用定时任务(crontab)来定期备份 etcd
数据。例如,每天凌晨备份一次:
crontab -l # 查看定时任务
crontab -e # 编写定时任务
0 2 * * * root ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /var/backups/etcd-snapshot-$(date +%Y-%m-%d).db
三、恢复ETCD数据
在 etcd 数据损坏或需要将需要将集群恢复到某个时间点时,不可以通过备份文件恢复 etcd 数据。
1、 停止 Kubernetes 控制平台组件
在恢复 etcd 之前,必须先停止 kubrnetes 控制平台上的组件,包括 kube-apiserver 、kube-contronller-manager 和 kube-scheduler 。
使用以下命令在控制平台节点上停止这些服务:
sudo systemctl stop kube-apiserver
sudo systemctl stop kube-controller-manager
sudo systemctl stop kube-scheduler
2、 恢复 etcd 快照
执行以下命令,将 etcd 恢复到某个快照:
ETCDCTL_API=3 etcdctl --endpoints=${ETCDCTL_ENDPOINTS} \
--cacert=${ETCDCTL_CACERT} --cert=${ETCDCTL_CERT} --key=${ETCDCTL_KEY} \
snapshot restore /path/to/backup/etcd-snapshot.db \
--data-dir=/var/lib/etcd
示例:
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot restore /var/backups/etcd-snapshot-2024-10-12.db \
--data-dir=/var/lib/etcd
--data-dir 选定指定 etcd 数据存储的目录,通常是 /var/lib/etcd 。
3、 更新 etcd 配置文件
在某些情况下,你可能需要修改 etcd 配置文件以确保其指向正确的 data-dir 和集群配置。/etc/kubernetes/manifests/etcd.yaml 通常是 etcd 的配置文所在位置。
4、 启动控制平台组件
恢复 etcd 数据后,重新启动控制平台组件:
sudo systemctl start kube-apiserver
sudo systemctl start kube-controller-manager
sudo systemctl start kube-scheduler
5、 验证恢复
恢复完成后,检查 etcd 和 Kubernetes 集群的态度:
kubectl get nodes
kubectl get pods -n kube-system
确保集群恢复正常工作,节点和 pod 的状态为 ready 。
三、 备份与恢复的注意事项
1、 备份频率:建议定期备份 etcd ,并根据集群的重要性和数据变化频率确定备份频率。生产环境中的集群建议每日备份。
2、 备份位置:将备份文件存储在安全的地方,可以考虑远程存储或云端存储。
3、 多节点集群的恢复:如果是高可用的节点 etcd 集群,恢复时需要对所有 etcd 节点进行操作,确保数据一致性。
4、 测试恢复流程 :定期在非生产环境中测试备份与恢复流程,确保在真正故障时能够快速、无误地恢复集群。
通过定期备份 ecd 并掌握正确的恢复方法,你可以确保Kubernetes 集群的高可用性和数据安全性,即使在发生故障时,也能迅速恢复集群状态。