首页 程序笔记 如何在 Ubuntu 22.04 上安装 3 节点 Etcd HA 集群

如何在 Ubuntu 22.04 上安装 3 节点 Etcd HA 集群

容器化的概念现在无处不在。它可以被定义为将包和所有必需的依赖项打包在一个称为容器的轻量级可执行文件中。这个概念已被广泛采用,因为它消除了与包相关的所有依赖性问题。它还通过隔离工作负载提高了安全性,并通过可扩展性、可移植性和灵活性提高了应用程序性能。容器化带来了Docker、Podman、Containerd、Kubernetes、ETCD等多种工具。

etcd 在所有接触过 Kubernetes 的人中很受欢迎。它是一个一致且高度可用的键值存储,作为分布式系统的骨干来支持所有集群数据。它充当存储和复制所有 Kubernetes 集群状态的主存储。该工具最初是为了在 Fedora CoreOS 上运行集群而构建的,后来在 OSX、Linux 和 BSD 系统上采用。如今,许多分布式系统,例如 Google Kubernetes、Cloud Foundry 和 Fleet,很大程度上依赖于 etcd。

在 Kubernetes 集群中,etcd 充当大脑。它负责保存运行集群所需的所有敏感信息。每当 etcd 遇到问题时,整个集群都可能面临问题。为了实现高可用,建议隔离ectd集群。这提高了可维护性和可管理性。

下图展示了Etcd集群的架构

在本指南中,我们将介绍如何在 Ubuntu 22.04 上安装 3 节点 Etcd HA 集群。

入门

为了使 ETCD 集群顺利运行,您需要奇数个服务,比如 3 或 5 个。您还需要确保不出现资源匮乏的情况,以确保集群稳定。

在本指南中,我们将使用 4 台 Ubuntu 22.04 服务器的环境,配置如下:

TASK IP ADDRESS HOSTNAME
ETCD1 192.168.200.52 etcd1.computingforgeeks.com
ETCD1 192.168.200.62 etcd2.computingforgeeks.com
ETCD1 192.168.200.63 etcd3computingforgeeks.com
LOAD-BALANCER 192.168.200.56 loadbalancer.computingforgeeks.com

确保系统已更新并安装了所有必需的软件包:

sudo apt update
sudo apt install vim curl -y

然后继续在所有服务器上设置主机名。例如关于;

sudo hostnamectl set-hostname etcd1.computingforgeeks.com #Node1
sudo hostnamectl set-hostname etcd2.computingforgeeks.com #Node2
sudo hostnamectl set-hostname etcd3.computingforgeeks.com #Node3

然后在所有计算机上配置 /etc/hosts ,如下所示:

$ sudo vim /etc/hosts
192.168.200.52 etcd1.computingforgeeks.com  etcd1
192.168.200.62 etcd2.computingforgeeks.com  etcd2
192.168.200.63 etcd3.computingforgeeks.com  etcd3
192.168.200.56 loadbalancer.computingforgeeks.com  loadbalancer

生产部署还有许多其他要求。其中之一是所需的最低 etcd 版本为 3.4.22+3.5.6+。还有更多要求,请参阅资源要求参考

全部设置完毕后,您可以按照以下步骤进行操作。

1. 安装所需的软件包

在我们继续初始化集群之前,所有 etcd 节点上都需要一些软件包。

对于这种方法,用户可以选择最新的可用版本的 etcd。要实现这一点,请访问 etcd 版本页面。到达此处后,导出最新的可用版本:

ETCD_VER=v3.5.10

导出所需的其他变量:

GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}

为实现创建/tmp目录:

rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

现在使用以下命令拉取二进制文件:

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz

提取存档:

tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz

将二进制文件移至您的路径:

sudo cp /tmp/etcd-download-test/etcd* /usr/local/bin

现在创建一个服务文件:

sudo vim /etc/systemd/system/etcd.service

将这些行添加到文件中:

[Unit]
Description=etcd

[Service]
Type=notify
EnvironmentFile=/etc/default/etcd
ExecStart=/usr/local/bin/etcd
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

现在验证安装:

$ etcd --version
etcd Version: 3.5.10
Git SHA: 0223ca52b
Go Version: go1.20.10
Go OS/Arch: linux/amd64

