Kubernetes控制平面组件:etcd高可用集群搭建

云原生学习路线导航页(持续更新中)

  • kubernetes学习系列快捷链接
    • Kubernetes架构原则和对象设计(一)
    • Kubernetes架构原则和对象设计(二)
    • Kubernetes架构原则和对象设计(三)
    • Kubernetes控制平面组件:etcd(一)
    • Kubernetes控制平面组件:etcd(二)
    • Kubernetes控制平面组件:etcd常用配置参数
    • kubectl 和 kubeconfig 基本原理
    • kubeadm 升级 k8s集群 1.17到1.20
    • Kubernetes常见问题解答
    • 查看云机器的一些常用配置
  • 本文将给出 ETCD 高可用集群的搭建方法,并演示如何进行数据备份、数据恢复、集群停机和集群重启
  • 参考链接:https://github.com/cncamp/101/blob/master/module5/etcd-ha-demo/install-ha-etcd.MD

1.etcd 高可用集群的搭建

推荐先阅读:Kubernetes控制平面组件:etcd常用配置参数,搞清楚etcd的常用参数,再阅读本节将会更加清晰

1.1.Install cfssl

# Debian/Ubuntu
apt install golang-cfssl# 或者使用go直接安装
go install github.com/cloudflare/cfssl/cmd/cfssl@latest
go install github.com/cloudflare/cfssl/cmd/cfssljson@latest
  • 作用:安装 cfssl 工具,用于生成 TLS 证书。
  • 原因:ETCD 集群需要 TLS 证书来加密节点之间的通信,确保数据安全性。

1.2.Generate tls certs and clone etcd code

mkdir /root/go/src/github.com/etcd-io
cd /root/go/src/github.com/etcd-io
git clone https://github.com/etcd-io/etcd.git
cd etcd/hack/tls-setup
  • 作用:
    • 创建 Go 工作目录。
    • 克隆 ETCD 官方仓库。
    • 进入 TLS 证书生成脚本目录。目的是先生成证书,才能去启动etcd
  • 原因:ETCD 官方提供了 TLS 证书生成的脚本和配置文件,方便用户快速生成证书。

1.3.Edit req-csr.json and keep 127.0.0.1 and localhost only for single cluster setup.

vi config/req-csr.json
  • 作用:编辑证书签名请求(CSR)配置文件,配置文件编辑好就可以生成证书了
  • 原因:
    • etcd 的证书签名请求文件,默认会生成一些ip,我们需要把ips改成自己的etcd集群ip
      在这里插入图片描述

    • 因为我这里虽然构建3节点etcd集群,但是都在本地一台机器上,所有只需要保留 127.0.0.1 和 localhost,避免生成不必要的证书。
      在这里插入图片描述

1.4.Generate certs

export infra0=127.0.0.1
export infra1=127.0.0.1
export infra2=127.0.0.1
make
mkdir /tmp/etcd-certs
mv certs /tmp/etcd-certs
  • 作用:
    • 先设置环境变量,指定集群节点的 IP 地址。因为我们准备将etcd的三个节点分别命名为 infra0、infra1、infra2
    • 使用 make 命令生成 TLS 证书。默认证书会生成到 当前目录/certs
    • 创建证书存储目录,并将生成的证书移动到该目录。
  • 原因:
    • 环境变量用于指定集群节点的 IP 地址。
    • make 命令调用 cfssl 生成证书。
    • 将证书集中存储,便于后续使用。后续使用etcdctl时需要执行cert目录

