kubernetes etcd数据的备份与恢复

Lance.Wu 发表于: 2023-05-24   最后更新时间: 2023-05-24 10:50:13  
{{totalSubscript}} 订阅, 2,058 游览

备份与恢复

所有 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/

更新于 2023-05-24

半兽人 1年前

如果我的kuberneters集群机器都泡水了,只剩备份文件,我能恢复吗? 新搭建的集群去还原的话ip,node名什么的都变了,能行吗

Lance.Wu -> 半兽人 1年前

kubernetes集群机器泡水,新搭建的ETCD证书重新创建了,剩下的备份文件也没有用,无法进行还原操作。

半兽人 -> Lance.Wu 1年前

为什么?

Lance.Wu -> 半兽人 1年前

使用etcdctl还原数据时,需要使用ca.crt、server.crt、server.key还原,集群会对证书加密的数据进行验证操作。一但证书被替换则无法通过验证。

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章