很多时候,只知道要搭建一个多大的集群,但是并不能事先知道这几个节点的 ip,从而无法使用 --initial-cluster 参数。这个时候,就需要使用 discovery 的方式来搭建 etcd 集群。discovery 方式有两种

  • etcd discovery
  • DNS discovery

etcd discovery 启动方式依赖另外一个 etcd 集群,在该集群中创建一个目录,并在该目录中创建一个 _config 的子目录,并且在该子目录中增加一个 size 节点,指定集群的节点数目。在这种情况下,将该目录在 etcd 中的 URL 作为节点的启动参数,即可完成集群启动。

etcd discovery 集群方式分为两种

  • 公共 etcd discovery
  • 自定义的 etcd discovery

公共 etcd discovery 服务

申请 token

公共的 discovery 就是通过 CoreOS 提供的公共 discovery 服务申请 token。
集群标识可以从已有的 etcd 集群中创建,可以通过 CoreOS 提供的公共 discovery 服务申请 token

[root@CeH-7-13 ~]# curl -w "\n" 'https://discovery.etcd.io/new?size=3'
https://discovery.etcd.io/f7cac563ee80b28edd586defc2af7fdc

该命令会生成一个链接样式的 token,参数 size 代表要创建的集群大小。

修改 etcd 配置

依次编辑三个节点的 etcd 配置文件,删除 ETCD_INITIAL_CLUSTERETCD_INITIAL_CLUSTER_STATEETCD_INITIAL_CLUSTER_TOKEN 配置参数并加上ETCD_DISCOVERY 参数为获取的集群标识即可。
以 CeH-7-13 节点为例进行配置

[root@CeH-7-13 ~]# vim /etc/etcd/etcd.conf
ETCD_NAME=CeH-7-13
ETCD_DATA_DIR="/var/lib/etcd/etcd713" 
ETCD_LISTEN_PEER_URLS="http://192.168.10.13:2380" 
ETCD_LISTEN_CLIENT_URLS="http://192.168.10.13:2379,http://192.168.10.13:4001,http://127.0.0.1:2379" 
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.13:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.13:2379,http://192.168.10.13:4001,http://127.0.0.1:2379"
ETCD_DISCOVERY="https://discovery.etcd.io/f7cac563ee80b28edd586defc2af7fdc"

重启 etcd 服务

按上面配置好各集群节点后,在各节点重启 etcd 服务

[root@CeH-7-13 ~]# systemctl restart etcd

查看输出结果

启动完成后,执行以下命令:

[root@CeH-7-12 ~]# curl -w '\n' "https://discovery.etcd.io/f7cac563ee80b28edd586defc2af7fdc"
{"action":"get","node":{"key":"/_etcd/registry/f7cac563ee80b28edd586defc2af7fdc","dir":true,"nodes":[{"key":"/_etcd/registry/f7cac563ee80b28edd586defc2af7fdc/419d4ed234e5483","value":"CeH-7-12=http://192.168.10.12:2380","modifiedIndex":1516282974,"createdIndex":1516282974},{"key":"/_etcd/registry/f7cac563ee80b28edd586defc2af7fdc/8184a62bcc94340b","value":"CeH-7-13=http://192.168.10.13:2380","modifiedIndex":1516282988,"createdIndex":1516282988},{"key":"/_etcd/registry/f7cac563ee80b28edd586defc2af7fdc/61b8219b0cd37a9c","value":"CeH-7-11=http://192.168.10.11:2380","modifiedIndex":1516282995,"createdIndex":1516282995}],"modifiedIndex":1516281936,"createdIndex":1516281936}}

从输出结果看,说明集群已在discovery.etcd.io注册成功。

查看集群成员

[root@CeH-7-13 ~]# etcdctl member list
419d4ed234e5483: name=CeH-7-12 peerURLs=http://192.168.10.12:2380 clientURLs=http://localhost:2379 isLeader=false
61b8219b0cd37a9c: name=CeH-7-11 peerURLs=http://192.168.10.11:2380 clientURLs=http://localhost:2379 isLeader=true
8184a62bcc94340b: name=CeH-7-13 peerURLs=http://192.168.10.13:2380 clientURLs=http://localhost:2379 isLeader=false

自定义的etcd discovery服务

这种方式就是利用一个自有的 etcd 集群来提供 discovery服务,从而搭建一个新的 etcd 集群。

假设已有的 etcd 集群的一个访问地址是:192.168.10.11,那么我们首先需要在已有 etcd 中创建一个特殊的 key,方法如下:

[root@CeH-7-13 ~]#  curl http://127.0.0.1:2379/v2/keys/discovery/8ebee6723eaf3f5c7724e879f8797e85/_config/size -d value=3 
{"action":"create","node":{"key":"/discovery/8ebee6723eaf3f5c7724e879f8797e85/_config/size/00000000000000000012","value":"3","modifiedIndex":12,"createdIndex":12}}

其中 value=3 表示本集群的大小,即: 有多少集群节点。而 8ebee6723eaf3f5c7724e879f8797e85 就是用来做 discovery 的 token。如果实际启动的 etcd 节点个数大于 discovery token 创建时指定的 size,多余的节点会自动变为 proxy 节点。etcd proxy 作为反向代理把客户的请求转发给可用的 etcd 集群,新节点加入集群如果核心节点数已满足要求,则自动转化为 proxy 模式,此项不会在节点不足时逆向转化为实际节点。
后续的配置就和公共 etcd discovery 服务的方法类似

DNS discovery

文章目录