1.5.Start etcd cluster member1

  • 创建 start-all.sh 文件,将下面的命令复制进去

    • 声明了3个etcd实例,–initial-cluster-state为new,指明cert地址、节点名称、data-dir
    • 因为我要在同一台机器上启动3个实例,所以3个实例的端口是各异的
    #
    # each etcd instance name need to be unique
    # x380 is for peer communication
    # x379 is for client communication
    # dir-data cannot be shared
    #
    nohup etcd --name infra0 \
    --data-dir=/tmp/etcd/infra0 \
    --listen-peer-urls https://127.0.0.1:3380 \
    --initial-advertise-peer-urls https://127.0.0.1:3380 \
    --listen-client-urls https://127.0.0.1:3379 \
    --advertise-client-urls https://127.0.0.1:3379 \
    --initial-cluster-token etcd-cluster-1 \
    --initial-cluster infra0=https://127.0.0.1:3380,infra1=https://127.0.0.1:4380,infra2=https://127.0.0.1:5380 \
    --initial-cluster-state new \
    --client-cert-auth --trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem \
    --peer-client-cert-auth --peer-trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --peer-cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --peer-key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem 2>&1 > /var/log/infra0.log &nohup etcd --name infra1 \
    --data-dir=/tmp/etcd/infra1 \
    --listen-peer-urls https://127.0.0.1:4380 \
    --initial-advertise-peer-urls https://127.0.0.1:4380 \
    --listen-client-urls https://127.0.0.1:4379 \
    --advertise-client-urls https://127.0.0.1:4379 \
    --initial-cluster-token etcd-cluster-1 \
    --initial-cluster infra0=https://127.0.0.1:3380,infra1=https://127.0.0.1:4380,infra2=https://127.0.0.1:5380 \
    --initial-cluster-state new \
    --client-cert-auth --trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem \
    --peer-client-cert-auth --peer-trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --peer-cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --peer-key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem 2>&1 > /var/log/infra1.log &nohup etcd --name infra2 \
    --data-dir=/tmp/etcd/infra2 \
    --listen-peer-urls https://127.0.0.1:5380 \
    --initial-advertise-peer-urls https://127.0.0.1:5380 \
    --listen-client-urls https://127.0.0.1:5379 \
    --advertise-client-urls https://127.0.0.1:5379 \
    --initial-cluster-token etcd-cluster-1 \
    --initial-cluster infra0=https://127.0.0.1:3380,infra1=https://127.0.0.1:4380,infra2=https://127.0.0.1:5380 \
    --initial-cluster-state new \
    --client-cert-auth --trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem \
    --peer-client-cert-auth --peer-trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --peer-cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --peer-key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem 2>&1 > /var/log/infra2.log &
    
  • 执行创建集群

    chmod +0777 start-all.sh
    ./start-all.sh
    
  • 执行后集群就启动了,ps -ef | grep etcd 可以看出3个etcd节点已经有了
    在这里插入图片描述

  • 常见错误

    • 如果执行报错:nohup: nohup: failed to run command ‘etcd’nohup: failed to run command ‘etcd’failed to run command ‘etcd’: No such file or directory: No such file or directory,说明还没有etcd命令,需要安装一下
      # centos中
      yum install etcd
      # 设置使用的etcdctl api为v3
      export ETCDCTL_API=3
      

1.6.Member list 验证 etcd

etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem --key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem member list
  • 作用:查看 ETCD 集群的成员列表。
  • 原因:验证集群是否正常运行,并确认所有节点已成功加入集群。
  • 如果报错:flag provided but not defined: -cert,说明没有设置 etcdctl 的版本
    export ETCDCTL_API=3
    

2.数据备份

2.1.Insert some data

  • 插入一些数据,模拟etcd的正常使用
    • key=a value=b
    • key=/a value=/b
    • key=/a/f value=ok
# 插入3条数据
[root@VM-226-235-tencentos ~/go/src/github.com/etcd-io/etcd/hack/tls-setup]# etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem --key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem put a b
OK
[root@VM-226-235-tencentos ~/go/src/github.com/etcd-io/etcd/hack/tls-setup]# etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem --key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem put /a /b
OK
[root@VM-226-235-tencentos ~/go/src/github.com/etcd-io/etcd/hack/tls-setup]# etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem --key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem put /a/f ok
OK# 查看所有的数据
[root@VM-226-235-tencentos ~/go/src/github.com/etcd-io/etcd/hack/tls-setup]# etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem --key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem get --prefix ""
/a
/b
/a/f
ok
a
b

