备份与恢复
所有 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 的描述中获得 endpoints
、trusted-ca-file
、cert-file
和 key-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/
如果我的kuberneters集群机器都泡水了,只剩备份文件,我能恢复吗? 新搭建的集群去还原的话ip,node名什么的都变了,能行吗
kubernetes集群机器泡水,新搭建的ETCD证书重新创建了,剩下的备份文件也没有用,无法进行还原操作。
为什么?
使用etcdctl还原数据时,需要使用ca.crt、server.crt、server.key还原,集群会对证书加密的数据进行验证操作。一但证书被替换则无法通过验证。