在CentOS 7/8/Ubuntu 18.04/16.04/Debian 10/9上设置Etcd群集

时间:2020-02-23 14:31:49  来源:igfitidea点击:

欢迎来到我们的教程,了解如何在CentOS 7/8/Ubuntu 18.04/16.04/Debian 10/9/Fedora 30/29 Linux机器上设置etcd集群。
本教程将详细讨论在Linux机器上设置三节点etcd群集的理想设置–可以是Ubuntu/Debian/CentOS/Fedora/Arch/Linux Mint或者其他现代Linux发行版上的Etcd群集。

etcd是用于分布式系统最关键数据的分布式可靠键值存储。
它是用Go语言编写的,并使用Raft共识算法来管理高可用性的复制日志。

Etcd设计为:

简单:定义明确的,面向用户的API(gRPC)安全:具有可选客户端证书身份验证的自动TLS快速:基准10,000次写入/秒可靠:使用Raft正确分发

Linux上的Etcd群集设置– CentOS/Ubuntu/Debian/Fedora

此设置应可在所有使用systemd服务管理器的Linux发行版上使用。
此设置基于以下服务器网络信息和详细信息。

|||
| --- - | --- |
| etcd1 | 192.168.18.9 |
| etcd2 | 192.168.18.10 |
| etcd3 | 192.168.18.11 |

由于我所有的服务器都使用Systemd服务管理器,因此可以使用命令设置主机名。

# Node 1
sudo hostnamectl set-hostname etcd1.mydomain.com --static
sudo hostname etcd1.mydomain.com
# Node 2
sudo hostnamectl set-hostname etcd2.mydomain.com --static
sudo hostname etcd2.mydomain.com

# Node 3
sudo hostnamectl set-hostname etcd3.mydomain.com --static
sudo hostname etcd3.mydomain.com

代替 mydomain.com与我们服务器的域名。
可以将服务器名称映射到本地DNS上的正确IP地址,或者通过将记录直接添加到每台服务器上的/etc/hosts文件中。

sudo tee -a /etc/hosts<<EOF
192.168.18.9  etcd1.mydomain.com etcd1
192.168.18.10 etcd2.mydomain.com etcd2
192.168.18.11 etcd3.mydomain.com etcd3
EOF

步骤1:下载并安装etcd Binaries(所有节点)

登录到每个要使用的etcd群集节点,然后下载etcd二进制文件。
这是在所有节点上完成的。
创建临时目录。

mkdir /tmp/etcd && cd /tmp/etcd

安装wget。

# RHEL family
sudo yum -y install wget
# Debian family
sudo apt-get -y install wget
# Arch/Manjaro
sudo pacman -S wget

下载etcd二进制存档。

curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest \
  | grep browser_download_url \
  | grep linux-amd64 \
  | cut -d '"' -f 4 \
  | wget -qi 

取消存档文件,然后将二进制文件移至/usr/local/bin目录。

tar xvf *.tar.gz
cd etcd-*/
sudo mv etcd* /usr/local/bin/
cd ~
rm -rf /tmp/etcd

检查etcd和etcdctl版本。

$etcd --version
etcd Version: 3.3.13
Git SHA: 98d3084
Go Version: go1.10.8
Go OS/Arch: linux/amd64
$etcdctl --version
etcdctl version: 3.3.13
API version: 2

步骤2:创建etcd目录和用户(所有节点)

我们将etcd配置文件存储在/etc/etcd目录中,并将数据存储在/var/lib/etcd中。
用于管理服务的用户和组称为etcd。 etcd系统用户/组。

sudo groupadd --system etcd
sudo useradd -s /sbin/nologin --system -g etcd etcd

然后为etcd创建数据和配置目录。

sudo mkdir -p /var/lib/etcd/
sudo mkdir /etc/etcd
sudo chown -R etcd:etcd /var/lib/etcd/

步骤3:在所有节点上配置etcd

我们需要在所有三个服务器上填充系统服务单元文件。
但是首先,需要一些环境变量才能继续进行操作。
在每台服务器上,通过运行以下命令来保存这些变量。

INT_NAME="eth0"
ETCD_HOST_IP=$(ip addr show $INT_NAME | grep "inet\b" | awk '{print }' | cut -d/-f1)
ETCD_NAME=$(hostname -s)

其中:INT_NAME是用于群集通信的网络接口的名称。
更改它以匹配服务器配置。
ETCD_HOST_IP是指定网络接口的内部IP地址。
这用于服务客户机请求并与etcd集群对等方通信。
ETCD_NAME–每个etcd成员在etcd集群中必须具有唯一的名称。
使用的命令将设置etcd名称以匹配当前计算实例的主机名。
一旦设置了所有变量,请创建 etcd.servicesystemd单位文件:

