温馨提示×

Debian上Kubernetes如何恢复数据

小樊
36
2025-10-02 08:17:32
栏目: 智能运维

Debian上Kubernetes数据恢复指南
在Debian系统上恢复Kubernetes数据,核心围绕**etcd(集群状态存储)Velero(集群资源备份)**展开。以下是具体步骤及注意事项:

一、准备工作

  1. 确认备份可用性:确保已通过etcdctl或Velero创建了有效的备份文件(etcd快照或Velero集群备份)。
  2. 环境检查:所有节点(尤其是主节点)需正常运行,具备管理员权限(sudo),网络连接稳定。
  3. 工具安装:根据备份方式安装必要工具(如etcdctl、Velero CLI),确保版本与集群兼容。

二、基于etcd的集群核心数据恢复

etcd存储了Kubernetes的所有配置(如Pod、Deployment、ConfigMap)和状态信息,是恢复的关键。

1. 单节点etcd恢复步骤

  • 停止相关服务:避免数据写入冲突,停止kube-apiserver和etcd服务:
    sudo systemctl stop kube-apiserver etcd
    
  • 备份当前数据(可选但推荐):防止恢复失败导致数据永久丢失,重命名现有etcd数据目录:
    sudo mv /var/lib/etcd /var/lib/etcd_old_backup
    
  • 执行恢复:使用etcdctl从快照文件(如snapshot.db)重建etcd数据目录,需指定集群配置(节点名称、初始集群信息等,需与备份时一致):
    ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
      --name=etcd-master-01 \  # 集群中etcd节点的名称(查看etcd.yaml中的--name参数)
      --data-dir=/var/lib/etcd \  # 恢复后的数据目录
      --initial-cluster=etcd-master-01=https://192.168.1.10:2380 \  # 集群节点列表(单节点仅需自身)
      --initial-cluster-token=etcd-cluster-token \  # 集群唯一令牌(查看etcd.yaml中的--initial-cluster-token)
      --initial-advertise-peer-urls=https://192.168.1.10:2380  # 节点对等通信地址(查看etcd.yaml中的--initial-advertise-peer-urls)
    
  • 恢复权限与重启服务:确保etcd数据目录属主正确,重启kube-apiserver和etcd服务:
    sudo chown -R etcd:etcd /var/lib/etcd
    sudo systemctl start etcd kube-apiserver
    
  • 验证恢复结果:检查etcd集群健康状态及Kubernetes资源是否恢复:
    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 \
      endpoint health  # 检查etcd健康状态
    
    kubectl get pods --all-namespaces  # 检查Kubernetes资源
    

2. 多节点etcd集群恢复

若为多节点etcd集群,需在所有节点执行上述恢复步骤,并确保--initial-cluster参数包含所有节点的信息(如etcd-node1=https://10.0.0.1:2380,etcd-node2=https://10.0.0.2:2380),以重建完整的集群拓扑。

三、基于Velero的集群资源恢复

Velero可备份Kubernetes资源(如Deployments、Services、PersistentVolumeClaims),恢复时无需重启核心组件。

1. 恢复整个集群

若已使用Velero创建了集群备份(如my-backup),可直接通过以下命令恢复所有资源:

velero restore create --from-backup my-backup

2. 恢复特定资源

若只需恢复部分资源(如某个Namespace的Deployments),可通过--include-namespaces--include-resources参数指定:

velero restore create --from-backup my-backup \
  --include-namespaces=my-namespace \  # 仅恢复指定Namespace
  --include-resources=deployments,configmaps  # 仅恢复指定资源类型

3. 验证恢复结果

恢复完成后,检查资源是否正常运行:

kubectl get deployments -n my-namespace  # 检查Deployments
kubectl get pods -n my-namespace         # 检查Pods状态

四、精准恢复单个资源(可选)

若仅需恢复单个资源(如误删除的ConfigMap),可通过etcd快照提取并解码资源,再用kubectl应用:

1. 提取资源键

etcd中资源的键遵循固定路径(如ConfigMap存储在/registry/configmaps/<namespace>/<name>):

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 \
  get --prefix "/registry/configmaps/production" --keys-only  # 列出指定Namespace下的ConfigMap键

2. 解码并保存为YAML

使用auger工具将etcd中的二进制数据解码为YAML文件:

etcdctl --endpoints=https://127.0.0.1:2379 \
  get /registry/configmaps/production/app-config --print-value-only | auger decode > app-config.yaml

3. 应用资源

将解码后的YAML文件应用到集群:

kubectl apply -f app-config.yaml --dry-run=server  # 干运行测试
kubectl apply -f app-config.yaml                  # 正式应用

五、注意事项

  • 定期测试恢复:每季度至少在测试环境中演练一次恢复流程,确保备份有效性。
  • 备份存储安全:将备份文件存储在远程位置(如S3、MinIO),避免本地磁盘故障导致备份丢失。
  • 权限管理:严格控制etcd和Velero的访问权限,避免未授权操作破坏备份数据。
  • 监控恢复过程:通过日志(journalctl -u etcdvelero restore logs <restore-name>)监控恢复进度,及时排查问题。

0