2.2.Backup

  • 执行备份命令,将当前etcd集群全量备份为快照snapshot,备份生成文件snapshot.db
    etcdctl --endpoints https://127.0.0.1:3379 \--cert /tmp/etcd-certs/certs/127.0.0.1.pem \--key /tmp/etcd-certs/certs/127.0.0.1-key.pem \--cacert /tmp/etcd-certs/certs/ca.pem snapshot save snapshot.db
    
  • 执行后集群就备份了,ls 查看当前目录文件,会多出一个 snapshot.db
  • 在集群出现故障或数据丢失时,可以通过备份恢复数据。

3.销毁etcd集群,模拟故障

ps -ef | grep "/tmp/etcd/infra" | grep -v grep | awk '{print $2}'|xargs kill
  • 作用:终止所有 ETCD 节点的进程。
  • 原因:在恢复数据之前,需要停止所有 ETCD 实例。
rm -rf /tmp/etcd
  • 作用:删除 ETCD 数据目录。
  • 原因:模拟数据丢失场景,测试备份恢复功能。

4.使用快照恢复etcd集群数据

  • 创建 restore.sh 文件,将下面的命令复制进去
    • 使用 snapshot 恢复3个etcd实例,指定将数据恢复到哪里–data-dir
    export ETCDCTL_API=3
    etcdctl snapshot restore snapshot.db \--name infra0 \--data-dir=/tmp/etcd/infra0 \--initial-cluster infra0=https://127.0.0.1:3380,infra1=https://127.0.0.1:4380,infra2=https://127.0.0.1:5380 \--initial-cluster-token etcd-cluster-1 \--initial-advertise-peer-urls https://127.0.0.1:3380etcdctl snapshot restore snapshot.db \--name infra1 \--data-dir=/tmp/etcd/infra1 \--initial-cluster infra0=https://127.0.0.1:3380,infra1=https://127.0.0.1:4380,infra2=https://127.0.0.1:5380 \--initial-cluster-token etcd-cluster-1 \--initial-advertise-peer-urls https://127.0.0.1:4380etcdctl snapshot restore snapshot.db \--name infra2 \--data-dir=/tmp/etcd/infra2 \--initial-cluster infra0=https://127.0.0.1:3380,infra1=https://127.0.0.1:4380,infra2=https://127.0.0.1:5380 \--initial-cluster-token etcd-cluster-1 \--initial-advertise-peer-urls https://127.0.0.1:5380
    
  • 执行恢复集群数据,完成后 ls /tmp/etcd 查看数据是否恢复回来了
    chmod +0777 restore.sh
    ./restore.sh
    ls /tmp/etcd
    

5.重启etcd集群

  • 创建 restart-all.sh 文件,将下面的命令复制进去
    • 使用 重新启动 3个etcd实例,–data-dir指定数据目录
    nohup etcd --name infra0 \
    --data-dir=/tmp/etcd/infra0 \
    --listen-peer-urls https://127.0.0.1:3380 \
    --listen-client-urls https://127.0.0.1:3379 \
    --advertise-client-urls https://127.0.0.1:3379 \
    --client-cert-auth --trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem \
    --peer-client-cert-auth --peer-trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --peer-cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --peer-key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem 2>&1 > /var/log/infra0.log &nohup etcd --name infra1 \
    --data-dir=/tmp/etcd/infra1 \
    --listen-peer-urls https://127.0.0.1:4380 \
    --listen-client-urls https://127.0.0.1:4379 \
    --advertise-client-urls https://127.0.0.1:4379 \
    --client-cert-auth --trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem \
    --peer-client-cert-auth --peer-trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --peer-cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --peer-key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem 2>&1 > /var/log/infra1.log &nohup etcd --name infra2 \
    --data-dir=/tmp/etcd/infra2 \
    --listen-peer-urls https://127.0.0.1:5380 \
    --listen-client-urls https://127.0.0.1:5379 \
    --advertise-client-urls https://127.0.0.1:5379 \
    --client-cert-auth --trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem \
    --peer-client-cert-auth --peer-trusted-ca-file=/tmp/etcd-certs/certs/ca.pem \
    --peer-cert-file=/tmp/etcd-certs/certs/127.0.0.1.pem \
    --peer-key-file=/tmp/etcd-certs/certs/127.0.0.1-key.pem 2>&1 > /var/log/infra2.log &
    
  • 执行重启集群,完成后 ps -ef | grep etcd 查看3个etcd节点是否都重新启动了
    ps -ef | grep etcd
    

