安装1个etcd集群要求:
- 三台服务器
- 开启auth认证
- 使用http, 不使用https加密
- 开启用户名/密码认证
因为我们部署的是内部的可信的服务, 而且只局限在三台服务器中使用, 给apisix做存储使用. 为了简化部署, 减少管理证书的复杂性. 我没有开启https.
服务器情况
#
服务器三台, IP地址分别为: 10.61.129.19-21. centos7.9的操作系统.
本节需要在每一台服务器上执行
#
部署可执行文件
#
将etcd安装在/data/etcd/
目录中.
1
2
3
4
5
6
7
| yum install -y wget
cd /tmp
wget https://llaoj.oss-cn-beijing.aliyuncs.com/files/github.com/etcd-io/etcd/releases/download/v3.5.16/etcd-v3.5.16-linux-amd64.tar.gz
tar zxf etcd-v3.5.16-linux-amd64.tar.gz
mkdir /data/etcd/{bin,conf,data,log} -p
mv etcd-v3.5.16-linux-amd64/{etcd,etcdctl} /data/etcd/bin/
cd /data/etcd/conf/
|
部署配置文件
#
因为是三台服务, 要根据每台服务器的IP地址修改配置文件, 下面的脚本可以动态发现IP地址, 一键执行.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| NODE_IP=$(ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p')
ETCD_NAME=etcd-${NODE_IP//./-}
cat > /data/etcd/conf/etcd.conf <<EOF
[Member]
ETCD_NAME="$ETCD_NAME"
ETCD_DATA_DIR="/data/etcd/data"
ETCD_LISTEN_PEER_URLS="http://$NODE_IP:2380"
ETCD_LISTEN_CLIENT_URLS="http://$NODE_IP:2379"
[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://$NODE_IP:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://$NODE_IP:2379"
ETCD_INITIAL_CLUSTER="etcd-10-61-129-19=http://10.61.129.19:2380,etcd-10-61-129-20=http://10.61.129.20:2380,etcd-10-61-129-21=http://10.61.129.21:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-token"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
|
部署系统服务
#
下面的命令可以直接执行, 无需修改.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| cat > /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/data/etcd/conf/etcd.conf
ExecStart=/data/etcd/bin/etcd --log-outputs=/data/etcd/log/etcd.log --log-level=info
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable etcd.service
systemctl restart etcd.service
systemctl status etcd
|
刚开始启动服务,先启动的服务会卡一下,等待其他ETCD服务启动之后, 集群就正常了.
至此, 部署基本完成, 还需要使用etcdctl对etcd进行一些简单的配置.
本节只需要执行一次
#
集群状态查询
#
查看所有端点的列表:
1
2
3
4
5
6
7
8
9
10
11
12
| /data/etcd/bin/etcdctl -w table \
--endpoints="http://10.61.129.19:2379,http://10.61.129.20:2379,http://10.61.129.21:2379" \
endpoint status
# 输出
+--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| http://10.61.129.19:2379 | c7cd61fc0d86bc44 | 3.5.16 | 20 kB | true | false | 5 | 18 | 18 | |
| http://10.61.129.20:2379 | 46574707029bb1c9 | 3.5.16 | 20 kB | false | false | 5 | 18 | 18 | |
| http://10.61.129.21:2379 | 3baf5e1353c7e837 | 3.5.16 | 20 kB | false | false | 5 | 18 | 18 | |
+--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|
查看集群中所有的成员
1
2
3
4
5
6
7
8
9
10
11
12
| /data/etcd/bin/etcdctl -w table \
--endpoints="http://10.61.129.19:2379,http://10.61.129.20:2379,http://10.61.129.21:2379" \
member list
# 输出
+------------------+---------+-------------------+--------------------------+--------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+-------------------+--------------------------+--------------------------+------------+
| 3baf5e1353c7e837 | started | etcd-10-61-129-21 | http://10.61.129.21:2380 | http://10.61.129.21:2379 | false |
| 46574707029bb1c9 | started | etcd-10-61-129-20 | http://10.61.129.20:2380 | http://10.61.129.20:2379 | false |
| c7cd61fc0d86bc44 | started | etcd-10-61-129-19 | http://10.61.129.19:2380 | http://10.61.129.19:2379 | false |
+------------------+---------+-------------------+--------------------------+--------------------------+------------+
|
注意, 这里的PEER ADDRS是集群内部不同的ETCD实例之间通讯的地址, 使用的是端口2380. 而CLIENT ADDRS/ENDPOINT是指ETCD对外提供服务的地址, 监听2379端口.
[可选]开启身份验证
#
刚安装的集群默认是关闭认证的, 查看认证状态:
1
2
3
4
5
6
| /data/etcd/bin/etcdctl \
--endpoints="http://10.61.129.19:2379,http://10.61.129.20:2379,http://10.61.129.21:2379" \
auth status
Authentication Status: false
AuthRevision: 1
|
下面我们开启auth认证, 下面的这一步是可选的. 不操作也行.
- 创建root用户
执行后, 会提示输出密码,并确认密码.
1
2
3
| /data/etcd/bin/etcdctl \
--endpoints="http://10.61.129.19:2379,http://10.61.129.20:2379,http://10.61.129.21:2379" \
user add root
|
- 给用户并赋予root角色
etcd默认存在一个root权限, 具有最高权限. 我们使用该角色.
1
2
3
| /data/etcd/bin/etcdctl \
--endpoints="http://10.61.129.19:2379,http://10.61.129.20:2379,http://10.61.129.21:2379" \
user grant-role root root
|
- 开启身份认证
1
2
3
| /data/etcd/bin/etcdctl \
--endpoints="http://10.61.129.19:2379,http://10.61.129.20:2379,http://10.61.129.21:2379" \
auth enable
|
开启认证之后, 上面的etcdctl命令需要增加--user=root --password='password'
选项, 才可以访问. 否则会提示没有权限.
- 使用账号密码查询身份认证状态
我们使用刚创建的root用户来查询etcd的认证状态
1
2
3
4
| /data/etcd/bin/etcdctl \
--endpoints="http://10.61.129.19:2379,http://10.61.129.20:2379,http://10.61.129.21:2379" \
--user=root --password='password' \
auth status
|
至此, 所有部署完成.
总结
#
就是先在每个节点上安装可执行文件, 配置好配置文件, 然后使用系统服务的方式启动. 等三台服务器都安装启动完毕, 就算安装成功了.
最后需要使用etcdctl与etcd集群交互, 来开启auth认证. 其实这一步不执行也行, 就是安全性稍微高一点.