Docker - Etcd集群部署(可用作分布式锁)

简介

etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。主要用于配置共享和服务发现(类:Zookeeper、Consul)、分布式锁(类:RedLock)。

本示例在单机上启用多个Docker容器来模拟集群,所以需要创建自定义网络来指定IP分配。

一、拉取镜像

docker pull bitnami/etcd:3.5.6

二、创建网络

# 真实场景,这一步不是必须
# 构建个自定义网络,因为我们要给各个节点分配IP地址,Docker容器默认网络只能自动配IP无法手动分配。
docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 bridge-net

三、启动程序

etcd1
docker run -d \
-p 2379:2379 -p 2380:2380 \
--restart unless-stopped \
# 自定义网络
--network bridge-net \
--ip 172.18.1.1 \
--name etcd1 \
# 节点名称
-e ETCD_NAME=etcd1 \
-e ALLOW_NONE_AUTHENTICATION=yes \
# 告知集群自己集群客户端地址
-e ETCD_ADVERTISE_CLIENT_URLS=http://172.18.1.1:2379 \
# 告知集群自己集群通讯地址
-e ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.18.1.1:2380 \
# 监听客户端通讯的URL列表、监听伙伴通讯的URL列表
-e ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 -e ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 \
# 初始化集群TOKEN,只有相同token的节点才能加入到同一集群
-e ETCD_INITIAL_CLUSTER_TOKEN=manongdashu \
# 所有集群节点的地址列表
-e ETCD_INITIAL_CLUSTER=etcd1=http://172.18.1.1:2380,etcd2=http://172.18.1.2:2380,etcd3=http://172.18.1.3:2380 \
# 初始化集群状态,默认为new,也可以指定为existing表示要加入到一个已有集群
-e ETCD_INITIAL_CLUSTER_STATE=new \
# 数据文件映射
-v /data/etcd1/data:/bitnami/etcd/data \
-v /etc/localtime:/etc/localtime:ro \
bitnami/etcd:3.5.6
 etcd2
docker run -d \
-p 2479:2379 -p 2480:2380 \
--restart unless-stopped \
--network bridge-net \
--ip 172.18.1.2 \
--name etcd2 \
-e ETCD_NAME=etcd2 \
-e ALLOW_NONE_AUTHENTICATION=yes \
-e ETCD_ADVERTISE_CLIENT_URLS=http://172.18.1.2:2379 \
-e ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.18.1.2:2380 \
-e ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 -e ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 \
-e ETCD_INITIAL_CLUSTER_TOKEN=manongdashu \
-e ETCD_INITIAL_CLUSTER=etcd1=http://172.18.1.1:2380,etcd2=http://172.18.1.2:2380,etcd3=http://172.18.1.3:2380 \
-e ETCD_INITIAL_CLUSTER_STATE=new \
-v /data/etcd2/data:/bitnami/etcd/data \
-v /etc/localtime:/etc/localtime:ro \
bitnami/etcd:3.5.6
 etcd3
docker run -d \
-p 2579:2379 -p 2580:2380 \
--restart unless-stopped \
--network bridge-net \
--ip 172.18.1.3 \
--name etcd3 \
-e ETCD_NAME=etcd3 \
-e ALLOW_NONE_AUTHENTICATION=yes \
-e ETCD_ADVERTISE_CLIENT_URLS=http://172.18.1.3:2379 \
-e ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.18.1.3:2380 \
-e ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 -e ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 \
-e ETCD_INITIAL_CLUSTER_TOKEN=manongdashu \
-e ETCD_INITIAL_CLUSTER=etcd1=http://172.18.1.1:2380,etcd2=http://172.18.1.2:2380,etcd3=http://172.18.1.3:2380 \
-e ETCD_INITIAL_CLUSTER_STATE=new \
-v /data/etcd3/data:/bitnami/etcd/data \
-v /etc/localtime:/etc/localtime:ro \
bitnami/etcd:3.5.6

四、状态检查

# 查看集群状态
docker exec -it etcd1 etcdctl --write-out=table --endpoints=172.18.1.1:2379,172.18.1.2:2379,172.18.1.3:2379 endpoint status

五、分配权限

# 特殊的一个用户&角色:root用户拥有etcd的所有权限,且必须在激活身份认证之前就创建好. root用户的设计主要是出于管理的目的: 管理角色和普通用户. root用户必须具有root角色
# PowerShell定义变量:$endpoints='172.18.1.1:2379,172.18.1.2:2379,172.18.1.3:2379'
endpoints=172.18.1.1:2379,172.18.1.2:2379,172.18.1.3:2379

# 创建角色:root、read_write、read_only
docker exec -it etcd1 etcdctl --endpoints=$endpoints role add root
# docker exec -it etcd1 etcdctl --endpoints=$endpoints role add read_write
# docker exec -it etcd1 etcdctl --endpoints=$endpoints role add read_only

# 给角色赋予权限
# docker exec -it etcd1 etcdctl --endpoints=$endpoints role grant-permission read_write --prefix=true readwrite /
# docker exec -it etcd1 etcdctl --endpoints=$endpoints role grant-permission read_only --prefix=true read /

# 创建用户:密码
docker exec -it etcd1 etcdctl --endpoints=$endpoints user add root:manongdashu
# docker exec -it etcd1 etcdctl --endpoints=$endpoints user add admin:manongdashu
# docker exec -it etcd1 etcdctl --endpoints=$endpoints user add monitor:manongdashu

# 给用户分配角色
docker exec -it etcd1 etcdctl --endpoints=$endpoints user grant-role root root
# docker exec -it etcd1 etcdctl --endpoints=$endpoints user grant-role admin read_write
# docker exec -it etcd1 etcdctl --endpoints=$endpoints user grant-role monitor read_only

# 开启权限认证
docker exec -it etcd1 etcdctl --endpoints=$endpoints auth enable
# 取消权限认证
docker exec -it etcd1 etcdctl --endpoints=$endpoints --user=root:manongdashu auth disable
分享到:
本文链接:https://blog.renzicu.com/2023/06/195.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!
THE END
二维码
打赏
文章目录
关闭
目 录