@TOC
ETCD是什么?
etcd 是 一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。
这里需要说明一下的是,安装好K8s集群之后,在Master节点的机器上是会自带一个etcd服务。
但是在正式的介绍开始之前需要阐述一下etcd和etcdctl 工具之间的关系是什么?
1. etcd
(服务)
etcd
是一个分布式键值存储系统,用于存储数据并确保高可用性、数据一致性和分布式协调。它常用于 Kubernetes 集群中的配置管理和服务发现。- Kubernetes 使用
etcd
来存储集群状态数据(例如 Pod 状态、服务信息、配置等),因此etcd
是 Kubernetes 集群不可或缺的一部分。 etcd
是一个服务,它运行在后台,提供 API 给外部客户端和系统进行数据操作。
2. etcdctl
(客户端工具)
etcdctl
是etcd
的命令行客户端工具,用于与etcd
服务交互。它允许用户通过命令行与etcd
进行操作,比如存取数据、检查健康状态、创建快照、恢复数据等。etcdctl
可以帮助系统管理员直接与 etcd 进行交互,执行如备份、恢复、查询键值、检查集群状态等操作。
如何安装etcdctl(客户端工具)
查看目前K8s自带etcd中的版本信息
kubectl exec -n kube-system -it etcd-master01 -- /bin/sh
安装对应版本的etcdutl工具
根据你当前的 etcd
版本(3.5.7),你应该下载与此版本匹配的 etcdutl
工具。这里需要说明一下的是etcdctl以及在近期的版本中弃用了,所以这边我们采用etcdutl工具进行备份的操作。
下载 etcdutl
3.5.7 版本
从 etcd 的官方 GitHub 发行页面下载与 etcd
版本相匹配的 etcdctl
工具。下面是下载和安装步骤:
- 访问 etcd releases 页面:etcd releases
- 找到 v3.5.7 版本,并下载适用于你系统的二进制文件。例如,对于 Linux 操作系统,下载链接为:
wget https://github.com/etcd-io/etcd/releases/download/v3.5.7/etcd-v3.5.7-linux-amd64.tar.gz
- 解压下载的文件:
tar -xvf etcd-v3.5.7-linux-amd64.tar.gz
- 将解压后的
etcdctl
文件复制到/usr/local/bin/
或其他系统路径中,以便全局使用:
sudo mv etcd-v3.5.7-linux-amd64/etcdctl /usr/local/bin/
- 验证
etcdctl
版本:
etcdutl version
配置环境变量
这块需要确保在 Kubernetes 集群的主节点上运行这些命令,并且 /etc/kubernetes/pki/etcd/ 目录中包含所需的证书和密钥文件。
直接在master主机中执行下面的命令
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS="https://127.0.0.1:2379"
export ETCDCTL_CACERT="/etc/kubernetes/pki/etcd/ca.crt"
export ETCDCTL_CERT="/etc/kubernetes/pki/etcd/server.crt"
export ETCDCTL_KEY="/etc/kubernetes/pki/etcd/server.key"
创建备份文件
这里本次是在opt/k8s路径之下,可以执行下面的命令
etcdctl snapshot save /opt/k8s/etcd-snapshot.db
命令执行完成之后会得到一个.db的备份文件。
这里需要注意一下的就是命令这块etcdctl不要写错,写错就会下面这样子的报错
验证一下备份的快照文件
在status 后面跟上备份文件的信息即可,本地备份文件名称是etcd-snapshot.db,所以命令如下,执行这个命令需要在文件所在的目录下
etcdutl --write-out=table snapshot status etcd-snapshot.db
或者要是不是在当前目录下就需要在命令中跟上你的文件所在目录是什么,示例如下
etcdutl --write-out=table snapshot status /path/to/etcd-snapshot.db
备份文件恢复的效果演示
查看一下当前etcd的容器服务信息
sudo crictl ps -a | grep etcd
查看当前etcd服务缓存的文件信息位置
文件所在的位置是/etc/kubernetes/manifests/etcd.yaml,查找--data-dir这个配置的信息
可以看到在上述路径下存在集群的配置信息
通过kuboard可视化页面查看可以得到具体的信息详情
删除配置文件信息模拟配置信息丢失
这里需要注意的一点的是,由于 Kubernetes 管理
etcd
,当你手动停止etcd
容器时,Kubernetes会自动重新启动它。这Kubernetes 的一种自我修复机制,确保关键组件(如etcd
)始终保持运行状态,以保证集群的稳定性。
- Kubernetes 控制器的自愈机制:Kubernetes 会通过其控制器(如
kubelet
和Pod
控制器)监控集群中的所有组件,包括etcd
。如果它检测到etcd
容器停止或崩溃,Kubernetes 会自动尝试重新创建并启动一个新的etcd
容器实例,以保持集群的正常运行。 - Static Pod 定义:通常
etcd
在 Kubernetes 集群中是以 Static Pod 的形式运行的。Static Pods 是由kubelet
直接管理的,而不是通过kube-apiserver
。这些 Pod 定义文件通常位于/etc/kubernetes/manifests
目录中。如果该目录中定义了etcd
Pod,kubelet
会不断尝试确保该 Pod 运行。
解决方案:
如果不希望 etcd
容器自动重新启动,可以按照以下步骤操作:
1. 找到 etcd
Static Pod 配置文件
Kubernetes 的 etcd
通常是通过 Static Pod 配置文件进行管理,配置文件路径为 /etc/kubernetes/manifests/etcd.yaml
。
使用以下命令检查该目录下是否存在 etcd
的配置文件:
ls /etc/kubernetes/manifests/
2. 停止 etcd
容器的自动重启
要防止 Kubernetes 自动重新启动 etcd
容器,可以暂时删除或移动该配置文件。例如:
sudo mv /etc/kubernetes/manifests/etcd.yaml /root/
这样,kubelet
不再监控该 Pod,etcd
容器停止后将不会自动重新创建。
3. 手动停止 etcd
容器
一旦你移动了 etcd
的配置文件,kubelet
将不会再管理该 etcd
容器。此时你可以手动停止 etcd
容器,且不会再次自动启动:
sudo crictl stop <etcd-container-id>
4. 恢复 etcd
容器
完成需要的操作后,如果你希望 etcd
容器再次启动,只需将 etcd.yaml
文件放回原位置:
sudo mv /root/etcd.yaml /etc/kubernetes/manifests/
Kubernetes 会自动检测到该配置文件并重新创建 etcd
容器。
查看一下etcd服务的情况
刚刚由于手动删除配置文件之后,检测到之后自动重启,查看页面具体的集群信息
由于集群信息文件丢失导致集群信息全部丢失
使用备份文件恢复
恢复之前需要手动删除一下上面由于etcd检测到配置文件损坏之后导致的重启之后生成的节点信息,不然会出报错
删除文件之后执行
etcdutl snapshot restore etcd-snapshot.db --data-dir=/var/lib/etcd
执行完之后查看文件已经恢复,查看一下etcd服务信息
这里需要注意一下就是,经过多次尝试之后,默认会存在两个容器的信息,如果后续涉及更新需要将原先旧的信息进行停止和删除,不然容器不能自己重启因为没有位置了。重启完成之后查看集群信息已经恢复
参考文章: https://blog.csdn.net/u011197085/article/details/139251415https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/