原文地址:https://docs.docker.com/swarm/discovery/
Docker Swarm 节点发现有三种方式:分布式键值存储、节点列表、Docker Hub。
注:以下“主机发现”等价于“节点发现”。
使用分布式键值对存储的主机发现
建议使用libkv项目用作Swarm节点发现,libkv项目是对已存在分布式键值对存储的一个抽象层。
目前支持键值对存储类型(及支持的最低版本)如下:
- Consul 0.5.1
- Etcd 2.0
- ZooKeeper 3.4.5
在创建manager和node时设置节点发现参数,以及查看结点列表:
# Etcd
swarm join --advertise=<node_ip:2375> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
swarm manage -H tcp://<swarm_ip:swarm_port> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
swarm list etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
# Consul
swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
swarm manage -H tcp://<swarm_ip:swarm_port> consul://<consul_addr>/<optional path prefix>
swarm list consul://<consul_addr>/<optional path prefix>
# ZooKeeper
swarm join --advertise=<node_ip:2375> zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
swarm manage -H tcp://<swarm_ip:swarm_port> zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
swarm list zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
如果在分布式键值的节点发现过程中要使用TLS,只有Etcd、Consul支持。
以swarm join为例设置如下,swarm manager、swarm list也一样。
swarm join \
--advertise=<node_ip:2375> \
--discovery-opt kv.cacertfile=/path/to/mycacert.pem \
--discovery-opt kv.certfile=/path/to/mycert.pem \
--discovery-opt kv.keyfile=/path/to/mykey.pem \
consul://<consul_addr>/<optional path prefix>
使用静态文件或节点列表作为主机发现
这种方式不适用于manager的备机。如必须使用manager replica,必须使用主机发现的键值存储方式。
静态文件,必须置于主机可访问的路径下。节点列表及节点列表文件,都支持ip地址范围的写法。
节点列表文件
# 创建文件/tmp/my_cluster,并写入节点列表
$ echo "10.0.0.[11:100]:2375" >> /tmp/my_cluster
$ echo "192.168.1.2:[2:20]375" >> /tmp/my_cluster
# 运行swarm manager时指定节点列表文件
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
# 查看节点列表
swarm list file:///tmp/my_cluster
# 查看swarm信息
docker -H tcp://<swarm_ip:swarm_port> info
docker -H tcp://<swarm_ip:swarm_port> ps
docker -H tcp://<swarm_ip:swarm_port> logs
指定节点列表
# 指定节点列表可以用以下三种写法
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>
swarm manage -H <swarm_ip:swarm_port> <node_ip1:2375>,<node_ip2:2375>
swarm manage -H <swarm_ip:swarm_port> "nodes://10.0.0.[10:200]:2375,10.0.1.[2:250]:2375"
将Docker Hub用作主机发现服务
注意:不建议在生产环境中使用。它在使用时需要保证外部网络通畅。
Docker Hub的主机发现服务要求swarm集群中每个节点能够访问外网。
# 创建集群,并获取token
swarm create
# 集群中的节点使用token
swarm join --advertise=<node_ip:2375> token://<cluster_id>
# 集群中的manager使用token
swarm manage -H tcp://<swarm_ip:swarm_port> token://<cluster_id>
# 查看集群中的节点
swarm list token://<cluster_id>