Discovery service protocol is only used in cluster bootstrap phase, and cannot be used for runtime reconfiguration or cluster monitoring.
The protocol uses a new discovery token to bootstrap one unique etcd cluster. Remember that one discovery token can represent only one etcd cluster. As long as discovery protocol on this token starts, even if it fails halfway, it must not be used to bootstrap another etcd cluster.
The rest of this article will walk through the discovery process with examples that correspond to a self-hosted discovery cluster. The public discovery service, discovery.etcd.io, functions the same way, but with a layer of polish to abstract away ugly URLs, generate UUIDs automatically, and provide some protections against excessive requests. At its core, the public discovery service still uses an etcd cluster as the data store as described in this document.
The idea of discovery protocol is to use an internal etcd cluster to coordinate bootstrap of a new cluster. First, all new members interact with discovery service and help to generate the expected member list. Then each new member bootstraps its server using this list, which performs the same functionality as -initial-cluster flag.
In the following example workflow, we will list each step of protocol in curl format for ease of understanding.
By convention the etcd discovery protocol uses the key prefix . If hosts an etcd cluster for discovery service, a full URL to discovery keyspace will be
http://example.com/v2/keys/_etcd/registry
. We will use this as the URL prefix in the example.
Specifying the expected cluster size
The discovery token expects a cluster size that must be specified. The size is used by the discovery service to know when it has found all members that will initially form the cluster.
curl -X PUT http://example.com/v2/keys/_etcd/registry/${UUID}/_config/size -d value=${cluster_size}
Usually the cluster size is 3, 5 or 7. Check optimal cluster size for more details.
Bringing up etcd processes
Given the discovery URL, use it as -discovery
flag and bring up etcd processes. Every etcd process will follow this next few steps internally if given a flag.
The first thing for etcd process is to register itself into the discovery URL as a member. This is done by creating member ID as a key in the discovery URL.
Checking the status
It checks the expected cluster size and registration status in discovery URL, and decides what the next action is.
curl -X GET http://example.com/v2/keys/_etcd/registry/${UUID}/_config/size
curl -X GET http://example.com/v2/keys/_etcd/registry/${UUID}
If registered members are still not enough, it will wait for left members to appear.
In etcd implementation, the member may check the cluster status even before registering itself. So it could fail quickly if the cluster has been full.
Waiting for all members
The wait process is described in detail in the etcd API documentation.
It keeps waiting until finding all members.
Public discovery service
CoreOS Inc. hosts a public discovery service at https://discovery.etcd.io/ , which provides some nice features for ease of use.
Public discovery service will redirect to etcd cluster behind for the key at
/v2/keys/_etcd/registry
. It masks register key prefix for short and readable discovery url.
Get new token
GET /new
Sent query:
size=${cluster_size}
Possible status codes:
200 OK
400 Bad Request
generated discovery url
The generation process in the service follows the steps from to Specifying the Expected Cluster Size.
Check discovery status
The repository is located at https://github.com/coreos/discovery.etcd.io. It could be used to build a custom discovery service.