mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
7d193ef1f3
Use `pkg/discovery` to provide nodes discovery between daemon instances. The functionality is driven by two different command-line flags: the experimental `--cluster-store` (previously `--kv-store`) and `--cluster-advertise`. It can be used in two ways by interested components: 1. Externally by calling the `/info` API and examining the cluster store field. The `pkg/discovery` package can then be used to hit the same endpoint and watch for appearing or disappearing nodes. That is the method that will for example be used by Swarm. 2. Internally by using the `Daemon.discoveryWatcher` instance. That is the method that will for example be used by libnetwork. Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
48 lines
1.6 KiB
Go
48 lines
1.6 KiB
Go
package daemon
|
|
|
|
import (
|
|
"time"
|
|
|
|
log "github.com/Sirupsen/logrus"
|
|
"github.com/docker/docker/pkg/discovery"
|
|
|
|
// Register the libkv backends for discovery.
|
|
_ "github.com/docker/docker/pkg/discovery/kv"
|
|
)
|
|
|
|
const (
|
|
// defaultDiscoveryHeartbeat is the default value for discovery heartbeat interval.
|
|
defaultDiscoveryHeartbeat = 20 * time.Second
|
|
|
|
// defaultDiscoveryTTL is the default TTL interface for discovery.
|
|
defaultDiscoveryTTL = 60 * time.Second
|
|
)
|
|
|
|
// initDiscovery initialized the nodes discovery subsystem by connecting to the specified backend
|
|
// and start a registration loop to advertise the current node under the specified address.
|
|
func initDiscovery(backend, address string) (discovery.Backend, error) {
|
|
var (
|
|
discoveryBackend discovery.Backend
|
|
err error
|
|
)
|
|
if discoveryBackend, err = discovery.New(backend, defaultDiscoveryHeartbeat, defaultDiscoveryTTL); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// We call Register() on the discovery backend in a loop for the whole lifetime of the daemon,
|
|
// but we never actually Watch() for nodes appearing and disappearing for the moment.
|
|
go registrationLoop(discoveryBackend, address)
|
|
return discoveryBackend, nil
|
|
}
|
|
|
|
// registrationLoop registers the current node against the discovery backend using the specified
|
|
// address. The function never returns, as registration against the backend comes with a TTL and
|
|
// requires regular heartbeats.
|
|
func registrationLoop(discoveryBackend discovery.Backend, address string) {
|
|
for {
|
|
if err := discoveryBackend.Register(address); err != nil {
|
|
log.Errorf("Registering as %q in discovery failed: %v", address, err)
|
|
}
|
|
time.Sleep(defaultDiscoveryHeartbeat)
|
|
}
|
|
}
|