在 Kubernetes 集群中,etcd
是一个分布式键值存储,它保存着整个集群的状态,包括节点、Pod、ConfigMap、Secrets 等关键信息。因此,定期对 etcd
进行备份是非常重要的,特别是在集群发生故障或需要恢复数据的情况下。本文将介绍如何备份和恢复 Kubernetes 中的 etcd
数据。
一、备份 ETCD 数据
Kubernetes 集群使用的 etcd
通常运行在控制平面节点上。可以通过 etcdctl
工具来备份 etcd
数据。
1. 安装 etcdctl
如果 etcdctl
没有安装,可以使用以下命令安装 etcdctl
工具:
sudo apt-get install etcd-client
或者从 官方 GitHub 下载适合你的系统版本的 etcdctl
。
2. 确认 ETCD 环境变量
在控制平面节点上,etcd
的 API 通过 HTTPS 进行保护。因此,你需要指定一系列证书文件和 etcd
服务的端点。
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
其中:
ETCDCTL_API=3
:使用 etcd v3 API。ETCDCTL_ENDPOINTS
:etcd
监听的端口,通常为127.0.0.1:2379
。ETCDCTL_CACERT
、ETCDCTL_CERT
和ETCDCTL_KEY
:分别为 CA 证书、服务证书和服务密钥路径。
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启动中找到etcd证书变量参数,然后导出来的。
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. 定期备份
你可以使用 cron
来定期备份 etcd
数据。例如,每天凌晨备份一次:
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
之前,必须先停止 Kubernetes 控制平面上的组件,包括 kube-apiserver
、kube-controller-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
。
三、备份与恢复的注意事项
- 备份频率:建议定期备份
etcd
,并根据集群的重要性和数据变化频率确定备份频率。生产环境中的集群建议每日备份。 - 备份位置:将备份文件存储在安全的地方,可以考虑远程存储或云端存储。
- 多节点集群的恢复:如果是高可用的多节点
etcd
集群,恢复时需要对所有etcd
节点进行操作,确保数据一致性。 - 测试恢复流程:定期在非生产环境中测试备份与恢复流程,确保在真正故障时能够快速、无误地恢复集群。
通过定期备份 etcd
并掌握正确的恢复方法,你可以确保 Kubernetes 集群的高可用性和数据安全性,即使在发生故障时,也能迅速恢复集群状态。