$ etcdctl version
etcdctl version: 3.5.10
API version: 3.5

在 3 台服务器上安装 etcd 后,请按如下所示继续操作。

2.在Ubuntu上设置Etcd HA集群

在 etcd 节点上安装所需的软件包后,我们现在可以创建集群。为此,我们需要对 etcd 配置进行一些调整。

打开文件进行编辑:

sudo vim /etc/default/etcd

该文件包含集群的所有环境变量。我们需要在所有 3 个节点上定义所有变量:

ETCD_NAME=<node-name>
##ETCD_DATA_DIR=/var/lib/etcd
ETCD_INITIAL_CLUSTER=<node1-name=http://<node1-ip>:2380,node2-name=http://<node2-ip>:2380,node3-name=http://<node3-ip>:2380>
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://<node-ip>:2380
ETCD_ADVERTISE_CLIENT_URLS=http://<node-ip>:2379
ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379

在启动之前先替换每个节点上的所有变量。请记住,50 秒内至少必须启动 2 个 etcd 节点,否则会因 master 选举超时而抛出错误。

例如,在我的 etcd1 节点上,变量将为:

ETCD_NAME=etcd1
##ETCD_DATA_DIR=/var/lib/etcd
ETCD_INITIAL_CLUSTER=etcd1=http://192.168.200.52:2380,etcd2=http://192.168.200.62:2380,etcd3=http://192.168.200.63:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://192.168.200.52:2380
ETCD_ADVERTISE_CLIENT_URLS=http://192.168.200.52:2379
ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379

在所有 3 个节点上进行更改后,使用以下命令启动或重新启动 etcd 服务:

sudo systemctl daemon-reload
sudo systemctl enable --now etcd

##To Restart, Use:
sudo systemctl restart etcd

验证服务是否在所有节点上运行:

$ systemctl status etcd
● etcd.service - etcd
     Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-11-19 16:21:21 EAT; 29s ago
   Main PID: 4684 (etcd)
      Tasks: 7 (limit: 4617)
     Memory: 12.7M
        CPU: 455ms
     CGroup: /system.slice/etcd.service
             └─4684 /usr/local/bin/etcd

