返回到文章

采纳

编辑于 1年前

kubernetes etcd数据的备份与恢复

kubernetes
运维指南

备份与恢复

所有 Kubernetes 对象都存储在 etcd 上。 定期备份 etcd 集群数据对于在灾难场景(例如丢失所有控制平面节点)下恢复 Kubernetes 集群非常重要。 快照文件包含所有 Kubernetes 状态和关键信息。为了保证敏感的 Kubernetes 数据的安全,可以对快照文件进行加密。

备份

快照可以从使用 etcdctl snapshot save 命令的活动成员中获取。

获取 etcdctl 工具

[root@m51 ~]# etcdctl
-bash: etcdctl: command not found

通容器找到etcdctl工具

根据找找命令获取工具。find / -name etcdctl , 再将命令复制到/usr/bin/目录下,并进行验证。

[root@m51 ~]# find / -name etcdctl
/var/lib/docker/overlay2/d4cf2ee0ea5ba2105936897d3d478c38a23ba6fb65593dc808a559e2dc67667a/diff/usr/local/bin/etcdctl
...
[root@m51 ~]# cp /var/lib/docker/overlay2/d4cf2ee0ea5ba2105936897d3d478c38a23ba6fb65593dc808a559e2dc67667a/diff/usr/local/bin/etcdctl /usr/bin/
[root@m51 ~]# etcdctl version
etcdctl version: 3.5.3
API version: 3.5

使用命令进行备份

ETCDCTL_API=3 \
etcdctl \
--endpoints=<endpoints> \
--cacert=<trusted-ca-file>  \
--cert=<cert-file>  \
--key=<key-file> \
snapshot save <backup-file-location>

可以从 etcd Pod 的描述中获得 endpointstrusted-ca-filecert-filekey-file

[root@m51 ~]# kubectl get pod etcd-m51  -n kube-system -o yaml
apiVersion: v1
kind: Pod
...
  name: etcd-m51
  namespace: kube-system
 ...
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://10.6.122.51:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    ...
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    ...
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    ...
  • endpoints : 使用yaml文件中的 advertise-client-urls值(https://10.6.122.51:2379)

  • trusted-ca-file :使用yaml文件中的 trusted-ca-file值(/etc/kubernetes/pki/etcd/ca.crt)

  • cert: 使用yaml文件中的 cert-file值(/etc/kubernetes/pki/etcd/server.crt)

  • key: 使用yaml文件中的 key-file值(/etc/kubernetes/pki/etcd/server.key)

命令如下:

ETCDCTL_API=3 \
etcdctl \
--endpoints=https://10.6.122.51:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt  \
--cert=/etc/kubernetes/pki/etcd/server.crt  \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save sn-$(date +%y-%m-%d).db

执行命令

[root@m51 etcd-back]# ETCDCTL_API=3 \
> etcdctl \
> --endpoints=https://10.6.122.51:2379 \
> --cacert=/etc/kubernetes/pki/etcd/ca.crt  \
> --cert=/etc/kubernetes/pki/etcd/server.crt  \
> --key=/etc/kubernetes/pki/etcd/server.key \
> snapshot save sn-$(date +%y-%m-%d).db
{"level":"info","ts":"2023-05-24T10:36:24.789+0800","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"sn-23-05-24.db.part"}
{"level":"info","ts":"2023-05-24T10:36:24.809+0800","logger":"client","caller":"v3/maintenance.go:211","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2023-05-24T10:36:24.809+0800","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"https://10.6.122.51:2379"}
Snapshot saved at sn-23-05-24.db

## 进行验证
[root@m51 etcd-back]# ETCDCTL_API=3 etcdctl --write-out=table snapshot status sn-23-05-24.db
Deprecated: Use `etcdutl snapshot status` instead.

+----------+-----------+------------+------------+
|   HASH   | REVISION  | TOTAL KEYS | TOTAL SIZE |
+----------+-----------+------------+------------+
| c656b4b5 | 184373211 |      25273 |     195 MB |
+----------+-----------+------------+------------+
[root@m51 etcd-back]#

备份成功。

恢复

etcd 支持从 major.minor 或其他不同 patch 版本的 etcd 进程中获取的快照进行恢复。 还原操作用于恢复失败的集群的数据。

在启动还原操作之前,必须有一个快照文件。它可以是来自以前备份操作的快照文件, 也可以是来自剩余数据目录的快照文件。 例如:

恢复命令

ETCDCTL_API=3 etcdctl --endpoints 10.6.122.51:2379 snapshot restore sn-23-05-24.db

恢复时也可以指定操作选项,--data-dir(默认目录:/var/lib/etcd/ ) 例如:

ETCDCTL_API=3 etcdctl snapshot restore --data-dir /var/lib/etcd/ sn-23-05-24.db

参考地址:

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/