0%

kubernetes etcd 数据备份与恢复

Kubernetes 使用 Etcd 数据库实时存储集群中的数据,如何备份与恢复 Etcd 数据

备份 Etcd 数据

查询 ETCD 镜像

1
2
3
$ docker images | grep etcd
k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 10 months ago 288MB
registry.aliyuncs.com/google_containers/etcd 3.4.3-0 303ce5db0e90 10 months ago 288MB

备份 Etcd 数据

运行 Etcd 镜像,并且使用镜像内部的 etcdctl 工具连接 etcd 集群,执行数据快照备份:

  • /bin/sh -c:执行 shell 命令
  • –env:设置环境变量,指定 etcdctl 工具使用的 API 版本
  • -v:docker 挂载选项,用于挂载 Etcd 证书相关目录以及备份数据存放的目录
  • –cacert:etcd CA 证书
  • –key:etcd 客户端证书 key
  • –cert:etcd 客户端证书 crt
  • –endpoints:指定 ETCD 连接地址
  • etcdctl snapshot save:etcd 数据备份
1
2
3
4
5
6
7
8
9
10
$ docker run --rm                                    \
-v /data/backup:/backup \
-v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \
--env ETCDCTL_API=3 \
k8s.gcr.io/etcd:3.4.3-0 \
/bin/sh -c "etcdctl --endpoints=https://10.168.4.5:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
snapshot save /backup/etcd-snapshot.db"

恢复 ETCD 数据

在 Etcd 数据损坏时,可以通过 Etcd 备份数据进行数据恢复,先暂停 Kubernetes 相关组件,然后进入 Etcd 镜像使用 etcdctl 工具执行恢复操作。

暂停 Kube-Apiserver 与 Etcd 镜像

在恢复 Etcd 数据前,需要停止 kube-apiserver 与 etcd 镜像,因为当这俩镜像停止后 Kubernetes 会自动重启这俩镜像,所以我们可以先暂时移除 /etc/kubernetes/manifests 目录,Kubernetes 检测这个目录文件不存在时会停止 Kubernetes 系统相关镜像,使其不能重启,方便我们进行后续的操作。

1
2
3
4
5
6
7
8
## 移除且备份 /etc/kubernetes/manifests 目录
$ mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak

## 查看 kube-apiserver、etcd 镜像是否停止
$ docker ps|grep etcd && docker ps|grep kube-apiserver

## 备份现有 Etcd 数据
$ mv /var/lib/etcd /var/lib/etcd.bak

恢复 Etcd 数据

运行 Etcd 镜像,然后执行数据恢复,默认会恢复到 /default.etcd/member/ 目录下,这里使用 mv 命令在移动到挂载目录 /var/lib/etcd/ 下。

  • /bin/sh -c:执行 shell 命令
  • –env:设置环境变量,指定 etcdctl 工具使用的 API 版本
  • -v:docker 挂载选项,用于挂载 Etcd 证书相关目录以及备份数据存放的目录
  • etcdctl snapshot restore:etcd 数据恢复。
1
2
3
4
5
6
docker run --rm              \
-v /data/backup:/backup \
-v /var/lib/etcd:/var/lib/etcd \
--env ETCDCTL_API=3 \
k8s.gcr.io/etcd:3.4.3-0 \
/bin/sh -c "etcdctl snapshot restore /backup/etcd-snapshot.db; mv /default.etcd/member/ /var/lib/etcd/"

恢复 Kube-Apiserver 与 Etcd 镜像

将 /etc/kubernetes/manifests 目录恢复,使 Kubernetes 重启 Kube-Apiserver 与 Etcd 镜像:

1
$ mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests

执行 Kubectl 命令进行检测

1
$ kubectl get node