Nov 19 16:21:43 etcd1.computingforgeeks.com etcd[4684]: {"level":"info","ts":"2023-11-19T16:21:43.013666+0300","caller":"rafthttp/peer_status.go:53","msg":"peer became active","peer-id":"3c>
Nov 19 16:21:43 etcd1.computingforgeeks.com etcd[4684]: {"level":"info","ts":"2023-11-19T16:21:43.014271+0300","caller":"rafthttp/stream.go:412","msg":"established TCP streaming connection >
Nov 19 16:21:43 etcd1.computingforgeeks.com etcd[4684]: {"level":"info","ts":"2023-11-1
....

现在,集群已启动并正在运行。要验证这一点,请使用以下命令并将 IP 替换为任何 etcd 服务器的 IP。

$ etcdctl --endpoints=http://192.168.200.52:2379 member list
12aca8afa5a60d1a, started, etcd1, http://192.168.200.52:2380, http://192.168.200.52:2379, false
3ccdae3b547878c4, started, etcd3, http://192.168.200.63:2380, http://192.168.200.63:2379, false
cdf1b4107740a046, started, etcd2, http://192.168.200.62:2380, http://192.168.200.62:2379, false

从上面的输出来看,etcd 集群中有 3 个节点。

3.安装和配置负载均衡器

首先,安装负载均衡器。在本指南中,我们将使用 Haproxy 作为负载均衡器。您仍然可以根据需要使用 Nginx 或任何其他。

要在 Ubuntu 系统上安装 Haproxy,请使用:

##On Debian/Ubuntu
sudo apt update && sudo apt install haproxy

安装后,启动并启用该服务:

sudo systemctl start haproxy
sudo systemctl enable haproxy

继续并创建代理配置:

sudo cp /etc/haproxy/haproxy.cfg{,.old}
sudo vim /etc/haproxy/haproxy.cfg

请记住,HAProxy 配置有 4 个主要部分。这些都是:

  • 全局部分包含所有正在运行的服务器的参数。
  • 默认设置,其中包含适用于所有代理子部分的详细信息
  • 前端设置定义客户端连接的侦听套接字
  • 后端设置定义服务器 IP 地址和负载均衡器算法

在该文件中,我们需要添加以下行来定义它应如何处理负载平衡:

frontend main
    bind *:2379
    mode tcp
    default_backend etcd-api

backend etcd-api
    mode tcp
    balance roundrobin
    server node1  etcd1.computingforgeeks.com:2379 check
    server node2  etcd2.computingforgeeks.com:2379 check
    server node3  etcd3.computingforgeeks.com:2379 check

在上述文件中正确提供域名。如果启用了防火墙,请在所有节点上允许此端口通过:

sudo ufw allow 2379

现在重新启动 HAProxy 服务:

sudo systemctl restart haproxy

您现在可以使用负载均衡器 IP 访问集群。例如:

现在您可以在 Kubernetes 集群中使用 etcd 端点。您需要在 Kubernetes 配置中指定它,如下所示:

$ sudo vim /etc/kubernetes/apiserver
KUBE_ETCD_SERVERS=” — etcd_servers=http://etcd1:2379,http://etcd2:2379, http://etcd3:2379"
##OR
KUBE_ETCD_SERVERS=” — etcd_servers=http://<loadbalancer-IP>:2379

测试是否可以写入集群:

##Member list in a table
# etcdctl --write-out=table --endpoints=<loadbalancer_IP>:2379 member list
+------------------+---------+--------+------------------------+------------------------+
|        ID        | STATUS  |  NAME  |       PEER ADDRS       |      CLIENT ADDRS      |
+------------------+---------+--------+------------------------+------------------------+
| 8211f1d0f64f3269 | started | etcd1 | http://192.168.200.52:2380  | http://192.168.200.52:2379  |
| 91bc3c398fb3c146 | started | etcd2 | http://192.168.200.62:22380 | http://192.168.200.62:22379 |
| fd422379fda50e48 | started | etcd3 | http://192.168.200.63:32380 | http://192.168.200.63:32379 |
+------------------+---------+--------+------------------------+------------------------+

##Store a Key
$ etcdctl put key hello
OK

##Retrieve the Key
$ etcdctl get key
hello

4. 使用 TLS 证书保护 etcd

可以为您的 ETCD 集群生成和使用证书。这确保了节点之间的安全通信。为了证明这一点,我将为 ETCD 生成自签名证书。

我们可以使用 Mkcert 来实现这一点。首先,通过从 GitHub 版本中提取最新的二进制文件来安装它。我们将导出版本:

VER=v1.4.4

现在使用以下命令下载二进制文件:

##AMD64 
wget https://github.com/FiloSottile/mkcert/releases/download/$VER/mkcert-$VER-linux-amd64

##ARM64
wget https://github.com/FiloSottile/mkcert/releases/download/$VER/mkcert-$VER-linux-arm64

##ARM
wget https://github.com/FiloSottile/mkcert/releases/download/$VER/mkcert-$VER-linux-arm

使其可执行并将其移动到您的路径

chmod +x mkcert-$VER-linux-* 
sudo mv mkcert-$VER-linux-* /usr/local/bin/mkcert

现在使用以下命令生成证书:

mkcert -install
mkcert '*.computingforgeeks.com'

然后,您将在您的位置生成密钥和证书。 CA 位于 $ (mkcert -CAROOT)/rootCA.pem 中。您可以在客户端上复制并使用 CA 以避免 SSL 证书警告

将这些证书复制到所有 etcd 节点上。您可以使用SCP来实现这一点。

将证书移至所需目录后,输入 /etc/ssl/certs/etcd。您可以通过将以下行添加到配置中来配置 etcd 以使用它们:

节点 2 上的示例:

$ sudo vim /etc/default/etcd
ETCD_NAME=etcd2
##ETCD_DATA_DIR=/var/lib/etcd
ETCD_INITIAL_CLUSTER=etcd1=http://192.168.200.52:2380,etcd2=http://192.168.200.62:2380,etcd3=http://192.168.200.63:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.200.62:2380
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.200.62:2379
ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379

##[Security]
ETCD_CERT_FILE=/etc/ssl/certs/etcd/_wildcard.computingforgeeks.com.pem
ETCD_KEY_FILE=/etc/ssl/certs/etcd/_wildcard.computingforgeeks.com-key.pem
#ETCD_CLIENT_CERT_AUTH="false"
ETCD_TRUSTED_CA_FILE=/etc/ssl/certs/etcd/rootCA.pem

在所有 3 个服务器上进行更改后,重新启动 etcd 服务:

sudo systemctl restart etcd

您可以将 CA 证书添加到系统上的受信任证书列表中,如下所示:

sudo cp /etc/ssl/certs/etcd/rootCA.pem /usr/local/share/ca-certificates/rootCA.crt
sudo update-ca-certificates

如果您无法或不想将 CA 添加到受信任证书列表中,则可以通过指定它来访问集群,如下所示:

$ etcdctl --endpoints=https://192.168.200.56:2379 member list --cacert /path/to/rootCA.crt
12aca8afa5a60d1a, started, etcd1, https://192.168.200.52:2380, https://192.168.200.52:2379, false
3ccdae3b547878c4, started, etcd3, https://192.168.200.63:2380, https://192.168.200.63:2379, false
cdf1b4107740a046, started, etcd2, https://192.168.200.62:2380, https://192.168.200.62:2379, false

这表明节点内的通信是安全的。

判决

关于如何在 Ubuntu 22.04 上安装 3 节点 Etcd HA 集群的详细指南到此结束。您现在可以在 Kubernetes 集群中使用 etcd。我希望这是有用的。

查看更多:

  • 将 OpenShift 4.x 上的 Etcd 数据备份到 AWS S3 存储桶
  • 如何使用 Prometheus 和 Grafana 监控 Etcd 集群
  • 在 CentOS/Ubuntu/Debian/Fedora 上设置 Etcd 集群

3

站心网

容器化的概念现在无处不在。它可以被定义为将包和所有必需的依赖项打包在一个称为容器的轻量级可执行文件中..

为您推荐

ASP.NET如何将Views文件夹从项目分离

将 Views 文件夹从 ASP.NET 项目中分离是一个常见需求,比如为了实现模块化或分层架构。以下是实现此功能的完整步骤,从项目中分离 Views 文件夹,将其移到另一个独立的文件夹或项目中,并确保视图渲染仍然正常。1. ..

如何让AI写出Google认可的文章?

让 AI 写出 Google 认可的文章,核心在于满足 Google 的搜索排名算法要求。这些要求通常围绕以下几个关键点展开:内容质量、用户体验 和 SEO 优化。以下是详细指导:一、内容质量确保文章原创且有价值避免抄袭:Goog..

最新CentOS7安装搭建shadowsocks服务端+客户端使用图文教程

使用的CentOS版本是7.9,其他版本也可以。超级推荐的是搭建shadowsocks服务端,安装配置都很简单,几分钟就搞定,客户端支持PC移动端,下面是安装shadowsocks的过程,只要复制粘贴命令就行了,文件夹路径都不需要改..

如何从.NET Framework迁移到.NET Core或.NET 6/7?

从 .NET Framework 迁移到 .NET Core 或 .NET 6/7 是一个提升性能和跨平台能力的关键过程。以下是迁移的主要步骤和注意事项:迁移步骤1. 评估当前项目依赖项检查:确保所有第三方库和NuGet包都有与 .NET Core/.NET 6..

如何优化ASP.NET Core应用的性能?

优化ASP.NET Core应用性能需要从代码、数据库、配置、服务器和部署等多个层面进行综合考虑。以下是一些优化ASP.NET Core应用性能的关键方法和技巧:1. 代码级优化使用异步编程:避免阻塞线程,通过async和await处理I..

sourcetree安装跳过注册方法

SourceTree下载提取码: ni9m 需翻墙或者破解注册当前只有Win的版本,Mac自行百度很多人用git命令行不熟练,那么可以尝试使用sourcetree进行操作。然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者..

chrome 开发者工具如何查看元素:hover时的样式

在 Chrome 开发者工具中查看元素的 :hover 样式,可以通过以下步骤实现:打开开发者工具:右键点击页面中的元素,然后选择“检查(Inspect)”或按下 F12 或 Ctrl + Shift + I (Windows) / Cmd + Option +..

.NET 9 即将推出的功能Task.WhenEach

.NET 爱好者!我刚刚偶然发现了一个非常酷的新 PR,它被合并到 .NET 运行时存储库中,我想分享一个例子。希望您能为新的 .NET 版本大肆宣传!在即将到来的 .NET 9 版本中,我们预计会有一个名为 .它在这里让您的异步..

针对 Go 语言开发的 SQL 驱动模拟库

数据库交互是几乎所有应用程序不可或缺的一部分,开发者们常常需要对数据库进行各种操作,包括插入、更新、删除和查询等。然而,在开发过程中直接对真实数据库进行操作不仅耗时耗力,还可能带来数据一致性和安全性的..

DockerUI 中文可视化Docker管理工具使用示例

DockerUI 是由国内开发者打造的一款优秀的 Docker 可视化管理工具。该工具拥有简洁直观的UI界面,可以轻松进行Docker主机管理、集群管理,以及Docker任务的编排等操作。DockerUI不仅展示了资源利用率、系统信息和更..

Blazor的N种渲染模式原理和常见问题说明

我们从下面这幅图开始,下图显示了三种渲染模式,分别称之为静态SSR、交互式SSR(即之前的BlazorServer)、交互式CSR(即之前的BlazorWasm)。还有一种渲染模式BlazorHybrid,稍后说。一、先浅层理解一个图例静态SSR:经..

前端CSS常见的三种设计模式

CSS设计模式主要包括OOCSS、SMACSS和BEMCSS等。以下是对这些模式的具体介绍:OOCSS:面向对象的CSS,旨在编写高可复用、低耦合和高扩展的CSS代码。它将抽象(结构)和实现(样式)分离,抽离公共代码,以提高代码的..

WinToUSB | 把Windows塞进U盘里即插即用

不论是在外出差,还是在家临时办公,现在很多设备携带起来都不是那么方便,在这种情况下,有一个轻巧而高效的操作系统环境就显得格外关键。今天,要给大家介绍一款超级实用的便携式系统启动盘,凭借其独特功能和卓越..

.NET Framework被淘汰了吗?

.NET Framework并未完全被淘汰,但它的某些版本确实已经停止支持。微软在2023年11月10日停止了对.NET Framework 4.8之前的版本的支持。这一决策意味着使用这些旧版本的应用程序将不再获得安全更新和其他维护,从而可..

强大的 .NET Mock 框架 单元测试模拟库Moq使用教程

单元测试是确保代码质量和可靠性的重要手段。当我们的代码依赖于外部系统、数据库或第三方服务时,编写有效的单元测试可能会变得复杂且耗时。为了简化这一过程,模拟(Mocking)技术应运而生。在 .NET 生态系统中,M..

CLS 问题:超过 0.1(桌面设备) 是什么意思?

在网页设计和开发中,CLS(Cumulative Layout Shift)是指页面布局的累计偏移量。当一个用户与页面互动时,如果页面的某些元素突然改变位置或大小,导致整个布局发生偏移,就会产生布局偏移。这种偏移可能会影响用户..

Angular UT 模拟执行setTimeout

在 Angular 单元测试中,我们经常需要模拟异步操作,比如 setTimeout。提高测试速度: 真实环境下的 setTimeout 会阻塞测试,导致测试运行时间过长。确保测试的可靠性: 模拟 setTimeout 可以让我们更好地控制异步操..

JavaScript 的 sessionStorage 能否加锁?

直接给 sessionStorage 加锁是不可能的。sessionStorage 的本质: sessionStorage 是浏览器提供的一种用于在当前浏览器会话中存储数据的机制。它存储在客户端,数据仅在当前浏览器窗口或标签页中有效。加锁的必要性..

Redis 同步、击穿、穿透及雪崩简述

对Redis最常见的几个问题,简要的说下我的理解与解决方法。数据同步指Redis做为缓存,在数据变化时,怎么保持与数据库数据同步的。一般解决方案为:缓存双删(同步方案大都采用删除缓存,而不会更新新缓存。缓存击穿..

Vue 3.5引入新特性 还有与SSR相关的改进

Vue 3.5引入了响应式属性解构、useTemplateRef方法、useId实用函数、内部响应性重构等新特性。以下是具体介绍:响应式属性解构此功能允许开发者在defineProps宏中解构属性而不会失去响应性,这为组件间的属性传递提..

发表回复

返回顶部