适用范围与恢复目标
本文组织 etcd 快照的可恢复性验证,配合 etcd 快照与隔离恢复演练场景 使用,状态为 PENDING(待环境验证)。示例以 etcd 3.6 工具链为基准,不代表已完成部署、生产故障切换或恢复演练。先由平台负责人确认是定期演练、单成员故障还是多数永久丢失;仍可修复的成员问题不应自动升级为整个集群的快照恢复。
明确 RPO 与 RTO 的计时口径、允许恢复的备份时间点、谁批准丢弃快照之后的变更,以及恢复后的业务核对责任。etcd 保存的是控制面或协调数据,不能替代持久卷、业务数据库、对象存储和外部系统的备份。恢复 Kubernetes 对象也不能让业务数据自动回到一致时间点,必须把这些依赖单独列入恢复计划。
盘点版本、成员与恢复依赖
登记服务端、etcdctl、etcdutl、Kubernetes 与发行版版本;工具应按目标发行版支持组合固定,并保留二进制来源及校验记录。etcd 3.6 使用 etcdctl 生成快照、etcdutl 执行离线状态检查与恢复,不沿用旧版 etcdctl snapshot restore。其他版本需重新核对本地帮助和对应版本文档,不能因为主版本都是 3 就假设所有参数通用。etcd 3.6 恢复文档 给出了工具边界。
下列示例仅为手册,未在你的环境执行。原集群查询必须使用已经审核过的 TLS 端点与凭据配置,输出限定为状态,不读取业务键值或打印密钥。成员列表应逐项对照主机、故障域和客户端入口;失去多数时查询可能超时,应记录超时而不是重复施压。
etcdctl version
etcdutl version
etcdctl endpoint status --write-out=table
etcdctl member list --write-out=table
etcdutl snapshot restore --help还需清点证书、CA、API Server 加密配置及外部 KMS 依赖,并按密级分开保存。恢复出的 Secret 可能仍需原加密材料才能读取;不得为了让演练通过临时关闭加密。托管控制面不一定开放 etcd 访问,应使用云厂商正式备份恢复通道,不能绕过权限尝试直连控制面。
取得可追溯快照并限制暴露
优先使用已验证的备份流水线和单一已确认端点生成快照,记录开始、完成时间和实际 snapshot revision。快照生成会消耗集群读取带宽与存储 I/O,属于受控备份操作,不等同于“完全无影响的只读查看”。执行前检查备份目标空间、访问权限、任务并发和超时,备份文件名应唯一,禁止覆盖唯一可用副本。
# 下行需要备份授权;BACKUP_ENDPOINT 与 NEW_SNAPSHOT_FILE 均须替换。
# TLS 参数来自已审阅的 ETCDCTL 配置,不把凭据写入共享命令行。
etcdctl --endpoints=BACKUP_ENDPOINT snapshot save NEW_SNAPSHOT_FILE
etcdutl snapshot status NEW_SNAPSHOT_FILE --write-out=table快照可能包含集群全部敏感对象,应加密存放、限制读取、记录取用与按保留策略轮换。传入隔离环境使用受控副本,保留原始文件及独立传输校验记录。不要通过直接复制正在运行的数据目录冒充一致性快照;如唯一材料是数据目录文件,交给专项恢复流程评估缺失 WAL 与完整性风险。etcd 维护说明 是快照命令的核对来源。
区分文件完整性与业务可恢复性
检查备份任务结果、离线 snapshot status 的 revision、键数量、体积及校验记录是否合理,再与近期备份趋势对照。体积变化可能来自正常清理,也可能暴露备份对象错误,不能仅以文件非零或命令退出码为通过。校验不匹配时先保留两个文件和传输记录,暂停启动恢复集群;不要用跳过校验参数掩盖原因。
将证据分为三层:文件可读、etcd 能从副本启动、依赖客户端与业务能按恢复时间点一致工作。三者分别签收,后两层未测试时不得填写“恢复验证通过”。备份成功率、最近可用备份年龄、最近一次隔离恢复日期应分别展示,避免绿色备份告警造成虚假的容灾信心。
建立不会连接原集群的隔离环境
恢复前先验收隔离,而不是先启动再补防火墙。演练主机使用独立网络、独立 DNS 名称、专用证书及新数据目录;明确拒绝访问原 etcd 客户端与 peer 端点,也不允许原 API Server、控制器或真实业务自动接入演练端点。新成员清单和新集群 token 用于区分逻辑集群,但 token 不是认证秘密,也不能替代网络隔离及 TLS 身份校验。
核对宿主机路由、服务管理器、自动发现、监控自动注册和灾备 DNS,确认没有残留生产启动参数。对可能触达外部系统的 Kubernetes controller、Operator、Webhook 或备份恢复任务先禁用连接能力并使用测试替身;只隔离 etcd 的 peer 端口不足以防止这些客户端产生外部副作用。所有隔离验证均需要明确测试目标与权限,禁止以全网扫描取代配置审阅。
离线恢复到新的逻辑集群
在已获准的隔离主机上,使用受控快照副本和全新、不存在的恢复目录。下例是单成员隔离验证的参数模板,不是生产重建脚本;大写项必须经过复核后替换,example.invalid 不是可用端点。它只展示离线恢复,不启动服务,也没有修改原数据目录。真正的多成员恢复应让所有新成员使用同一快照,并逐项审阅新成员名称、地址与独立目录。
# 只在已验收隔离的演练主机执行;没有授权则在此停止。
etcdutl snapshot restore SNAPSHOT_COPY \
--name=drill-a \
--data-dir=NEW_DRILL_DATA_DIR \
--initial-cluster=drill-a=https://drill-a.example.invalid:2380 \
--initial-advertise-peer-urls=https://drill-a.example.invalid:2380 \
--initial-cluster-token=UNIQUE_DRILL_TOKEN任何路径指向现有生产数据、原成员仍可能互联、快照来源不明或恢复工具兼容性未确认,都必须停止。不得添加 force-new-cluster 作为快捷方式,也不提供删除原目录后覆盖恢复的一键指令。恢复失败时保留失败目录和日志供分析,重新演练采用另一个新目录;是否清理由保留策略决定,不自动删除证据。
Kubernetes revision 与缓存恢复边界
较旧快照会使逻辑 revision 回到过去,依赖 watch 的客户端缓存可能无法按预期刷新。etcd 3.6 文档提供 --bump-revision 与 --mark-compacted 配合处理这一情况:需要根据快照年龄、观察到的最高 revision、写入上界及安全余量计算增量,而不是机械复制固定数值。参数是否可用须通过实际 etcdutl snapshot restore --help 核验;3.5 或更旧发行版必须逐版本审查,本文不承诺任意版本支持。
对于需要模拟 Kubernetes 或缓存客户端接管的恢复演练,应先审批 revision 方案,再把两个参数加入受审阅的离线恢复命令。无法证明新 revision 超过客户端可能记住的范围时停在方案审查阶段,不把去掉参数视为无害替代。mark-compacted 会使旧 watch 失效,客户端须能重新列举和建立 watch;这种行为要在隔离客户端上验证。
离线还原成功不等于已经证明所有自定义 Operator、缓存层和外部协调者兼容。客户端恢复顺序和业务数据对账应使用专门检查项,列明哪些只做了配置审阅、哪些实际执行,避免将模拟信号和真实接管混为一谈。
启动与验收必须留在隔离范围
使用已审核的演练服务配置启动新成员,监听和通告地址仅指向隔离网络,TLS 证书与新成员名称一致,未验证前不接入任何原集群客户端。只连接明确列出的演练端点检查状态、成员清单和告警,不沿用包含生产端点的环境变量,也不自动通过 --cluster 扩展到未审核地址。此阶段的健康探测和客户端功能测试均属于获准演练操作,需要登记实际调用及负载。
核对新逻辑集群身份、期望成员数、快照对应对象的抽样结果及耗时;数据抽样只选事先批准且可脱敏的对象,不遍历导出全部键。Kubernetes 级验收还需证明 API 能读取恢复对象、watch 客户端能重新同步、加密对象可合法解密及外部副作用被阻断。若仅验证单成员启动,就明确标注尚未验证多成员多数、生产拓扑与业务接管。
停止、回退与交接证据
出现隔离失效、错误凭据加载、恢复端点被生产发现、数据与快照时间点不符或超出资源预算时,立即停止本次演练服务的对外访问并通知负责人,保留审计证据。这里的回退是停止隔离试验并保持原集群不变;生产灾难恢复一旦恢复写入,不能通过切回更旧快照“撤销”新写入,必须重新评估数据损失与业务一致性。
记录备份生成耗时、文件传输、离线恢复、成员启动、客户端验证和人工等待时间,分别报告技术恢复耗时与完整业务 RTO。将未覆盖的多成员故障、KMS、持久卷或第三方依赖列为待办。交接时提供版本清单、审批单、脱敏证据、隔离验收结果、恢复失败处理人及下次演练日期,只有完成相应检查后才能更新验证状态。