一、ETCD集群部署
当时主要作为APISIX数据库,但是采用https协议时候apisix总是配置认证不生效,所以采用http形式部署,为了方便理解,以下存在的IP以及密码都为虚拟
三台机器分别为
主机名 | IP |
---|---|
etcd1 | 1.1.1.1 |
etcd2 | 1.1.1.2 |
etcd3 | 1.1.1.3 |
一、安装前的准备
在开始etcd的安装之前,需要做以下准备工作:
- 确定etcd集群的大小和节点数量:etcd集群的大小指的是集群中etcd节点的数量,一般建议至少部署3个节点。如果集群规模较大,可以考虑增加节点数量,以提高可用性和性能。
- 确定etcd节点的IP地址和主机名:每个etcd节点都需要有一个唯一的IP地址和主机名。这些信息将用于配置etcd集群。
- 确定etcd集群的通信端口:etcd集群使用的默认端口是2379和2380,如果需要使用其他端口,需要在配置文件中进行配置。
- 安装etcd二进制文件:etcd可以从官方网站(https://github.com/etcd-io/etcd/releases )下载预编译的二进制文件,也可以通过源代码进行编译。本文将使用预编译的二进制文件进行安装。
二、安装ETCD集群
下载etcd二进制文件
从官方网站(https://github.com/etcd-io/etcd/releases )下载适合自己操作系统的etcd二进制文件。本文以Linux为例,下载文件名为etcd-v3.5.11-linux-amd64.tar.gz的压缩包。
解压缩etcd二进制文件
1、创建工作目录,三台机器都需要执行
#运行文件
mkdir -p /data/service/etcd/bin/
#配置文件
mkdir -p /data/service/etcd/conf/
#日志信息
mkdir -p /data/service/etcd/log/
#数据信息,后续执行启动命令会自动创建
mkdir -p /data/service/etcd/data/
1.1 etcd1机器将下载的压缩包解压缩到指定的目录,例如:/data/service/etcd/bin
cd /data/service/etcd/
rz etcd-v3.5.11-linux-amd64.tar.gz
tar xzvf etcd-v3.5.11-linux-amd64.tar.gz -C /data/service/etcd/bin --strip-components=1
2、分发etcd软件
etcd1上执行
scp /data/service/etcd/bin/etcd* 1.1.1.2:/data/service/etcd/bin
scp /data/service/etcd/bin/etcd* 1.1.1.3:/data/service/etcd/bin
3、创建配置文件
三台机器上分别执行自己的配置信息
etcd1上执行
cat > /data/service/etcd/conf/etcd.conf <<EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/data/service/etcd/data"
ETCD_LISTEN_PEER_URLS="http://1.1.1.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://1.1.1.1:2379,http://127.0.0.1:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://1.1.1.1:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://1.1.1.1:2379"
ETCD_INITIAL_CLUSTER="etcd-1=http://1.1.1.1:2380,etcd-2=http://1.1.1.2:2380,etcd-3=http://1.1.1.3:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
etcd2上执行
cat > /data/service/etcd/conf/etcd.conf <<EOF
#[Member]
ETCD_NAME="etcd-2"
ETCD_DATA_DIR="/data/service/etcd/data"
ETCD_LISTEN_PEER_URLS="http://1.1.1.2:2380"
ETCD_LISTEN_CLIENT_URLS="http://1.1.1.2:2379,http://127.0.0.1:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://1.1.1.2:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://1.1.1.2:2379"
ETCD_INITIAL_CLUSTER="etcd-1=http://1.1.1.1:2380,etcd-2=http://1.1.1.2:2380,etcd-3=http://1.1.1.3:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
etcd3上执行
cat > /data/service/etcd/conf/etcd.conf <<EOF
#[Member]
ETCD_NAME="etcd-3"
ETCD_DATA_DIR="/data/service/etcd/data"
ETCD_LISTEN_PEER_URLS="http://1.1.1.3:2380"
ETCD_LISTEN_CLIENT_URLS="http://1.1.1.3:2379,http://127.0.0.1:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://1.1.1.3:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://1.1.1.3:2379"
ETCD_INITIAL_CLUSTER="etcd-1=http://1.1.1.1:2380,etcd-2=http://1.1.1.2:2380,etcd-3=http://1.1.1.3:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
上述etcd.conf配置信息说明
ETCD_NAME:节点名称,集群中唯一
ETCD_DATA_DIR:数据目录
ETCD_LISTEN_PEER_URLS:集群通信监听地址
ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址
ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址
ETCD_INITIAL_CLUSTER:集群节点地址
ETCD_INITIAL_CLUSTER_TOKEN:集群Token
ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群
etcd1、etcd2、etcd3三台机器上分别执行脚本
cat > /etc/systemd/system/etcd.service <<"EOF"
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=-/data/service/etcd/conf/etcd.conf
WorkingDirectory=/data/service/etcd/
ExecStart=/data/service/etcd/bin/etcd \
--log-outputs=/data/service/etcd/log/etcd.log \
--log-level=info
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
参数说明:
–log-outputs表示日志路径
EnvironmentFile表示配置文件路径
4、启动etcd集群
4.1 执行相关启动命令
重新加载服务,三台机器分别执行
systemctl daemon-reload
启动etcd服务命令,三台机器分别执行
#启动服务,先启动的服务会卡主一下,等待其他服务启动
systemctl start etcd
启动成功后设置开机自启,三台机器分别执行
systemctl enable etcd
4.2 检查etcd服务是否正常运行:
systemctl status etcd
如果etcd服务正常运行,应该输出类似以下的信息::active (running)
● etcd.service - Etcd Server
Loaded: loaded (/etc/systemd/system/etcd.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2024-01-16 13:52:14 CST; 36s ago
Main PID: 8850 (etcd)
CGroup: /system.slice/etcd.service
└─8850 /data/service/etcd/bin/etcd --log-outputs=/data/service/etcd/log/etcd...
Jan 16 13:51:23 ctos-etcd-dev-01 etcd[8850]: {"level":"info","ts":"2024-01-16T13:51:2..."}
Jan 16 13:52:14 ctos-etcd-dev-01 systemd[1]: Started Etcd Server.
4.3 集群状态查询
/data/service/etcd/bin/etcdctl -w table endpoint status --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" member list
ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
---|---|---|---|---|---|---|---|---|---|
http://1.1.1.1:2379 | 7**************6 | 3.5.11 | 20 kB | true | false | 2 | 59 | 59 | |
http://1.1.1.2:2379 | 9**************e | 3.5.11 | 20 kB | false | false | 2 | 59 | 59 | |
http://1.1.1.3:2379 | e**************0 | 3.5.11 | 20 kB | false | false | 2 | 59 | 59 |
三、开启身份验证
密码统一为aaa123(虚拟密码)
- 查看认证状态
/data/service/etcd/bin/etcdctl --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" auth status
默认为false
- 开启认证
2.1 创建root用户(执行后输出密码,确认密码)
/data/service/etcd/bin/etcdctl --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" user add root
2.2 给root用户并赋予root角色
注意:etcd默认存在一个root权限 可以操作任意数据
/data/service/etcd/bin/etcdctl --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" user grant-role root root
2.3 开启身份认证
#开启认证
/data/service/etcd/bin/etcdctl --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" auth enable
#使用账号密码查询身份认证状态
/data/service/etcd/bin/etcdctl --user=root --password='aaa123' --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" auth status
四、创建新用户供其他模块使用
例如创建对/apisix开头的key具有读写权限的用户(测试用户名guyougao 角色为devops),模版如下:
- 创建一个devops角色
/data/service/etcd/bin/etcdctl --user=root --password='aaa123' --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" role add devops
- 让devops角色对/dev开头的key有读写权限
/data/service/etcd/bin/etcdctl --user=root --password='aaa123' --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" role grant-permission devops readwrite /dev --prefix=true
其他相关授权命令
需求 | 命令 |
---|---|
对 k1 ~ k100 有读写权限 [k1 k100) | grant-permission devops readwrite k1 k100 |
对/test开头的key只有查询权限 | grant-permission devops read /test --prefix=true |
对/ops开头的key只有写权限 | grant-permission devops write /ops |
- 创建guyougao用户(执行后输出密码,确认密码)
/data/service/etcd/bin/etcdctl --user=root --password='aaa123' --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" user add guyougao
- 给guyougao用户赋予devops角色
/data/service/etcd/bin/etcdctl --user=root --password='aaa123' --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" user grant-role guyougao devops
- 使用新创建的用户对/dev开头的key进行相关验证
#增加数据
/data/service/etcd/bin/etcdctl --user=guyougao --password='aaa123' --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" put /dev/success success
#查询数据
/data/service/etcd/bin/etcdctl --user=guyougao --password='aaa123' --endpoints="http://1.1.1.1:2379,http://1.1.1.2:2379,http://1.1.1.3:2379" get /dev/success
#返回结果表示完成
五、ETCD常用命令
etcdctl的 常用子命令
version: 查看版本
member list: 查看节点状态,learner 情况
endpoint status: 节点状态,leader 情况
endpoint health: 健康状态与耗时
alarm list: 查看警告,如存储满时会切换为只读,产生 alarm
alarm disarm:清除所有警告
set app demo: 写入
get app: 获取
update app demo1:更新
rm app: 删除
mkdir demo 创建文件夹
rmdir dir 删除文件夹
backup 备份
compaction: 压缩
defrag:整理碎片
watch key 监测 key 变化
get / –prefix –keys-only: 查看所有 key
权限相关的命令
role add 创建角色
role delete 删除角色
role get 查看角色
role grant-permission 配置角色权限
role list 查询所有角色
role revoke-permission 撤销角色权限