利用 member update 实现 etcd 灾难恢复 [也可实现 etcd 集群迁移]

简介: 利用 member update 实现 etcd 灾难恢复 [也可实现 etcd 集群迁移]

上集回顾

  • etcd 集群出现了故障,节点启动会有如下报错,一般是 member 信息不匹配,导致了集群异常,无法重启 etcd 集群
member count is unequal

本集预告

  • 如果 etcd 有做过 snapshot 快照,可以直接新建一套集群,直接还原快照即可,有时候没有快照,或没来的及快照,集群已经出现了问题,此时可以通过保留的 etcd data 数据目录下的文件,配合新 etcd 集群,使用 member update 可以在保留 etcd 数据的情况下初始化集群数据,重新构建 etcd 集群
  • 无论是 kubeadm 还是 二进制 的 k8s ,都可以通过这种方式来灾难恢复 etcd 集群,并且早期发现,在 pod 没有重启的情况下,也不会影响正在运行的 pod [ 会影响 master 组件的运行,因为 etcd 集群宕机,apiserver 服务会挂,也就无法使用 kubectl 命令管理 k8s 集群,当然,也无法使用 api 的方式,毕竟 apiserver 的端口也关了 ]

L(老)B(b)Z(真)S(帅) - 来吧展示

备份数据目录

  • kubeadm 安装的,默认 etcd 数据目录在 /var/lib/etcd 目录下,二进制部署的,要查看 service 文件指定的 --data-dir 参数指向的路径
  • 对比一下,哪个目录最大,就备份哪个,目录最大的,数据最新
cp -r /var/lib/etcd/member /var/lib/member-bak

停止所有 etcd 服务

  • 如果是 二进制 部署的,只需要 systemctl stop etcd 即可,当然,以自己实际的环境为准,也许你的 service 文件配置的不是 etcd.service
  • kubeadm 部署的,只需要把 etcd.yaml 从 manifests 目录下移走即可

    • kubeadm 默认部署的路径是 /etc/kubernetes,记得检查自己的环境是否也是这个路径,不要只管 cv,啥也不看
mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/
检查 etcd 是否都已经关闭
# 这个方法只适合 kubeadm 部署的 k8s 环境,二进制的,需要通过 'ps -ef | grep etcd' 命令查看 etcd 进程是否还存在来验证
docker ps -a | grep etcd

创建新 etcd 节点

  • 切记,先配置并启动一个节点的 etcd,要等这个单节点 etcd 启动成功后,再做后面的节点加入操作

    • 如果是修复数据,可以在原节点操作,并且不需要使用 member update 命令
    • 如果是做 etcd 数据迁移,配置好新节点的一个 etcd 节点即可,数据迁移需要使用 member update 命令

单节点 etcd

  • 如果是 二进制 etcd,需要修改 service 文件
  • 如果是 kubeadm 部署的 k8s ,需要修改前面移走的 etcd.yaml 文件,然后放到 manifests 目录下来启动 etcd

注意以下配置,修改之前先备份一份, service 文件也记得备份,我的环境是 kubeadm 的,懒得搞一个二进制环境了,理解思路才是最重要的

cp etcd.yaml{,.bak}
vim etcd.yaml
  • 增加 --force-new-cluster 参数,这个参数,在 etcd 单节点启动成功后,再删掉,然后重启 etcd

    • 这个参数的意义是强制删除集群中的所有成员,并把自己加入到集群成员中
  • 增加 --initial-cluster-state=new 参数

    • new - 成员设置为 new,而不是加入已有集群
    • existing - 成员加入已有 etcd 集群
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.168.11.135:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --initial-advertise-peer-urls=https://192.168.11.135:2380
    - --initial-cluster=master-01=https://192.168.11.135:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://192.168.11.135:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.168.11.135:2380
    - --name=master-01
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    # 主要是这两个参数,上面的以自己环境的为准,都配置为当前节点的 ip,和自己的证书路径
    - --initial-cluster-state=new
    - --force-new-cluster
启动 etcd 服务,切记,就启动一个节点,其他节点,等这个单节点启动成功后,需要修改配置才可以加入到这个单节点的 etcd ,然后才能组成一套集群
cp /etc/kubernetes/etcd.yaml /etc/kubernetes/manifests/
查看 etcd 是否启动成功

二进制部署的,可以看进程或者端口,kubeadm 部署的,使用下面的方式

docker ps -a | grep etcd
查看 member 信息

本地如果没有 etcdctl 命令,可以从容器内复制一个 [ 二进制部署的,一般都自带 etcdctl 命令,如果没有的话,下载一个二进制文件就可以了 ]

docker cp $(docker ps | awk '/etcd --/ {print $1}'):/usr/local/bin/etcdctl /etc/kubernetes/pki/etcd/etcdctl 
chmod +x /etc/kubernetes/pki/etcd/etcdctl
cd /etc/kubernetes/pki/etcd/
# ip 和证书改为自己环境的配置,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member list
可以看到, peerurl 的 ip 和 server 的 ip 是不一样的
cde66358cffbaacf, started, master-01, https://192.168.11.131:2380, https://192.168.11.135:2379, false
执行 member update 命令来更新 peerurl 的地址
# ip 和证书改为自己环境的配置,member id 也已自己上面的命令获取的为准,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member update cde66358cffbaacf --peer-urls=https://192.168.11.135:2380
删除 -force-new-cluster 参数, 避免下次 etcd 重启的时候,集群成员被初始化,这里就不留下我的操作足迹了,但是大家一定一定要记得删掉这个参数,然后重启 etcd