6.验证数据是否恢复

  • 获取etcd的member,查看节点是否正常
    [root@VM-226-235-tencentos ~/go/src/github.com/etcd-io/etcd/hack/tls-setup]# etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem --key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem member list
    1701f7e3861531d4, started, infra0, https://127.0.0.1:3380, https://127.0.0.1:3379
    6a58b5afdcebd95d, started, infra1, https://127.0.0.1:4380, https://127.0.0.1:4379
    84a1a2f39cda4029, started, infra2, https://127.0.0.1:5380, https://127.0.0.1:5379
    
  • 获取etcd的所有数据,验证数据是否恢复
    [root@VM-226-235-tencentos ~/go/src/github.com/etcd-io/etcd/hack/tls-setup]# etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem --key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem get --prefix ""
    /a
    /b
    /a/f
    ok
    a
    b
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19065.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Banana Pi OpenWRT One 官方路由器的第一印象

OpenWRT One是OpenWRT开源社区推出的首款官方开发板,与Banana Pi社区共同设计,由Banana Pi制造和发行。路由器采用蓝色铝合金外壳,质感极佳,视觉效果远超宣传图。整体设计简洁,呈长方形,虽然不是特别时尚&a…

【每日一题 | 2025】2.10 ~ 2.16

个人主页:Guiat 归属专栏:每日一题 文章目录 1. 【2.10】P8707 [蓝桥杯 2020 省 AB1] 走方格2. 【2.11】P8742 [蓝桥杯 2021 省 AB] 砝码称重3. 【2.12】P8786 [蓝桥杯 2022 省 B] 李白打酒加强版4. 【2.13】P8725 [蓝桥杯 2020 省 AB3] 画中漂流5. 【2.…

微信小程序配置3 配置sass

1. 在config。json文件里面的setting配置“sass” 2. 改你需要的页面后缀名为scss。 3.查看页面即可看到样式。

撕碎QT面具(1):Tab Widget转到某个Tab页

笔者未系统学过C语法,仅有Java基础,具体写法仿照于大模型以及其它博客。自我感觉,如果会一门对象语言,没必要先刻意学C,因为自己具有对象语言的基础,等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…

恩智浦:将开发文档迁移到DITA/XML

摘要:本文是德国同行Parson公司写的一篇文章,描述芯片巨头恩智浦编写文档方法如何从MS Word和Adobe Frame Maker转向基于DITA的结构化写作和发布。英文原文地址:https://www.parson-europe.com/en/references/nxp - 1 - 项目目标 在开发产…

基于SpringBoot的医院药房管理系统【源码+答辩PPT++项目部署】高质量论文1-1.5W字

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

计算机性能与网络体系结构探讨 —— 基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

【第11章:生成式AI与创意应用—11.4 生成式AI在其他领域的创新应用与未来展望】