cat <<EOF | sudo tee /etc/systemd/system/etcd.service
[Unit]
Description=etcd service
Documentation=https://github.com/etcd-io/etcd
[Service]
Type=notify
User=etcd
ExecStart=/usr/local/bin/etcd \
  --name ${ETCD_NAME} \
  --data-dir=/var/lib/etcd \
  --initial-advertise-peer-urls http://${ETCD_HOST_IP}:2380 \
  --listen-peer-urls http://${ETCD_HOST_IP}:2380 \
  --listen-client-urls http://${ETCD_HOST_IP}:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://${ETCD_HOST_IP}:2379 \
  --initial-cluster-token etcd-cluster-0 \
  --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 \
  --initial-cluster-state new \
[Install]
WantedBy=multi-user.target
EOF

如果我们没有在/etc/hosts文件中添加有效的名称解析或者映射,请用节点IP地址替换etcd1,etcd2和etcd3.
对于CentOS/RHEL Linux发行版,请将SELinux模式设置为宽松。

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

如果我们有活动的防火墙服务,请允许端口2379和2380。

# RHEL/CentOS/Fedora firewalld
sudo firewall-cmd --add-port={2379,2380}/tcp --permanent
sudo firewall-cmd --reload
# Ubuntu/Debian
sudo ufw allow proto tcp from any to any port 2379,2380

步骤4:启动etcd服务器

通过在每个群集节点上运行以下命令来启动etcd服务。

sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd

确认etcd服务正在所有节点上运行。

[Hyman@theitroad ~]$systemctl status etcd -l
● etcd.service - etcd service
   Loaded: loaded (/etc/systemd/system/etcd.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 30s ago
     Docs: https://github.com/etcd-io/etcd
 Main PID: 5931 (etcd)
   CGroup: /system.slice/etcd.service
           └─5931 /usr/local/bin/etcd --name etcd1 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.9:2380 --listen-peer-urls http://192.168.18.9:2380 --listen-client-urls http://192.168.18.9:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.9:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
....................................................................................
[Hyman@theitroad ~]$systemctl status etcd -l
● etcd.service - etcd service
   Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 2min 17s ago
     Docs: https://github.com/etcd-io/etcd
 Main PID: 5949 (etcd)
   CGroup: /system.slice/etcd.service
           └─5949 /usr/local/bin/etcd --name etcd2 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.10:2380 --listen-peer-urls http://192.168.18.10:2380 --listen-client-urls http://192.168.18.10:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.10:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
....................................................................................
[Hyman@theitroad ~]$systemctl status etcd -l
● etcd.service - etcd service
   Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 3min 20s ago
     Docs: https://github.com/etcd-io/etcd
 Main PID: 5974 (etcd)
   CGroup: /system.slice/etcd.service
           └─5974 /usr/local/bin/etcd --name etcd3 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.11:2380 --listen-peer-urls http://192.168.18.11:2380 --listen-client-urls http://192.168.18.11:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.11:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new

步骤5:测试Etcd群集安装

通过列出etcd集群成员来测试设置:

$etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=false
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=true

要使用etcd v3,我们需要明确指定版本。

$ETCDCTL_API=3 etcdctl member list
152d6f8123c6ac97, started, etcd3, http://etcd3:2380, http://192.168.18.11:2379
332a8a315e569778, started, etcd2, http://etcd2:2380, http://192.168.18.10:2379
aebb404b9385ccd4, started, etcd1, http://etcd1:2380, http://192.168.18.9:2379

另外,通过运行以下命令检查集群运行状况:

$etcdctl cluster-health
member 152d6f8123c6ac97 is healthy: got healthy result from http://192.168.18.11:2379
member 332a8a315e569778 is healthy: got healthy result from http://192.168.18.10:2379
member aebb404b9385ccd4 is healthy: got healthy result from http://192.168.18.9:2379
cluster is healthy

我们还要尝试写入etcd。

$etcdctl set /message "Hello World"
Hello World

读取的值 messageback –应该在所有节点上都可以工作。

$etcdctl get /message
Hello World

创建目录。

$etcdctl mkdir /myservice
$etcdctl set /myservice/container1 localhost:8080
localhost:8080
$etcdctl ls /myservice
/myservice/container1

步骤6 –测试领导者失败

当领导者失败时,etcd集群会自动选举一个新的领导者。
领导人一旦失败,选举不会立即进行。
由于故障检测模型基于超时,因此选举新领导者需要一个选举超时。
在领导者选举期间,群集无法处理任何写入。
选举期间发送的写请求将排队等待处理,直到选举出新的领导者为止。
我们当前的领导者为etcd1 –节点1.

$etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=false
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=true

让我们把它记下来。

[Hyman@theitroad ~]$sudo systemctl stop etcd

检查新的Leader – Now etcd2服务器。

$etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=true
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=false

一旦启动etcd1服务,除非leader掉线,否则leader将保留etcd2.