蛮子哥 蛮子哥
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • ArgoCD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

蛮子哥

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • ArgoCD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • ansible系列文章

  • Kubernetes笔记

    • 安装篇-kubeadm
    • k8s入门
    • k8s安装篇二进制
    • k8s面试题
    • kubernetes(k8s)yaml文件详解
    • k8s报错小结
    • Kubernetes 安装配置ingress controller
    • cka考试真题
    • ingress配置证书
    • cka考试作业
    • k8s部署java项目
    • jenkins脚本式流水线部署k8s项目实例一
    • helm v3安装并创建例子
    • 使用helm将本地部署文件上传到harbor chart上
    • helm公共仓库创建
    • helm适应minio作为私有仓库
    • helm release使用说明
    • kubernetes核心概念
    • kubectl使用技巧
    • kubernetes卷的几种类型
    • kubernetes安全框架
    • 云原生-什么是HPA和PDB、VPA
    • k8s部署php项目示例
    • 配置kubeconfig 文件访问 Kubernetes 集群
    • configmap配置的几种方式
    • k8s配置go服务
    • k8s部署java项目
    • kubernetes部署prometheus监控
    • kubernetes部署elk日志系统
    • kubernetes环境devops流水线
    • kubernetes高阶技能必备的工具
    • deployment中使用configmap、secret的方式
    • 业务pod 飘移pending排查分析
    • debian 12安装kubernetes
    • istio入门
    • kubernetes证书续签到100年
    • kubernetes网络模式
    • etcd的备份和还原
      • Kubernetes 安装和配置 NFS 存储卷
    • elk

    • jenkins

    • GitLabCI_CD

    • AI编程

    • 提示词

    • ArgoCD

    • 专题
    • Kubernetes笔记
    蛮子哥
    2024-05-21
    目录

    etcd的备份和还原

    # etcd的备份和还原

    安装客户端命令

    执行:

    wget https://github.com/etcd-io/etcd/releases/download/v3.6.11/etcd-v3.6.11-linux-amd64.tar.gz
    tar -xf etcd-v3.6.11-linux-amd64.tar.gz
    mv etcd-v3.6.11-linux-amd64/etcdctl /usr/local/bin/
    
    1
    2
    3

    Kubernetes etcd 备份和还原操作指南(基于官方 Kubernetes 和 etcd 文档)

    etcd 是 Kubernetes 的核心数据存储,所有集群状态(Pod、Service、Deployment 等)都保存在其中。定期备份 etcd 是生产环境灾难恢复的关键。

    # 1. 备份 etcd(推荐使用内置快照)

    # 准备工作

    • 在 Control Plane 节点(Master)上执行,通常在运行 etcd 的节点。
    • 确认 etcdctl 已安装(Kubernetes 集群通常已内置)。
    • 获取证书路径(kubeadm 安装常见路径):
      • CA: /etc/kubernetes/pki/etcd/ca.crt
      • Cert: /etc/kubernetes/pki/etcd/server.crt
      • Key: /etc/kubernetes/pki/etcd/server.key

    # 备份命令(推荐)

    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 /backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db
    
    1
    2
    3
    4
    5
    • --endpoints:可改为集群中其他 etcd 成员地址。
    • 建议将备份文件复制到安全位置(外部存储、S3 等),并加密敏感数据。

    # 验证备份

    etcdutl --write-out=table snapshot status /backup/etcd-snapshot-xxx.db
    # 或(旧方式,etcd v3.5+ 推荐 etcdutl)
    ETCDCTL_API=3 etcdctl --write-out=table snapshot status /backup/etcd-snapshot-xxx.db
    
    1
    2
    3

    # 2. 还原 etcd(恢复集群状态)

    重要警告:

    • 先停止所有 kube-apiserver(防止数据不一致)。
    • 在 HA 集群中,所有 etcd 成员都需要使用同一份快照进行还原。
    • 还原会创建新的数据目录,成员 ID 和集群 ID 会被重置。
    • 推荐重启相关组件(kube-scheduler、kube-controller-manager、kubelet)以刷新缓存。

    # 步骤(单节点或 stacked etcd 简化版)

    1. 停止 API Server:

      systemctl stop kubelet   # 或手动删除 static pod
      mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
      # 等待 apiserver 停止
      
      1
      2
      3
    2. (可选)备份当前 etcd 数据(以防万一):

      mv /var/lib/etcd /var/lib/etcd.bak
      
      1
    3. 执行还原(推荐使用 etcdutl):

      # 创建新数据目录
      etcdutl snapshot restore /backup/etcd-snapshot-xxx.db \
        --data-dir /var/lib/etcd-new
      
      1
      2
      3

      对于多节点 HA 集群,需指定成员信息(参考 etcd 官方文档):

      etcdutl snapshot restore /backup/etcd-snapshot-xxx.db \
        --name <member-name> \
        --data-dir /var/lib/etcd-new \
        --initial-cluster <member1>=https://<ip1>:2380,<member2>=https://<ip2>:2380,... \
        --initial-cluster-token etcd-cluster-1 \
        --initial-advertise-peer-urls https://<this-ip>:2380
      
      1
      2
      3
      4
      5
      6
    4. 更新 etcd 配置(kubeadm 集群):

      • 编辑 /etc/kubernetes/manifests/etcd.yaml,将 hostPath 的 etcd-data 路径改为新目录(如 /var/lib/etcd-new)。

      • 恢复 apiserver:

        mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
        systemctl start kubelet
        
        1
        2
    5. 验证:

      • 检查 etcd Pod 是否 Running。
      • kubectl get all --all-namespaces 验证资源是否恢复。

    注意:

    • etcd v3.5+ 推荐使用 etcdutl 进行 restore 和 status 操作(etcdctl 相关功能已弃用)。
    • 如果 revision 回退,可能导致控制器缓存问题,建议使用 --bump-revision 和 --mark-compacted。

    # 3. 最佳实践

    • 自动化备份:使用 CronJob + PVC / 对象存储(Velero、etcd-backup 工具等)。
    • 测试还原:定期在测试环境中验证备份有效性。
    • 生产建议:使用 3 或 5 节点 etcd 集群;备份后立即测试;结合卷快照(EBS 等)。
    • 托管 Kubernetes(EKS/GKE/AKS):平台通常自动备份,无需手动操作。
    • 升级前必须备份 etcd。

    更多官方参考:

    • Kubernetes etcd 操作文档 (opens new window)
    • etcd 灾难恢复 (opens new window)

    如果你的集群是 kubeadm 部署、多节点 HA,或使用特定存储,提供更多细节我可以给出更精确的命令。操作时务必谨慎,建议在维护窗口内进行!

    脚本定时备份操作

    步骤 1:创建备份脚本

    cat > /usr/local/bin/etcd-backup.sh << 'EOF'
    #!/bin/bash
    BACKUP_DIR="/backup"
    DATE=$(date +%Y%m%d-%H%M%S)
    BACKUP_FILE="${BACKUP_DIR}/etcd-snapshot-${DATE}.db"
    
    mkdir -p ${BACKUP_DIR}
    
    echo "=== Starting etcd backup at $(date) ==="
    
    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 ${BACKUP_FILE}
    
    if [ $? -eq 0 ]; then
        echo "Backup successful: ${BACKUP_FILE}"
        echo "Size: $(du -h ${BACKUP_FILE} | cut -f1)"
        
        # 保留最近 7 天备份,删除更旧的
        find ${BACKUP_DIR} -name "etcd-snapshot-*.db" -mtime +7 -delete
    else
        echo "Backup failed!"
        exit 1
    fi
    EOF
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    步骤 2:添加执行权限并测试

    chmod +x /usr/local/bin/etcd-backup.sh
    /usr/local/bin/etcd-backup.sh
    
    1
    2

    步骤 3:设置定时任务(每天凌晨 2 点执行)

    crontab -e
    # etcd 每日备份(每天凌晨2点)
    0 2 * * * /usr/local/bin/etcd-backup.sh >> /var/log/etcd-backup.log 2>&1
    
    1
    2
    3
    微信 支付宝
    上次更新: 2026/05/21, 21:01:23

    ← kubernetes网络模式 Kubernetes 安装和配置 NFS 存储卷→

    最近更新
    01
    kubernetes证书续签到100年
    05-04
    02
    istio入门
    04-29
    03
    ES故障排查命令
    04-29
    更多文章>
    Theme by Vdoing | Copyright © 2019-2026 | 点击查看十年之约 | 鄂ICP备2024072800号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式