集群备份恢复 k8s Kubernetes

Kubernetes - 集群备份和恢复

Posted on 2020-10-23,12 min read

一、备份

思路:

①集群运行中 etcd 数据备份到磁盘上

②kubeasz 项目创建的集群,需要备份 CA 证书文件,以及 ansible 的 hosts 文件

【deploy 节点操作】

1:创建存放备份文件目录

mkdir -p /backup/k8s1

2:etcd 数据保存到备份目录下

ETCDCTL_API=3 etcdctl snapshot save /backup/k8s1/snapshot.db
Snapshot saved at /backup/k8s1/snapshot.db

du -h /backup/k8s1/snapshot.db 

4 1.6M    /backup/k8s1/snapshot.db

3:拷贝 kubernetes 目录下 ssl 文件

cp /etc/kubernetes/ssl/* /backup/k8s1/
ll /backup/k8s1/

总用量 1628
-rw-r--r--. 1 root root 1675 12月 10 21:21 admin-key.pem
-rw-r--r--. 1 root root 1391 12月 10 21:21 admin.pem
-rw-r--r--. 1 root root 997 12月 10 21:21 aggregator-proxy.csr
-rw-r--r--. 1 root root 219 12月 10 21:21 aggregator-proxy-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 aggregator-proxy-key.pem
-rw-r--r--. 1 root root 1383 12月 10 21:21 aggregator-proxy.pem
-rw-r--r--. 1 root root 294 12月 10 21:21 ca-config.json
-rw-r--r--. 1 root root 1675 12月 10 21:21 ca-key.pem
-rw-r--r--. 1 root root 1350 12月 10 21:21 ca.pem
-rw-r--r--. 1 root root 1082 12月 10 21:21 kubelet.csr
-rw-r--r--. 1 root root 283 12月 10 21:21 kubelet-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 kubelet-key.pem
-rw-r--r--. 1 root root 1452 12月 10 21:21 kubelet.pem
-rw-r--r--. 1 root root 1273 12月 10 21:21 kubernetes.csr
-rw-r--r--. 1 root root 488 12月 10 21:21 kubernetes-csr.json
-rw-------. 1 root root 1679 12月 10 21:21 kubernetes-key.pem
-rw-r--r--. 1 root root 1639 12月 10 21:21 kubernetes.pem
-rw-r--r--. 1 root root 1593376 12月 10 21:32 snapshot.db

4:模拟集群崩溃,执行 clean.yml 清除操作

cd /etc/ansible/
ansible-playbook 99.clean.yml 

二、恢复

【deploy 节点操作】

1:恢复 ca 证书

mkdir -p /etc/kubernetes/ssl
cp /backup/k8s1/ca* /etc/kubernetes/ssl/

2:开始执行重建集群操作

ansible-playbook 01.prepare.yml
ansible-playbook 02.etcd.yml
ansible-playbook 03.docker.yml
nsible-playbook 04.kube-master.yml
ansible-playbook 05.kube-node.yml

3:暂停 etcd 服务

ansible etcd -m service -a 'name=etcd state=stopped'

4:清空数据

cp /etc/kubernetes/ssl/* /backup/k8s1/
ll /backup/k8s1/
总用量 1628
-rw-r--r--. 1 root root 1675 12月 10 21:21 admin-key.pem
-rw-r--r--. 1 root root 1391 12月 10 21:21 admin.pem
-rw-r--r--. 1 root root 997 12月 10 21:21 aggregator-proxy.csr
-rw-r--r--. 1 root root 219 12月 10 21:21 aggregator-proxy-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 aggregator-proxy-key.pem
-rw-r--r--. 1 root root 1383 12月 10 21:21 aggregator-proxy.pem
-rw-r--r--. 1 root root 294 12月 10 21:21 ca-config.json
-rw-r--r--. 1 root root 1675 12月 10 21:21 ca-key.pem
-rw-r--r--. 1 root root 1350 12月 10 21:21 ca.pem
-rw-r--r--. 1 root root 1082 12月 10 21:21 kubelet.csr
-rw-r--r--. 1 root root 283 12月 10 21:21 kubelet-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 kubelet-key.pem
-rw-r--r--. 1 root root 1452 12月 10 21:21 kubelet.pem
-rw-r--r--. 1 root root 1273 12月 10 21:21 kubernetes.csr
-rw-r--r--. 1 root root 488 12月 10 21:21 kubernetes-csr.json
-rw-------. 1 root root 1679 12月 10 21:21 kubernetes-key.pem
-rw-r--r--. 1 root root 1639 12月 10 21:21 kubernetes.pem
-rw-r--r--. 1 root root 1593376 12月 10 21:32 snapshot.db

5:将备份的 etcd 数据文件同步到每个 etcd 节点上

cp /etc/kubernetes/ssl/* /backup/k8s1/
ll /backup/k8s1/
总用量 1628
-rw-r--r--. 1 root root 1675 12月 10 21:21 admin-key.pem
-rw-r--r--. 1 root root 1391 12月 10 21:21 admin.pem
-rw-r--r--. 1 root root 997 12月 10 21:21 aggregator-proxy.csr
-rw-r--r--. 1 root root 219 12月 10 21:21 aggregator-proxy-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 aggregator-proxy-key.pem
-rw-r--r--. 1 root root 1383 12月 10 21:21 aggregator-proxy.pem
-rw-r--r--. 1 root root 294 12月 10 21:21 ca-config.json
-rw-r--r--. 1 root root 1675 12月 10 21:21 ca-key.pem
-rw-r--r--. 1 root root 1350 12月 10 21:21 ca.pem
-rw-r--r--. 1 root root 1082 12月 10 21:21 kubelet.csr
-rw-r--r--. 1 root root 283 12月 10 21:21 kubelet-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 kubelet-key.pem
-rw-r--r--. 1 root root 1452 12月 10 21:21 kubelet.pem
-rw-r--r--. 1 root root 1273 12月 10 21:21 kubernetes.csr
-rw-r--r--. 1 root root 488 12月 10 21:21 kubernetes-csr.json
-rw-------. 1 root root 1679 12月 10 21:21 kubernetes-key.pem
-rw-r--r--. 1 root root 1639 12月 10 21:21 kubernetes.pem
-rw-r--r--. 1 root root 1593376 12月 10 21:32 snapshot.db

6:在每个 etcd 节点执行下面数据恢复操作,然后重启 etcd

## 说明:在 / etc/systemd/system/etcd.service 找到 --inital-cluster etcd1=https://xxxx:2380,etcd2=https://xxxx:2380,etcd3=https://xxxx:2380 替换恢复命令中的 --initial-cluster{ } 变量,--name=【当前 etcd-node-name】, 最后还需要填写当前节点的 IP:2380

①【deploy 操作】

cp /etc/kubernetes/ssl/* /backup/k8s1/
ll /backup/k8s1/
总用量 1628
-rw-r--r--. 1 root root 1675 12月 10 21:21 admin-key.pem
-rw-r--r--. 1 root root 1391 12月 10 21:21 admin.pem
-rw-r--r--. 1 root root 997 12月 10 21:21 aggregator-proxy.csr
-rw-r--r--. 1 root root 219 12月 10 21:21 aggregator-proxy-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 aggregator-proxy-key.pem
-rw-r--r--. 1 root root 1383 12月 10 21:21 aggregator-proxy.pem
-rw-r--r--. 1 root root 294 12月 10 21:21 ca-config.json
-rw-r--r--. 1 root root 1675 12月 10 21:21 ca-key.pem
-rw-r--r--. 1 root root 1350 12月 10 21:21 ca.pem
-rw-r--r--. 1 root root 1082 12月 10 21:21 kubelet.csr
-rw-r--r--. 1 root root 283 12月 10 21:21 kubelet-csr.json
-rw-------. 1 root root 1675 12月 10 21:21 kubelet-key.pem
-rw-r--r--. 1 root root 1452 12月 10 21:21 kubelet.pem
-rw-r--r--. 1 root root 1273 12月 10 21:21 kubernetes.csr
-rw-r--r--. 1 root root 488 12月 10 21:21 kubernetes-csr.json
-rw-------. 1 root root 1679 12月 10 21:21 kubernetes-key.pem
-rw-r--r--. 1 root root 1639 12月 10 21:21 kubernetes.pem
-rw-r--r--. 1 root root 1593376 12月 10 21:32 snapshot.db

执行上面步骤后,会在当前节点目录下,生成一个【node-name】.etcd 目录文件

tree etcd1.etcd/

etcd1.etcd/
└── member
    ├── snap
    │   ├── 0000000000000001-0000000000000003.snap
    │   └── db
    └── wal
        └── 0000000000000000-0000000000000000.wal
        
cp -r etcd1.etcd/member /var/lib/etcd/
systemctl restart etcd

②【etcd2 节点操作】

cd /backup/k8s1/
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db  --name etcd2 --initial-cluster etcd1=https://192.168.1.200:2380,etcd2=https://192.168.1.202:2380,etcd3=https://192.168.1.203:2380  --initial-cluster-token etcd-cluster-0 --initial-advertise-peer-urls https://192.168.1.202:2380
2019-12-10 22:28:35.175032 I | mvcc: restore compact to 46505
2019-12-10 22:28:35.232386 I | etcdserver/membership: added member 12229714d8728d0e [https://192.168.1.200:2380] to cluster b8ef796b710cde7d
2019-12-10 22:28:35.232507 I | etcdserver/membership: added member 552fb05951af50c9 [https://192.168.1.203:2380] to cluster b8ef796b710cde7d
2019-12-10 22:28:35.232541 I | etcdserver/membership: added member 8b4f4a6559bf7c2c [https://192.168.1.202:2380] to cluster b8ef796b710cde7d

tree etcd2.etcd/
etcd2.etcd/
└── member
    ├── snap
    │   ├── 0000000000000001-0000000000000003.snap
    │   └── db
    └── wal
        └── 0000000000000000-0000000000000000.wal
cp -r etcd1.etcd/member /var/lib/etcd/
systemctl restart etcd

③【etcd3 节点操作】

cd /backup/k8s1/
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db  --name etcd2 --initial-cluster 

etcd1=https://192.168.1.200:2380,etcd2=https://192.168.1.202:2380,etcd3=https://192.168.1.203:2380  --initial-cluster-token etcd-cluster-0 --initial-advertise-peer-urls https://192.168.1.202:2380
2019-12-10 22:28:35.175032 I | mvcc: restore compact to 46505
2019-12-10 22:28:35.232386 I | etcdserver/membership: added member 12229714d8728d0e [https://192.168.1.200:2380] to cluster b8ef796b710cde7d
2019-12-10 22:28:35.232507 I | etcdserver/membership: added member 552fb05951af50c9 [https://192.168.1.203:2380] to cluster b8ef796b710cde7d
2019-12-10 22:28:35.232541 I | etcdserver/membership: added member 8b4f4a6559bf7c2c [https://192.168.1.202:2380] to cluster b8ef796b710cde7d

tree etcd2.etcd/

etcd2.etcd/
└── member
    ├── snap
    │   ├── 0000000000000001-0000000000000003.snap
    │   └── db
    └── wal
        └── 0000000000000000-0000000000000000.wal

cp -r etcd1.etcd/member /var/lib/etcd/
systemctl restart etcd

6:在 deploy 节点上操作重建网络

cd /etc/ansible/

ansible-playbook tools/change_k8s_network.yml 

7:查看 pod、svc 恢复是否成功

kubectl get svc

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.68.0.1       <none>        443/TCP    5d5h
nginx        ClusterIP   10.68.241.175   <none>        80/TCP     5d4h
tomcat       ClusterIP   10.68.235.35    <none>        8080/TCP   76m
kubectl get svc

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.68.0.1       <none>        443/TCP    5d5h
nginx        ClusterIP   10.68.241.175   <none>        80/TCP     5d4h
tomcat       ClusterIP   10.68.235.35    <none>        8080/TCP   76m

三、自动备份、自动恢复

1:一键备份

ansible-playbook /etc/ansible/23.backup.yml 

2:模拟故障

ansible-playbook /etc/ansible/99.clean.yml

修改文件 / etc/ansible/roles/cluster-restore/defaults/main.yml,指定要恢复的 etcd 快照备份,如果不修改就是最新的一次

3:执行自动恢复操作

ansible-playbook /etc/ansible/24.restore.yml

ansible-playbook /etc/ansible/tools/change_k8s_network.yml 

下一篇: kubernetes集群证书更新→