备份 etcd 并制定恢复计划
目标
实际创建并验证 etcd 快照,通过资源对照确认快照所代表时点的含义,并将恢复流程记录成文档。
为什么这很重要
CKA 实操考试几乎每次都会考 etcd 备份,但只背命令并不足够。本实验强调的是:快照记录的是某个时点。快照创建之后才生成的资源不会包含在该文件中,恢复后也会消失。如果没有这种认识,恢复后就会发生“为什么昨天创建的资源不见了”之类的事故。
要求将恢复计划写下来的原因也在于此。恢复不是一条命令,而是一套顺序:停止控制平面、解压到新的 data-dir、匹配成员配置与 peer URL,再重新启动。如果不提前写好顺序,就只能在事故现场临时制定,而那时的判断通常会出错。
本环境中的 etcd 运行在 127.0.0.1:2379。在真正的 kubeadm 集群中,还需要额外添加 --cacert、--cert、--key 三个选项。
步骤
- 创建
/root/cka-etcd/env.sh,导出ETCDCTL_API=3和ETCDCTL_ENDPOINTS=127.0.0.1:2379,使其能够传递给子进程。 - 将 etcd endpoint 状态(或健康状态)输出保存到
/root/cka-etcd/status.txt。文件中应显示 endpoint 地址。 - 创建 namespace
cka-etcd和 ConfigMappre-backup,数据为stage=before。然后将cka-etcd中的 ConfigMap 列表保存到/root/cka-etcd/before.txt。 - 将 etcd 快照保存到
/root/cka-etcd/snap.db。 - 将该快照的状态(元数据)输出保存到
/root/cka-etcd/snap-status.txt。 - 在创建快照之后,创建 ConfigMap
post-backup(数据为stage=after),位置在cka-etcd中,并将 ConfigMap 列表保存到/root/cka-etcd/after.txt。before.txt中不应有post-backup,而after.txt中应同时包含二者。 - 在
/root/cka-etcd/restore-plan.md中写下恢复流程,至少五行、200 字节。必须包含snapshot restore、--data-dir、--initial-cluster、peer 端口2380、apiserver,还要说明恢复期间需要暂时停止控制平面。
参考
- 如果没有
etcdctl snapshot status,请尝试etcdutl snapshot status。新版 etcd 已将离线操作迁移到 etcdutl。 - 快照文件是 bbolt 数据库,作为文本打开也没有意义。请通过文件大小和 status 输出进行确认。
- 常见错误 1:在第 4 步之前执行第 6 步,这会导致对照不成立。
- 常见错误 2:恢复计划中遗漏停止 apiserver 的步骤。仍在运行的 apiserver 会继续写入,导致状态与恢复副本不一致。
整理 etcdctl 环境变量
创建 /root/cka-etcd/env.sh,导出 ETCDCTL_API=3 和 ETCDCTL_ENDPOINTS=127.0.0.1:2379,使其能够传递给子进程。
etcdctl 的 v2 与 v3 API 不同。环境变量必须能传递给子进程,因此只进行赋值还不够。
检查 endpoint 状态
将 etcd endpoint 状态(或健康状态)输出保存到 /root/cka-etcd/status.txt。文件中应显示 endpoint 地址。
endpoint status 和 endpoint health 都可以使用。有时输出会写入标准错误,请注意重定向。
创建备份基准点
创建 namespace cka-etcd 和 ConfigMap pre-backup,数据为 stage=before。然后将 cka-etcd 中的 ConfigMap 列表保存到 /root/cka-etcd/before.txt。
为了稍后对照快照记录的是哪个时点,现在必须将状态保存到文件。这个文件中应缺少后续步骤才会创建的对象,对照才能成立。
保存快照
将 etcd 快照保存到 /root/cka-etcd/snap.db。
snapshot save 接收文件路径作为参数。如果目录不存在就会失败,请先创建目录。
检查快照元数据
将该快照的状态(元数据)输出保存到 /root/cka-etcd/snap-status.txt。
status 会显示哈希、revision、键数量和大小。新版 etcd 已将此子命令迁移到独立工具,如果找不到,请尝试使用该工具。
与备份之后的资源进行对照
在创建快照之后,创建 ConfigMap post-backup(数据为 stage=after),位置在 cka-etcd 中,并将 ConfigMap 列表保存到 /root/cka-etcd/after.txt。before.txt 中不应有 post-backup,而 after.txt 中应同时包含二者。
创建快照之后才生成的资源不在该快照中。本步骤通过两个文件的差异证明这一事实。
综合:将恢复流程记录成文档
在 /root/cka-etcd/restore-plan.md 中写下恢复流程,至少五行、200 字节。必须包含 snapshot restore、--data-dir、--initial-cluster、peer 端口 2380、apiserver,还要说明恢复期间需要暂时停止控制平面。
恢复不是一条命令,而是一套顺序。请写明先停止什么、解压到哪里,以及必须匹配哪些值才能重新启动。