k8s-kubernetes--etcd的备份和恢复


1.etcd介绍

官方网址:https://etcd.io/docs/v3.6/op-guide/recovery/
k8s相关网址:https://v1-25.docs.kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/#restoring-an-etcd-cluster
etcd拉起过程:
kubelet自动扫描/etc/kubernetes/manifests目录(如下图),如果发现.yaml文件自动拉起来
在这里插入图片描述

在这里插入图片描述

Etcd被形容为Kubernetes集群的大脑,是 Kubernetes的关键组件,因为它存储了集群的全部状态:其配置,规格以及运行中的工作负载的状态
在Kubernetes世界中,etcd用作服务发现的后端,并存储集群的状态及其配置
Etcd被部署为一个集群,几个节点的通信由Raft算法处理。在生产环境中,集群包含奇数个节点,并且至少需要三个。

以下来自Heptio博客的序列图显示了在简单的Pod创建过程中涉及的组件。它很好地说明了API服务器和etcd的交互作用。
在这里插入图片描述

2.重新搭建集群环境

由于在k8s高可用集群实验后做该实验,我们需要重新初始化集群环境
[root@k8s2 ~]# kubeadm reset
[root@k8s2 ~]# vim kubeadm-init.yaml ##去掉高可用实验时加入的负载均衡地址(25行左右)
[root@k8s3 ~]# kubeadm reset
[root@k8s4 ~]# kubeadm reset
k8s2作为control-plane执行初始化(如下图),然后在k8s3和k8s4节点执行生成的token使这两个节点加入集群即可
在这里插入图片描述
[root@k8s2 ~]# kubectl get node ##
NAME STATUS ROLES AGE VERSION
k8s2 Ready control-plane 90m v1.25.0
k8s3 Ready 89m v1.25.0
k8s4 Ready 89m v1.25.0

3.etcd的备份

  • 所有 Kubernetes 对象都存储在 etcd 上。 定期备份 etcd 集群数据对于在灾难场景(例如丢失所有控制平面节点)下恢复 Kubernetes 集群非常重要。 快照文件包含所有 Kubernetes 状态和关键信息。为了保证敏感的 Kubernetes 数据的安全,可以对快照文件进行加密

  • 备份 etcd 集群可以通过两种方式完成:etcd 内置快照和卷快照。也可以使用 etcdctl 选项的快照;

本实验我们采用etcdctl 选项的快照.

在这里插入图片描述
得到etcdctl命令
为了版本能够对应,我们未采用安装一个etcdctl,而是从镜像中拷贝etcdctl二进制命令,具体操作如下:

从镜像中拷贝etcdctl二进制命令(需确保docker服务开启:systemct status docker)
[root@k8s2 ~]# docker run -it --rm reg.westos.org/k8s/etcd:3.5.4-0 sh
输入ctrl+pq快捷键,把容器打入后台

获取容器id
[root@k8s2 ~]# docker ps
CONTAINER ID   IMAGE                             COMMAND   CREATED         STATUS         PORTS                               NAMES
c8a2291ce220   reg.westos.org/k8s/etcd:3.5.4-0   "sh"      5 seconds ago   Up 4 seconds   2379-2380/tcp, 4001/tcp, 7001/tcp   vibrant_ishizaka

从容器拷贝命令到本机                                       ##上课实验时命令路径查看:docker history reg.westos.org/k8s/etcd:3.5.4-0
[root@k8s2 bin]# docker container cp c8a2291ce220:/usr/local/bin/etcdctl /usr/local/bin

[root@k8s2 ~]# which etcdctl
/usr/local/bin/etcdctl

删除容器
[root@k8s2 bin]# docker rm -f c8a2291ce220

备份
[root@k8s2 etcd]# ETCDCTL_API=3 etcdctl --endpoints 192.168.56.12:2379 --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt snapshot save /tmp/snapshotdb

注:
ETCDCTL_API=3 ----###v3版本
etcdctl --endpoints 192.168.56.12:2379 ----###
–cert=/etc/kubernetes/pki/etcd/server.crt----###证书位置
–key=/etc/kubernetes/pki/etcd/server.key----###key位置
–cacert=/etc/kubernetes/pki/etcd/ca.crt —###ca位置,因为有安全通信
snapshot save /tmp/snapshotdb----###创建snapshot(快照)的位置:/tmp/snapshotdb
如果加:member list----###列出成员
在这里插入图片描述

查看快照状态
[root@k8s2 etcd]# ETCDCTL_API=3 etcdctl --endpoints 192.168.56.12:2379 --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt –write-out=table snapshot status /tmp/snapshotdb
注:
–write-out=table snapshot status /tmp/snapshotdb----###表示输出的时候通过表格的方式进行显示
在这里插入图片描述

