一、备份
思路:
①集群运行中 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集群证书更新→