ETCD 简介
ETCD
是用于共享配置和服务发现的分布式,一致性的KV存储系统。ETCD 是k8s集群极为重要的一块服务,存储了集群所有的数据信息,如果发生灾难或者 etcd 的数据丢失,都会影响集群数据的恢复,本文重点讲如何备份和恢复数据。
备份
注意
:ETCD 不同的版本的 etcdctl 命令不一样,但大致差不多,本文备份使用 napshot save
, 每次备份一个节点
就行。
假设证书都在/etc/kubernetes/ssl/
,并且主节点域名叫做node1.etcd.k8s
1
2
3
4
5
6
7
|
$ ETCDCTL_API=3; \
ENDPOINT=node1.etcd.k8s; \
etcdctl --cacert=/etc/kubernetes/ssl/ca.pem \
--cert=/etc/kubernetes/ssl/nodecert.pem \
--key=/etc/kubernetes/ssl/nodecert-key.pem \
--endpoints=$ENDPOINT:2379 \
snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db
|
备份脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/usr/bin/bash
date;
CACERT="/etc/kubernetes/ssl/ca.pem"
NODECERT="/etc/kubernetes/ssl/nodecert.pem"
NODEEKY="/etc/kubernetes/ssl/nodecert-key.pem"
ENDPOINTS="node1.etcd.k8s"
ETCDCTL_API=3 etcdctl \
--cacert="${CACERT}" --cert="${NODECERT}" --key="${NODEEKY}" \
--endpoints=${ENDPOINTS} \
snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db
# 备份保留30天
find /data/etcd_backup_dir/ -name *.db -mtime +30 -exec rm -f {} \;
|
恢复
准备工作
- 停止所有 Master 上
kube-apiserver
服务
1
|
$ systemctl stop kube-apiserver
|
1
|
$ mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak
|
1
2
|
# 从 node1.etcd.k8s 机器上拷贝备份
scp /data/etcd_backup_dir/etcd-snapshot-${最后备份时间}.db root@${其他节点,每个节点都要执行}:/data/etcd_backup_dir/
|
恢复备份
1
2
3
4
|
# 每个节点机器上操作
$ ETCDCTL_API=3 etcdctl snapshot restore \
/data/etcd_backup_dir/etcd-snapshot-${最后备份时间}.db \
--config-file=${配置文件路径}
|
或者每个节点执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20191222.db \
--name ${etcd的节点名} \
--initial-cluster "${完整的引导初始集群配置的字符串}" \
--initial-cluster-token etcd-cluster \
--initial-advertise-peer-urls ${当前节点的peerurl} \
--data-dir=/var/lib/etcd/default.etcd
# 示例:
$ ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20231201.db \
--name etcd-0 \
--initial-cluster "etcd-0=https://192.168.1.1:2380,etcd-1=https://192.168.1.2:2380,etcd-2=https://192.168.1.3:2380" \
--initial-cluster-token etcd-cluster \
--initial-advertise-peer-urls https://192.168.1.1:2380 \
--data-dir=/var/lib/etcd/default.etcd
|
上面三台 ETCD 都恢复完成后,依次登陆三台机器启动 ETCD
三台 ETCD 启动完成,检查 ETCD 集群状态
1
2
3
4
5
6
|
$ systemctl status etcd
$ ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/ssl/ca.pem \
--cert=/etc/kubernetes/ssl/server.pem \
--key=/etc/kubernetes/ssl/server-key.pem \
--endpoints=${ENDPOINTS} endpoint health
|
三台 ETCD 全部健康,分别到每个节点启动 kube-apiserver
检查 Kubernetes 集群是否恢复正常
总结
Kubernetes 集群备份主要是备份 ETCD 集群。而恢复时,主要考虑恢复整个顺序:停止kube-apiserver --> 停止ETCD --> 恢复数据 --> 启动ETCD --> 启动kube-apiserve
注意
:由于集群的强一致性,备份ETCD集群时,只需要备份一个ETCD节点就行了,恢复时拿同一份备份数据恢复。