本章操作内容建立在第二章静态发现 ※2.3 多机搭建Etcd集群 基础上
Etcd教程 — 第二章 Etcd集群静态发现 ※2.3 多机搭建Etcd集群
2 Etcd集群动态发现
2.1 需求背景
在实际环境中,集群成员的ip可能不会提前知道。如使用dhcp自动获取的情况,在这些情况下,使用自动发现来引导etcd集群,而不是指定静态配置,这个过程被称为“发现”。
2.2 实现机制
Discovery Service Protocol
帮助新的Etcd成员使用共享URL在集群引导阶段发现所有其他成员。- 该协议使用新的发现令牌来引导一个唯一的etcd集群。一个发现令牌只能代表一个etcd集群。只要此令牌上的发现协议启动,即使它中途失败,也不能用于引导另一个etcd集群。
提示
:Discovery service protocol仅用于集群引导阶段,不能用于运行时重新配置或集群监视
。
2.3 工作流程
- 所有新成员都与发现服务交互并帮助生成预期的成员列表。
- 每个新成员使用此列表引导其服务器。
- 该列表执行与
--initial-cluster
标志相同的功能,即设置集群所有成员的信息。
2.4 各服务器配置
注意:node01、node02、node03在 2.3 多机搭建Etcd集群
时已用做搭建etcd静态集群,这里仅使用node04、node05来搭建动态集群,实际上应该使用至少3台服务器来搭建,本文只是演示搭建的流程,node04、node05节点也需要开放2379、2380端口,node04、node05节点上仅安装好etcd即可,不要进行过多配置
。
2.5 具体步骤
以 node04
节点为例,node05
也一样的步骤,各自使用各自生成的uuid
。
2.5.1 获取 discovery 的 token
随机生成一个可以标识新集群的唯一令牌。 在后续步骤中,它将用作发现键空间中的唯一前缀。 一种简单的方法是使用uuidgen
:
UUID=$(uuidgen)
使用方法:直接输入命令uuidgen
即可生成UUID
=27b16399-120c-4e3e-8553-3f2b82b3c319
,然后把这个UUID加入到请求信息中。
2.5.2 指定集群的大小
获取令牌时,必须指定集群大小, 发现服务使用该大小来了解何时发现了最初将组成集群的所有成员。
在新的节点上往已有的集群发送:
curl -X PUT http://192.168.13.21:2379/v2/keys/discovery/27b16399-120c-4e3e-8553-3f2b82b3c319/_config/size -d value=1
返回信息:
{"action":"set","node":{"key":"/discovery/27b16399-120c-4e3e-8553-3f2b82b3c319/\_config/size","value":"1","modifiedIndex":15,"createdIndex":15}}
我们需要把该 url 地址 http://192.168.13.21:2379/v2/keys/discovery/27b16399-120c-4e3e-8553-3f2b82b3c319
作为 --discovery 参数来启动 etcd。
新节点会自动使用已有集群 http://192.168.13.21:2379/v2/keys/discovery/27b16399-120c-4e3e-8553-3f2b82b3c319
目录进行 etcd 的注册和发现服务。
公共发现服务
如果没有现成可用的Etcd集群,etcd 官网提供了一个可以公网访问的 etcd 集群。我们可以通过如下命令得到 etcd 服务的目录,并把它作为 --discovery 参数使用。
公共发现服务 discovery.etcd.io 以相同的方式工作,但是有一层修饰,且自动生成 UUID,并提供针对过多请求的保护。公共发现服务在其上仍然使用 etcd 群集作为数据存储。
请求公共发现服务:
$ curl http://discovery.etcd.io/new?size=3
如果显示上图的报错信息,则在浏览器端请求即可。
2.5.3 执行启动 etcd 的命令
etcd --name etcd04 --initial-advertise-peer-urls http://192.168.13.24:2380 \
--listen-peer-urls http://192.168.13.24:2380 \
--data-dir /opt/soft/etcd/etcd_data \
--listen-client-urls http://192.168.13.24:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.13.24:2379 \
--discovery http://192.168.13.21:2379/v2/keys/discovery/27b16399-120c-4e3e-8553-3f2b82b3c319
如果启动的时候报如下错误,清理一下 /opt/soft/etcd/etcd_data
的数据再次运行即可:
{"level":"info","ts":"2023-02-07T13:26:24.154+0800","caller":"etcdmain/etcd.go:73","msg":"Running: ","args":["etcd","--name","etcd04","--initial-advertise-peer-urls","http://192.168.13.24:2380","--listen-peer-urls","http://192.168.13.24:2380","--data-dir","/opt/soft/etcd/etcd\_data","--listen-client-urls","http://192.168.13.24:2379,http://127.0.0.1:2379","--advertise-client-urls","http://192.168.13.24:2379","--discovery","http://192.168.13.21:2379/v2/keys/discovery/27b16399-120c-4e3e-8553-3f2b82b3c319"]}
{"level":"info","ts":"2023-02-07T13:26:24.154+0800","caller":"etcdmain/etcd.go:116","msg":"server has been already initialized","data-dir":"/opt/soft/etcd/etcd\_data","dir-type":"member"}
{"level":"info","ts":"2023-02-07T13:26:24.154+0800","caller":"embed/etcd.go:131","msg":"configuring peer listeners","listen-peer-urls":["http://192.168.13.24:2380"]}
{"level":"info","ts":"2023-02-07T13:26:24.155+0800","caller":"embed/etcd.go:139","msg":"configuring client listeners","listen-client-urls":["http://127.0.0.1:2379","http://192.168.13.24:2379"]}
{"level":"info","ts":"2023-02-07T13:26:24.155+0800","caller":"embed/etcd.go:368","msg":"closing etcd server","name":"etcd04","data-dir":"/opt/soft/etcd/etcd\_data","advertise-peer-urls":["http://192.168.13.24:2380"],"advertise-client-urls":["http://192.168.13.24:2379"]}
{"level":"info","ts":"2023-02-07T13:26:24.155+0800","caller":"embed/etcd.go:370","msg":"closed etcd server","name":"etcd04","data-dir":"/opt/soft/etcd/etcd\_data","advertise-peer-urls":["http://192.168.13.24:2380"],"advertise-client-urls":["http://192.168.13.24:2379"]}
{"level":"fatal","ts":"2023-02-07T13:26:24.155+0800","caller":"etcdmain/etcd.go:204","msg":"discovery failed","error":"listen tcp 127.0.0.1:2379: bind: address already in use","stacktrace":"go.etcd.io/etcd/server/v3/etcdmain.startEtcdOrProxyV2\n\t/go/src/go.etcd.io/etcd/release/etcd/server/etcdmain/etcd.go:204\ngo.etcd.io/etcd/server/v3/etcdmain.Main\n\t/go/src/go.etcd.io/etcd/release/etcd/server/etcdmain/main.go:40\nmain.main\n\t/go/src/go.etcd.io/etcd/release/etcd/server/main.go:32\nruntime.main\n\t/go/gos/go1.16.15/src/runtime/proc.go:225"}
需要注意的是,在我们完成了集群的初始化后,这些信息就失去了作用。当需要增加节点时,需要使用 etcdctl 进行操作。为了安全,每次启动新 etcd 集群
时,都使用新的 discovery token
进行注册。另外,如果初始化时启动的节点超过了指定的数量,多余的节点会自动转化为 Proxy 模式的 etcd。
2.5.4 结果验证
集群启动好之后,进行验证,我们看一下集群的成员:
etcdctl member list
结果符合预期,再看下节点的健康状态:
etcdctl --endpoints="http://192.168.13.24:2379" endpoint health