雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

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

2024-07-16 37

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

更新于:2个月前
赞一波!

文章评论

全部评论