一、前言
Kubernets集群在企业中的运用,数据备份是至关重要的,而k8s集群数据是存储在etcd键值数据库中,倘若出现数据误删除或者服务器集群宕机等情况,会导致etcd数据的丢失或者某个etcd节点异常。此时我们最快速最有效的方法就是从备份中去恢复集群数。
二、实验环境
首先准备了一套标配的二进制部署的k8s集群,三个(master、etcd)节点+两个node节点,创建名为"test-bak"命名空间,并在下面任意创建pod数据
2.1、数据备份
etcd数据备份可以在etcd活跃的集群状态进行,且不影响集群性能
内置快照
etcd 支持内置快照。快照可以从使用 etcdctl snapshot save
命令的活动成员中创建, 也可以通过从目前没有被 etcd 进程使用的 etcd 数据目录 中拷贝 member/snap/db
文件。创建快照并不会影响 etcd 成员的性能。
2.1.1、数据快照备份
#etcdctl --endpoints="x.x.x.x:2379" \
--cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem \
--cert=/etc/kubernetes/pki/etcd/etcd.pem \
--key=/etc/kubernetes/pki/etcd/etcd-key.pem \
snapshot save /backup/etcd-snapshot.db
2.1.2、模拟数据误删除
手动清除命名空间下的pod数据,以此来模拟数据丢失问题
#kubectl delete deploy nginx
#kubectl delete ns test-bak
2.2、数据恢复
2.2.1、停止kube-apiserver服务
为了保证etcd不在与任何集群组件进行数据交互,在数据恢复之前先手动停止kube-apiserver服务
#systemctl stop kube-apiserver
2.2.2、停止etcd服务
停止etcd服务,避免数据新数据再次写入
#systemctl stop etcd
2.2.3、恢复备份
附上Kubernetes官网地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/
不同集群环境下,etcd数据目录可能不一样,在这里可以通过systemctl status etcd查看配置参数,找到对应的配置文件,重点关注下name、initial-cluster、initial-cluster-token、initial-advertise-peer-urls和data-dir参数的值,另外数据恢复需要注意两点,第一,保证当前的数据目录为空,第二自 etcd v3.5.x 起,使用 etcdctl
进行恢复的功能已被 弃用,并计划在 etcd v3.6 中移除。 建议改用 etcdutl。目前当前我是用的etcd版本为3.5.1, 经过测试,已经无法正常使用ecdctl进行数据还原了
master1数据恢复
#export ETCDCTL_API=3
#etcdutl snapshot restore /backup/etcd-snapshot.db \
--name k8s-master01 \
--initial-cluster "k8s-master01=https://x.x.x.x:2380,k8s-master02=https://x.x.x.x:2380,k8s-master03=https://x.x.x.x:2380" \
--initial-cluster-token etcd-k8s-cluster \
--initial-advertise-peer-urls https://x.x.x.x:2380 \
--data-dir /data/etcd/
master2数据恢复
#export ETCDCTL_API=3
#etcdutl snapshot restore /backup/etcd-snapshot.db \
--name k8s-master02 \
--initial-cluster "k8s-master01=https://x.x.x.x:2380,k8s-master02=https://x.x.x.x:2380,k8s-master03=https://x.x.x.x:2380" \
--initial-cluster-token etcd-k8s-cluster \
--initial-advertise-peer-urls https://x.x.x.x:2380 \
--data-dir /data/etcd/
master3数据恢复
#export ETCDCTL_API=3
#etcdutl snapshot restore /backup/etcd-snapshot.db \
--name k8s-master03 \
--initial-cluster "k8s-master01=https://x.x.x.x:2380,k8s-master02=https://x.x.x.x:2380,k8s-master03=https://x.x.x.x:2380" \
--initial-cluster-token etcd-k8s-cluster \
--initial-advertise-peer-urls https://x.x.x.x:2380 \
--data-dir /data/etcd/
2.2.4、恢复服务实例
数据恢复完毕之后,依次将节点kube-apiserver、etcd服务示例启动
#systectl start kube-apiserver
#systectl start etcd
三、回归验证
可以看到我们的"test-bak"数据已经恢复正常, PVC 持久化卷也恢复正常
四、总结
Kubernetes集群备份主要是备份etcd集群,而恢复时,主要考虑恢复整个顺序:
停止Kube-apiserver
停止etcd
恢复数据
启动etcd
启动-kubeapiserver