前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes - 集群备份和恢复

Kubernetes - 集群备份和恢复

作者头像
jwangkun
发布2021-12-23 16:45:16
7410
发布2021-12-23 16:45:16
举报
文章被收录于专栏:John Wong's BlogJohn Wong's Blog

一、备份

思路:

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

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

【deploy 节点操作】

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

代码语言:javascript
复制
mkdir -p /backup/k8s1

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

代码语言:javascript
复制
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 文件

代码语言:javascript
复制
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 清除操作

代码语言:javascript
复制
cd /etc/ansible/
代码语言:javascript
复制
ansible-playbook 99.clean.yml 

二、恢复

【deploy 节点操作】

1:恢复 ca 证书

代码语言:javascript
复制
mkdir -p /etc/kubernetes/ssl
cp /backup/k8s1/ca* /etc/kubernetes/ssl/

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

代码语言:javascript
复制
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 服务

代码语言:javascript
复制
ansible etcd -m service -a 'name=etcd state=stopped'

4:清空数据

代码语言:javascript
复制
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 节点上

代码语言:javascript
复制
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 操作】

代码语言:javascript
复制
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 目录文件

代码语言:javascript
复制
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 节点操作】

代码语言:javascript
复制
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 节点操作】

代码语言:javascript
复制
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 节点上操作重建网络

代码语言:javascript
复制
cd /etc/ansible/

ansible-playbook tools/change_k8s_network.yml 

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

代码语言:javascript
复制
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
代码语言:javascript
复制
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:一键备份

代码语言:javascript
复制
ansible-playbook /etc/ansible/23.backup.yml 

2:模拟故障

代码语言:javascript
复制
ansible-playbook /etc/ansible/99.clean.yml

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

3:执行自动恢复操作

代码语言:javascript
复制
ansible-playbook /etc/ansible/24.restore.yml

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明:在 / 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
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档