发现服务协议

在集群引导阶段发现其他 etcd 成员

发现服务协议帮助新的 etcd 成员在集群引导阶段使用共享的发现令牌和端点列表来发现集群中的所有其他成员。

发现服务协议在集群引导阶段使用,不能用于运行时重新配置或集群监控。

该协议使用一个新的发现令牌来引导一个唯一的 etcd 集群。请记住,一个发现令牌只能代表一个 etcd 集群。一旦在此令牌上启动了发现协议,即使中途失败,也不得再用于引导另一个 etcd 集群。

本文其余部分将通过示例逐步介绍发现过程,这些示例对应于自托管发现的集群。

请注意,本文档仅适用于 v3 发现。有关v2 发现的更多细节,请查阅之前的文档。

协议工作流程

发现协议的核心思想是使用一个内部的 etcd 集群来协调新集群的引导。首先,所有新成员与发现服务交互,协助生成预期的成员列表。然后每个新成员使用此列表引导其服务器,其功能与 -initial-cluster 标志相同。

在以下示例工作流程中,我们将使用 etcdctl 命令列出协议的每一步,以便于理解。我们假设 http://example.com:2379 托管了一个用于发现服务的 etcd 集群。

按照惯例,etcd 发现协议使用键前缀 /_etcd/registry

创建一个新的发现令牌

生成一个唯一令牌,用于标识新集群。这将在后续步骤中用作发现键空间中的唯一前缀。一种简单的方法是使用 uuidgen

UUID=$(uuidgen)

指定预期的集群大小

发现令牌需要指定一个预期的集群大小。发现服务使用该大小来判断是否已找到所有将初始组成集群的成员。

etcdctl --endpoints=http://example.com:2379 put /_etcd/registry/${UUID}/_config/size ${cluster_size}

通常集群大小为 3、5 或 7。更多详细信息请参阅最佳集群大小

启动 etcd 进程

将发现令牌 ${UUID} 设置为 --discovery-token 参数,并将支持发现服务的 etcd 集群的端点设置为 --discovery-endpoints 参数。这将启用 v3 发现以引导 etcd 集群。

如果提供了 --discovery-token--discovery-endpoints 参数,每个 etcd 进程将在内部执行接下来的几个步骤。

如果发现服务启用了客户端证书认证,请配置以下参数。它们的用法与使用 etcdctl 与 etcd 集群通信时完全相同。

--discovery-insecure-transport
--discovery-insecure-skip-tls-verify
--discovery-cert
--discovery-key
--discovery-cacert

如果发现服务启用了基于角色的认证,请配置以下参数。它们的用法与使用 etcdctl 与 etcd 集群通信时完全相同。

--discovery-user
--discovery-password

也可以使用以下参数更改默认的时间或超时值,其用法与使用 etcdctl 与 etcd 集群通信时完全相同。

--discovery-dial-timeout
--discovery-request-timeout
--discovery-keepalive-time
--discovery-keepalive-timeout

注册自身

每个 etcd 进程首先要做的就是将自己注册为给定新集群的一个成员。这是通过在完整注册键中创建成员 ID 作为键来完成的。

etcdctl --endpoints=http://example.com:2379 put /_etcd/registry/${UUID}/members/${member_id} ${member_name}=${member_peer_url_1}&${member_name}=${member_peer_url_2}

检查状态

它会检查预期的集群大小和注册状态,并决定下一步操作是什么。

etcdctl --endpoints=http://example.com:2379 get /_etcd/registry/${UUID}/_config/size
etcdctl --endpoints=http://example.com:2379 get /_etcd/registry/${UUID}/members

如果注册成员仍然不足,它将等待其他成员出现。

如果注册成员的数量大于预期大小 N,则将前 N 个注册成员视为该集群的成员列表。如果成员自身在成员列表中,则发现过程成功,并通过成员列表获取所有对等节点。如果自身不在成员列表中,则发现过程以失败告终,表示集群已满。

成员可以在注册自身之前检查集群状态,因此若集群已满,它可以快速失败。

等待所有成员

等待过程会持续监听键前缀 /_etcd/registry/${UUID}/members,直到找到所有成员为止。

etcdctl --endpoints=http://example.com:2379 watch /_etcd/registry/${UUID}/members --prefix

最后更新于 2025 年 6 月 3 日:递归地将 v3.6 的内容复制到 v3.7(a90b2a6)