删除集群资源
[root@k8s2 etcd]# kubectl get pod        ##pod为提前建好,等会恢复即可证明实验成功
NAME                    READY   STATUS    RESTARTS   AGE
myapp-fcfbd4477-8mg4l   1/1     Running   0          27m
myapp-fcfbd4477-h52c9   1/1     Running   0          27m
myapp-fcfbd4477-s7nf2   1/1     Running   0          27m
[root@k8s2 etcd]# kubectl delete  deployments.apps myapp
deployment.apps "myapp" deleted
[root@k8s2 etcd]# kubectl get pod         ##已经删除干净
No resources found in default namespace.

4.etcd数据的恢复

下图需注意:如果是集群恢复,需要将control-plane节点全部停止API,逐个进行恢复;所以集群恢复更加麻烦
在这里插入图片描述
在/etc/kubernetes/manifests/目录中,所有的核心示例都用静态pod定义;
所以,停止所有核心组件,把该目录的文件移走即可;kubelet会扫描该目录,则对应容器自动停止

停止所有核心组件
[root@k8s2 etcd]# cd /etc/kubernetes/manifests/
[root@k8s2 manifests]# ls
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml
[root@k8s2 manifests]# mv * /mnt/

移除yaml文件后对应容器自动停止:只剩下下图所示,kubectl命令无法使用
在这里插入图片描述

从快照恢复
[root@k8s2 manifests]# cd /var/lib/etcd/           ##所有数据的位置目录
[root@k8s2 etcd]# ls
member
[root@k8s2 etcd]# mv member/ /tmp/        ##为了不覆盖,把member目录移走
[root@k8s2 etcd]# ETCDCTL_API=3 etcdctl snapshot restore --data-dir /var/lib/etcd/ /tmp/snapshotdb
                ##恢复快照;指定数据目录为/var/lib/etcd/ ;快照位置:/tmp/snapshotdb
[root@k8s2 etcd]# ls       
member                      ##恢复后的新目录

重启所有组件
[root@k8s2 ~]# cd /etc/kubernetes/manifests/
[root@k8s2 manifests]# mv /mnt/* .

yaml文件移动回来后容器自动启动
在这里插入图片描述
测试:

所有集群节点重启kubelet服务
[root@k8s2 manifests]# systemctl  restart kubelet
[root@k8s3 ~]# systemctl  restart kubelet
[root@k8s4 ~]# systemctl  restart kubelet

看到pod恢复表示成功
[root@k8s2 manifests]# kubectl get pod          ##删除的pod已经恢复,pod的name等都不变
NAME                    READY   STATUS    RESTARTS   AGE
myapp-fcfbd4477-8mg4l   1/1     Running   0          34m
myapp-fcfbd4477-h52c9   1/1     Running   0          34m
myapp-fcfbd4477-s7nf2   1/1     Running   0          34m

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 对于k8s etcd备份恢复,可以按照以下步骤进行操作。首先,确保已经有了备份文件。可以使用以下命令检查备份文件是否存在:\[1\] 如果备份文件不存在,则需要重新执行备份命令并输入正确的备份文件时间。接下来,可以使用etcdctl命令进行备份恢复。根据备份文件的位置和名称,使用以下命令进行恢复:\[3\] ``` ETCDCTL_API=3 etcdctl snapshot restore /path/to/etcd-snapshot.db \ --data-dir /path/to/etcd-data-dir \ --initial-cluster <etcd-cluster-endpoints> \ --initial-cluster-token <cluster-token> \ --initial-advertise-peer-urls <peer-urls> ``` 其中,`/path/to/etcd-snapshot.db`是备份文件的路径和名称,`/path/to/etcd-data-dir`是etcd数据目录的路径,`<etcd-cluster-endpoints>`是etcd集群的节点地址,`<cluster-token>`是集群的令牌,`<peer-urls>`是etcd节点的URL。根据实际情况替换这些参数。执行命令后,etcd将使用备份文件恢复数据到指定的数据目录。 需要注意的是,恢复过程可能需要一些时间,具体时间取决于备份文件的大小和系统性能。恢复完成后,可以启动etcd集群并验证数据是否成功恢复。 请注意,备份恢复是一个敏感的操作,务必谨慎执行,并确保备份文件的完整性和可用性。在执行恢复操作之前,建议先进行测试和验证,以确保备份文件可用并且可以成功恢复数据。 希望以上信息对您有所帮助。如果还有其他问题,请随时提问。 #### 引用[.reference_title] - *1* [k8s etcd 备份恢复](https://blog.csdn.net/liudongyang123/article/details/124145618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [KubernetesETCD集群备份恢复](https://blog.csdn.net/heian_99/article/details/123398209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值