凌晨三点,生物实验室的AI突然"灵光一闪"——它把抗病毒蛋白的结构图与蜂巢的六边形结构进行跨界组合,生成的新分子让老教授的手开始颤抖。这种打破学科壁垒的创造力,正是生成式AI带给人类最震撼的礼物。让我们走进这个"数字炼金术"的新时代。 一、科学…

网络安全:从攻击到防御的全景解析

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 在互联网高度发达的今天,网络安全已成为影响社会稳定、国家安全和企业发展的关键因素。无论是个人用户的数据…

【第11章:生成式AI与创意应用—11.3 AI艺术创作的实现与案例分析:DeepArt、GANBreeder等】

凌晨三点的画室里,数字艺术家小美盯着屏幕上的GANBreeder界面——她将梵高的《星月夜》与显微镜下的癌细胞切片图进行混合,生成的新图像在柏林电子艺术展上引发轰动。这场由算法驱动的艺术革命,正在重写人类对创造力的定义。 一、机器视觉的觉醒之路 1.1 数字艺术的三次浪…

【清晰教程】本地部署DeepSeek-r1模型

【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面-CSDN博客 目录 Ollama 安装Ollama DeepSeek-r1模型 安装DeepSeek-r1模型 Ollama Ollama 是一个开源工具,专注于简化大型语言模型(LLMs)的本地部署和管理。它允许用户在本地计算机…

相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景

在当今快速发展的科技领域,低代码一体化平台已成为企业数字化转型的关键工具,同时,大型语言模型(LLM)如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器,目前…

ESP学习-1(MicroPython VSCode开发环境搭建)

下载ESP8266固件:https://micropython.org/download/ESP8266_GENERIC/win电脑:pip install esptools python.exe -m pip install --upgrade pip esptooo.py --port COM5 erase_flash //清除之前的固件 esptool --port COM5 --baud 115200 write_fla…

LLM大模型学习资料整理

LLM工具 LlamaIndex Llama Hub 文档 模型微调 LlamaFactory 推理 - LLaMA Factoryhttps://llamafactory.readthedocs.io/zh-cn/latest/getting_started/inference.htmlGitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100 LLMs & VLMs (ACL 2024)Uni…

goland2022.3.3 安装过程

到csdn下载安装包 开始安装 安装完后,安装中文包

大模型开发实战篇5:多模态--文生图模型API

大模型文生图是一种基于人工智能大模型的技术,能够将自然语言文本描述转化为对应的图像。目前非常火的AI大模型赛道,有很多公司在此赛道竞争。详情可看这篇文章。 今天我们来看下如何调用WebAPI来实现文生图功能。我们一般都会将OpenAI的接口&#xff0…

乘积最大 之 连续与非联系子数组

文章目录 152.乘积最大子数组2708.一个小组的最大实力值 乘积的最大情况分为两种,一种是 要求子数组是连续的,一种是要求数组是不用连续的 连续可以使用动态规划求解,非连续则使用贪心 152.乘积最大子数组 152.乘积最大子数组 思路分析&…

使用 Ansys Fluent 进行电池热滥用失控传播仿真

电池热失控传播是电池系统中一个严重的问题。Ansys Fluent 提供了在此类条件下仿真电池热行为的工具,以帮助了解和降低与热失控相关的风险。 电池热滥用的挑战 电池热失控传播是电池系统中的一个严重问题,尤其是锂离子电池和其他高能量密度电池。这种现…

基于SpringBoot实现的大学社团平台系统实现功能六

一、前言介绍: 1.1 项目摘要 随着高校社团活动的日益丰富和多样化,学生对于社团管理和参与的需求也在不断增加。传统的社团管理方式往往存在效率低下、信息不透明等问题,无法满足现代学生对于便捷、高效社团管理的需求。因此,利…

STM32、GD32驱动TM1640原理图、源码分享

一、原理图分享 二、源码分享 /************************************************* * copyright: * author:Xupeng * date:2024-07-18 * description: **************************************************/ #include "smg.h"#define DBG_TAG "smg&…