背景

在 Rancher 中基于 RKE 创建的 K8s 集群,因为服务器磁盘故障,导致 3个 master 节点有2个节点的 etcd 数据文件损坏,导致整个集群不可用。

etcd 三个节点集群时,如果有 2个节点损坏,仅剩余的一个 etcd 节点是不能正常通过 etcdctl 命令操作的。

因为是基于 Rancher RKE 的集群,所以在这个问题的情况下可以直接通过其默认备份的快照文件进行 etcd 恢复,如果没有做特别配置,etcd 和集群的快照备份文件在 /opt/rke/etcd-snapshots 中,默认是每 12小时生成一次快照。

这个备份文件中包含两个东西:一个是 etcd 的快照 db 文件,一个是该 k8s 集群的状态文件,里面包含 kubeconfig、证书等内容。

Kubernetes 集群状态由 Kubernetes 集群中的集群配置文件 cluster.yml 和组件证书组成,由 RKE 生成。

恢复etcd步骤

在恢复 etcd 之前,请先停止该 master 服务器上的 etcd 容器 docker stop etcd

1、创建临时目录 /home/restore/

2、下载 etcdctl 文件,官方地址:https://github.com/etcd-io/etcd/releases

3、复制一个 /opt/rke/etcd-snapshots 中的快照文件到 /home/restore/ 中,解压缩,如下文件结构示例:

[root@k8s-dev-node1 restore]# tree
.
├── backup
│   └── c-8d6fk-rl-bmmmn_2023-01-17T19:33:26Z
├── c-8d6fk-rl-bmmmn_2023-01-17T19:33:26Z.zip
├── etc
│   └── kubernetes
│       └── c-8d6fk-rl-bmmmn_2023-01-17T19:33:26Z.rkestate
├── etcd-v3.5.7-linux-amd64
│   ├── Documentation
│   │   ├── dev-guide
│   │   │   └── apispec
│   │   │       └── swagger
│   │   │           ├── rpc.swagger.json
│   │   │           ├── v3election.swagger.json
│   │   │           └── v3lock.swagger.json
│   │   └── README.md
│   ├── etcd
│   ├── etcdctl
│   ├── etcdutl
│   ├── README-etcdctl.md
│   ├── README-etcdutl.md
│   ├── README.md
│   └── READMEv2-etcdctl.md
└── etcd-v3.5.7-linux-amd64.tar.gz

其中 etcd-v3.5.7-linux-amd64.tar.gz 是下载的 etcdctl 文件压缩包,文件 c-8d6fk-rl-bmmmn_2023-01-17T19:33:26Z.rkestate 是该 K8s 集群的各种内容和证书等合并的文件,文件 c-8d6fk-rl-bmmmn_2023-01-17T19:33:26Z 就是我们需要的 etcd 快照 db 文件。

5、删除 /var/lib/etcd 目录,你最好改个名或者移走别直接删了(如果这个目录存在肯定不行,下面恢复快照时 etcdctl 会自动创建)

4、在 etcd-v3.5.7-linux-amd64 目录中执行快照恢复命令,如下:

./etcdctl snapshot restore /home/restore/backup/c-8d6fk-rl-bmmmn_2023-01-17T19:33:26Z --data-dir="/var/lib/etcd

5、最后启动 etcd 容器,查看日志就发现已经正常了,第二个机器同理操作,如果三个 master 都坏了,只要快照文件在,分别操作后启动容器也是没问题的。

参考资料:https://www.xtplayer.cn/rancher/backup-restore/rancher-custom-cluster-restore/


(END)

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