将其他成员加入到 etcd 集群

下面的操作,还是继续在已经启动的这个单节点的 etcd 机器上操作,也可以在其他节点操作,只要有证书,有 etcdctl 命令,哪里都可以操作
# ip 和证书改为自己环境的配置,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member add master-02 --peer-urls=https://192.168.11.133:2380
准备加入的节点,记得 etcd 的 data 目录下不要有数据

下面的操作在 需要加入 etcd 成员的节点操作

确保 data 目录为空

rm -rf /var/lib/etcd/member/*
vim etcd.yaml
  • 增加 --initial-cluster-state=new 参数

    • new - 成员设置为 new,而不是加入已有集群
    • existing - 成员加入已有 etcd 集群
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.168.11.133:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --initial-advertise-peer-urls=https://192.168.11.133:2380
    - --initial-cluster=master-02=https://192.168.11.133:2380,master-01=https://192.168.11.135:2380
    # 需要增加这个参数,切记,不能是 new,要是 existing,不然 etcd 会起不来
    - --initial-cluster-state=existing
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://192.168.11.133:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.168.11.133:2380
    - --name=master-02
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
重启 etcd ,查看 etcd 是否正常
# ip 和证书改为自己环境的配置,切莫纯 cv
./etcdctl \
--cacert ./ca.crt \
--cert ./server.crt \
--key ./server.key \
--endpoints https://192.168.11.135:2379 \
member list
可看到,两个节点都是 started 状态了,如果还有节点需要加入,重复执行成员加入 etcd 集群的操作即可
47785658ea2ca7f0, started, master-02, https://192.168.11.133:2380, https://192.168.11.133:2379, false
cde66358cffbaacf, started, master-01, https://192.168.11.135:2380, https://192.168.11.135:2379, false
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
小程序 数据可视化 机器人
分享72个商务商城PHP源码,总有一款适合你
分享72个商务商城PHP源码,总有一款适合你
1806 3
|
安全 Linux 网络虚拟化
关于容器云的三种网络设计
【2月更文挑战第9天】容器网络设计:隧道、路由、VLAN。
|
缓存
银河麒麟server-V10配置镜像源
银河麒麟server-V10配置镜像源
21018 1
|
1月前
|
人工智能 安全 JavaScript
零代码部署OpenClaw智能体Win11详细教程(包含新版安装包)
OpenClaw(小龙虾)是GitHub星标28W+的开源本地AI智能体,专为Windows 11优化,支持一键解压即用。无需代码、免配环境,可自动操控电脑、整理文件、浏览器自动化,数据全程本地运行,隐私安全。
|
存储 Kubernetes 安全
Kubernetes 中如何对 etcd 进行备份和还原
Kubernetes 中如何对 etcd 进行备份和还原
|
Docker 容器
在openEuler 22.03 LTS上安装Docker CE和Docker Compose
以上就是在openEuler 22.03 LTS上安装Docker CE和Docker Compose的过程。希望这个指南能帮助你顺利完成安装。
2886 12
|
9月前
|
Unix Linux 编译器
解决在Windows平台上运行Golang程序时出现的syscall.SIGUSR1未定义错误。
通过这种结构,你的代码既可以在支持 SIGUSR1 信号的系统上正常工作,又可以在不支持这些信号的 Windows 系统上编译通过,确保跨平台的兼容性和功能的完整性。
353 0
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
Ubuntu Linux 网络安全
如何在Linux中更改主机名?修改主机名最新方法
本期教程将指导您如何在Linux系统中更改主机名。主机名是Linux系统的常用功能,用于识别服务器,帮助区分不同服务器,并与网络进程和其他应用程序协同工作。教程涵盖显示当前主机名的方法(通过`hostname`命令),以及在CentOS 7、Debian 9和Ubuntu 16.04及以上版本中更改主机名的步骤(使用`hostnamectl set-hostname`命令)。对于其他Linux版本,可编辑`/etc/hostname`文件实现更改。记得重启相关服务或服务器以使更改生效!
2914 12
|
监控 关系型数据库 MySQL
如何解决 MySQL 数据库服务器 CPU 飙升的情况
大家好,我是 V 哥。当 MySQL 数据库服务器 CPU 飙升时,如何快速定位和解决问题至关重要。本文整理了一套实用的排查和优化套路,包括使用系统监控工具、分析慢查询日志、优化 SQL 查询、调整 MySQL 配置参数、优化数据库架构及检查硬件资源等步骤。通过一个电商业务系统的案例,详细展示了从问题发现到解决的全过程,帮助你有效降低 CPU 使用率,提升系统性能。关注 V 哥,掌握更多技术干货。
1998 0

热门文章

最新文章