k8s ETCD数据备份与恢复

在 Kubernetes 集群中,etcd 是一个分布式键值存储,它保存着整个集群的状态,包括节点、Pod、ConfigMap、Secrets 等关键信息。因此,定期对 etcd 进行备份是非常重要的,特别是在集群发生故障或需要恢复数据的情况下。本文将介绍如何备份和恢复 Kubernetes 中的 etcd 数据。

一、备份 ETCD 数据

Kubernetes 集群使用的 etcd 通常运行在控制平面节点上。可以通过 etcdctl 工具来备份 etcd 数据。

1. 安装 etcdctl

如果 etcdctl 没有安装,可以使用以下命令安装 etcdctl 工具:

bash 复制代码
sudo apt-get install etcd-client

或者从 官方 GitHub 下载适合你的系统版本的 etcdctl。

2. 确认 ETCD 环境变量

在控制平面节点上,etcd 的 API 通过 HTTPS 进行保护。因此,你需要指定一系列证书文件和 etcd 服务的端点。

bash 复制代码
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 数据的快照文件:

bash 复制代码
ETCDCTL_API=3 etcdctl --endpoints=${ETCDCTL_ENDPOINTS} \
  --cacert=${ETCDCTL_CACERT} --cert=${ETCDCTL_CERT} --key=${ETCDCTL_KEY} \
  snapshot save /path/to/backup/etcd-snapshot.db

示例:

bash 复制代码
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. 验证备份

备份完成后,可以通过以下命令验证备份文件的有效性:

bash 复制代码
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 数据。例如,每天凌晨备份一次:

bash 复制代码
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。

使用以下命令在控制平面节点上停止这些服务:

bash 复制代码
sudo systemctl stop kube-apiserver
sudo systemctl stop kube-controller-manager
sudo systemctl stop kube-scheduler
2. 恢复 etcd 快照

执行以下命令,将 etcd 恢复到某个快照:

bash 复制代码
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

示例:

bash 复制代码
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 数据后,重新启动控制平面组件:

bash 复制代码
sudo systemctl start kube-apiserver
sudo systemctl start kube-controller-manager
sudo systemctl start kube-scheduler
5. 验证恢复

恢复完成后,检查 etcd 和 Kubernetes 集群的状态:

bash 复制代码
kubectl get nodes
kubectl get pods -n kube-system

确保集群恢复正常工作,节点和 Pod 的状态为 Ready。

三、备份与恢复的注意事项

  1. 备份频率 :建议定期备份 etcd,并根据集群的重要性和数据变化频率确定备份频率。生产环境中的集群建议每日备份。
  2. 备份位置:将备份文件存储在安全的地方,可以考虑远程存储或云端存储。
  3. 多节点集群的恢复 :如果是高可用的多节点 etcd 集群,恢复时需要对所有 etcd 节点进行操作,确保数据一致性。
  4. 测试恢复流程:定期在非生产环境中测试备份与恢复流程,确保在真正故障时能够快速、无误地恢复集群。

通过定期备份 etcd 并掌握正确的恢复方法,你可以确保 Kubernetes 集群的高可用性和数据安全性,即使在发生故障时,也能迅速恢复集群状态。

相关推荐
吴声子夜歌18 分钟前
Kubernetes权威指南——Kubernetes安装配置指南(网络配置)
网络·容器·kubernetes
闲云野鹤在人间31 分钟前
Kubernetes Pod Scheduler 详解
云原生·容器·kubernetes
刘马想放假1 小时前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
docker·容器
切糕师学AI3 小时前
Kubernetes 探针全解析:启动探针、存活探针与就绪探针(Startup/Liveness/Readiness Probe)
容器·kubernetes·探针·probe
xianyuCcCcCCCcc5 小时前
Kubernetes :健康检查、认证授权与可视化面板
运维·云原生·kubernetes·dashboard
fb_123456 小时前
K8s调度实战全景-Pod调度与资源管控
云原生·容器·kubernetes
吴声子夜歌7 小时前
Kubernetes权威指南——Kubernetes安装配置指南(二进制文件安装)
容器·kubernetes
江华森7 小时前
Kubernetes集群部署实战:使用kubeadm在4台ECS服务器上搭建K8s v1.31集群
云原生·容器·kubernetes
闲云自留地7 小时前
K8s Ingress 全解:ingress-nginx 部署、域名路径路由、HTTPS 限流灰度一篇通
nginx·https·kubernetes
SelectDB技术团队8 小时前
ClickHouse 支持存算分离吗?Doris 社区版原生存算分离怎么落地
数据库·clickhouse·云原生·开源·apache doris·技术选型·存算分层