如何在 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 集群
更新于:6个月前
相关文章
- 【说站】如何在mysql表中进行导入
- 【说站】python如何在二维图像上进行卷积
- 【说站】SKlearn如何在python安装?
- 【说站】python Task如何在协程调用
- 【说站】java如何在表格添加水印
- 【说站】python变量如何在作用域使用
- 【说站】Python如何在列表中添加新值
- 【说站】Java如何在PDF添加注释
- 【说站】java软引用如何在浏览器使用
- 如何在 JavaScript 中使用正则表达式删除 HTML 标签?
- linux的shell脚本中如何在一个字符串中查找指定字符串是否存在
- 你如何在 Python 中循环字典?
- 如何在 Anaconda 中安装 Python 包?
- 你如何在 Python 中编写自动售货机代码?
- 如何在 Python 中读取 .data 文件?
- 如何在 Python 中创建静态类数据和静态类方法?
- 如何在 Python 中使用 Matplotlib 创建一个空的 Figure?
- 如何在 seaborn 中创建三角相关热图?
- 如何在Python中创建AGE计算器Web App PyWebIO?
- 如何在 Python 中只删除空文件夹?