在Kubernetes集群中,etcd是保存集群状态和配置信息的关键组件。定期备份etcd数据对于确保集群可靠性和恢复性至关重要。本教程将向您展示如何进行etcd备份和还原操作。
etcd基本使用
下面通过Kubernetes 练习环境Killercoda进行实操。使用github账号登录到Killercoda平台上,该平台目前使用的是最新版本的Kubernetes。
该系统上也安装了etcd cli 客户端,如果没有安装,可以执行下面的命令进行安装:
apt install etcd-client
etcdcli
客户端与etcd采用证书方式进行通信,kubeadm方式部署的Kubernetes可以通过yaml文件查看etcd的证书路径。
--initial-advertise-peer-urls
:集群间会通告,此为通告地址,声明节点端口,2380集群中使用,2379客户端使用
或者使用kubectl get pods etcd-controlplane -o yaml -n kube-system
方式查看证书的路径信息。如下图:
通上述了解了etcd的基本使用方法。下面通过一个案例进行详细的讲解etcd的备份与还原操作。
创建Nginx
通过下面的命令创建具有多个副本的 nginx 部署,这些副本将用于验证 etcd 数据的恢复。
kubectl create deployment nginx —-image=nginx --replicas=3
验证新部署的 Pod 是否处于运行状态:
备份etcd数据
为etcd备份创建一个备份目录etcd-backup
运行以下命令进行 etcd 备份。
export ETCDCTL_API=3
mkdir etcd-backup
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save ./etcd-backup/etcdbackup.db
cacert、cert和key这些证书文件,可以通过查看etcd.yaml文件。路径是
/etc/kubernetes/manifests/
执行完如下图:
验证备份数据
运行以下命令,以从新备份数据中获取密钥列表和详细信息
etcdctl --write-out=table snapshot status ./etcd-backup/etcdbackup.db
执行完命令后如下图:
还原etcd数据
- 我们将删除之前创建的 nginx 部署,然后恢复备份,以便恢复 nginx 部署。
controlplane $ kubectl delete deployments.apps nginx
deployment.apps "nginx" deleted
- 将数据从备份恢复,执行如下命令:
controlplane $ export ETCDCTL_API=3
controlplane $ mkdir -p /var/lib/restore
controlplane $ etcdctl snapshot restore etcd-backup/etcdbackup.db --data-dir=/var/lib/restore
--data-dir
:是指定数据还原的路径位置
- 执行完上述命令会在指定的目录下生成etcd数据文件,如下图:
- 现在我们需要停止所有正在运行的 Kubernetes 组件以更新 etcd 数据。为此,我们在
/etc/kubernetes/manifests/
文件夹中放置了 kubernetes 组件的清单文件,我们将临时将此文件移出此路径,kubelet 将自动删除这些 pod。
mkdir tmp
mv /etc/kubernetes/manifests/* tmp/
把
/etc/kubernetes/manifests/
目录下的组件yaml文件,移走容器就开始删除。可以通过crictl ps -a
查看
- 等待组件容器删除后,我们需要修改
etcd.yaml
组件的etcd-data
中的hostPath
路径参数
...省略...
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/restore
type: DirectoryOrCreate
name: etcd-data
status: {}
/var/lib/restore就是数据还原的路径。
- 把
tmp
目录下的yaml文件,重新移动到/etc/kubernetes/manifests/
mv /etc/kubernetes/manifests/tmp/*.yaml /etc/kubernetes/manifests/
- 验证k8s集群是否正常
controlplane $ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy ok
controlplane $ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-7854ff8877-6t6dl 1/1 Running 0 46m
nginx-7854ff8877-l6dq8 1/1 Running 0 46m
nginx-7854ff8877-pbkq9 1/1 Running 0 46m
通过按照以上步骤进行etcd备份和还原,您可以确保在紧急情况下能够迅速有效地恢复Kubernetes集群的状态。
CKA真题
真题截图
中文解析
此项目无需更改配置环境,但是,在执行此项目之前,请确保您已返回初始节点。etcd 这道题真实考试为第 4 题,用的集群是真实考试时的上一题的集群,即真题第 3 题 mk8s,所以无需再切换集群了。
Task
首先,为运行在
https://127.0.0.1:2379
上的现有 etcd 实例创建快照并将快照保存到/srv/data/etcd-snapshot.db
文件。为给定实例创建快照预计能在几秒钟内完成。 如果该操作似乎挂起,则命令可能有问题。用 CTRL + C 来取消操作然后重试。
然后还原位于 /var/lib/backup/etcd-snapshot-previous.db 的现有先前快照。
提供了以下 TLS 证书和密钥,以通过 etcdctl 连接到服务器:
CA证书:
/opt/KUIN00601/ca.crt
客户端证书:
/opt/KUIN00601/etcd-client.crt
客户端密钥:
/opt/KUIN00601/etcd-client.key
官方参考文档
解题作答
- 备份
- 如果不使用
export ETCDCTL_API=3
,而使用ETCDCTL_API=3
,则下面每条 etcdctl 命令前都要加ETCDCTL_API=3
。 - 如果执行时,提示
permission denied
,则是权限不够,命令最前面加 sudo 即可。
export ETCDCTL_API=3
- 先检查考试环境有没有题目说的目录 /srv/data/,没有的话则需要自己创建
mkdir -p /srv/data
- 备份时etcdctl客户端需要带上证书,,用题目给的三个证书
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/opt/KUIN00601/ca.crt
--cert=/opt/KUIN00601/etcd-client.crt
--key=/opt/KUIN00601/etcd-client.key
save /srv/data/etcd-snapshot.db
可以使用etcdctl --write-out=table snapshot status /srv/data/etcd-snapshot.db
验证备份的数据。
- 还原操作
- 先创建一个还原数据存储的目录
mkdir -p /var/lib/restore
- 执行还原操作,并指定还原数据存储目录
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/opt/KUIN00601/ca.crt
--cert=/opt/KUIN00601/etcd-client.crt
--key=/opt/KUIN00601/etcd-client.key
snapshot restore /var/lib/backup/etcd-snapshot-previous.db \
--data-dir=/var/lib/restore
- 移走
/etc/kubernetes/manifests/
到临时目录下tmp
mkdir -p /home/tmp
mv /etc/kubernetes/manifests/*.yaml /home/tmp
- 在
/home/tmp
目录下编辑etcd.yaml
文件,修改etcd-data
的hostPath
路径为/var/lib/restore
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/restore
type: DirectoryOrCreate
name: etcd-data
status: {}
- 重新把
/home/tmp
目录下的组件文件移动/etc/kubernetes/manifests/
mv /home/tmp/*.yaml /etc/kubernetes/manifests/
- 验证k8s集群是否正常
controlplane $ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
etcd-0 Healthy ok
scheduler Healthy ok
到此整个etcd备份与还原操作就完成了。