1. etcd 基于 etcd 的发现
etcd discovery 集群方式分为两种:自定义的 etcd discovery 和公共 etcd discovery。
为了更好的理解发现服务协议的设计,建议阅读发现服务项目 文档。
etcd discovery 集群通过已有的 etcd 集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制。比如官方提供的:discovery.etcd.io。
这种启动方式依赖另外一个etcd集群,在该集群中创建一个目录,并在该目录中创建一个 _config 的子目录,并且在该子目录中增加一个 size 节点,指定集群的节点数目。在这种情况下,将该目录在etcd中的URL作为节点的启动参数,即可完成集群启动。
1.1. discovery URL 的存活时间
discovery URL 标识唯一的 etcd 集群。对于新的集群,总是创建新的 discovery URL 而不是重用 discovery URL。
此外,discovery URL 应该仅仅用于集群的初始化启动。在集群已经运行之后修改集群成员,阅读 运行时重配置 指南。
1.2. 适用的场景
基于 etcd 的发现比较适合在部署时还无法确定节点 IP 等信息的场景,例如公有云环境的云主机。
在使用该方法之前要求,先要已经有一个 etcd 集群可用了。
1.3. 定制 etcd 发现服务
发现使用已有集群来启动自身。如果使用私有的 etcd 集群,可以创建像这样的 URL:
$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
通过设置 URL 的 size,创建了带有期待集群大小为3的 discovery URL。
用于这个场景的 URL 将是 https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
。当他们启动时 etcd 成员将使用 https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
目录来注册。
每个成员必须有指定不同的名字标记。 Hostname
或者 machine-id
是个好选择。否则发现会因为重复名字而失败
现在我们用这些用于每个成员的相关标记启动 etcd :
- infra0 节点
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
- infra1 节点
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
- infra2 节点
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
1.4. 公共 etcd 发现服务
公共的 discovery 就是通过 CoreOS 提供的公共 discovery 服务申请 token。
如果没有现成的集群可用,可以使用托管在 discovery.etcd.io
的公共发现服务。为了使用"new" endpoint来创建私有发现URL,使用命令:
$ curl https://discovery.etcd.io/new?size=3
以上命令会生成一个链接样式的 token,参数 size 代表要创建的集群大小,即: 有多少集群节点。
返回结果类似
https://discovery.etcd.io/14104b8f05d179cf4d59b61af5366e95You
这将创建带有初始化预期大小为3个成员的集群。如果没有指定大小,将使用默认值3。
在 etcd 服务启动时,可以指定该 token
使用环境变量的方式
ETCD_DISCOVERY=https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
等价的命令行启动参数
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
每个成员必须有指定不同的名字标记。 Hostname
或者 machine-id
是个好选择。. 否则发现会因为重复名字而失败
现在我们用这些用于每个成员的相关标记启动 etcd :
- infra0
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
- infra1
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
- infra2
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de