Docker Swarm 管理器代理节点?

Docker Swarm managers acting nodes?

我已经创建了包含 3 个集群管理器和 3 个节点的设置。

你可以在下面看到,在有 3 个 master 和 3 个 worker 的情况下,实际上我有 3 个 managers 和 6 个 nodes。管理人员是否也能够 运行 容器,而不仅仅是工人?我是不是在设置中遗漏了一些东西,或者这是为了像现在这样工作?

当我执行 docker 信息命令时,我得到这个输出:

ubuntu@manager3:~$ docker info
Containers: 4
 Running: 3
 Paused: 0
 Stopped: 1
Images: 3
Server Version: 1.12.0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 23
 Dirperm1 Supported: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: overlay bridge host null
Swarm: active
 NodeID: 9uv3xhwzibx52xghpsa0sp3f7
 Is Manager: true
 ClusterID: 04r095rvj6b4i7ygbnr2quo9e
 **Managers: 3
 Nodes: 6**
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot interval: 10000
  Heartbeat tick: 1
  Election tick: 3
 Dispatcher:
  Heartbeat period: 5 seconds
 CA configuration:
  Expiry duration: 3 months
 Node Address: 172.100.0.23
Runtimes: runc
Default Runtime: runc
Security Options: apparmor
Kernel Version: 3.13.0-92-generic
Operating System: Ubuntu 14.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.5 MiB
Name: manager3
ID: MUXB:GUNV:HIDO:APRJ:S2JU:763E:QSOL:2554:EZJL:L4OI:6TS5:RD7O
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
 127.0.0.0/8

当我在 swarm 集群上为 运行 创建一些服务时:

docker service create --replicas=3 --name redis redis:latest

其中一些将 运行 用于管理人员,一些用于工人。这让我很困惑。

如果我创建更多服务

docker service create --replicas=6 --name redis redis:latest

它们将 运行 在集群中的所有机器上。由于端口冲突,增加更多将开始失败。

就 运行 服务而言,作为集群管理器的节点(主机)运行 与作为工作者的 运行 没有什么不同。拥有一个 3 节点群,每个节点上都有一个群管理器(并且没有工作人员)是非常好的。

关于端口冲突,您需要在创建服务时指定public端口(在主机上)。例如:

docker create service --name redis --publish 8080:80 --replicas 5 redis:latest

Docker 然后会将 任何节点上的端口 8080 的任何传入请求负载均衡 到集群上的一个 redis 容器(不一定在同一个节点作为传入请求)

感谢@Mark O'Connor 的回答是:

By default manager nodes also act as a worker nodes.

Manager 可以被 drained 并保留 "only" manager,所以你将执行此命令来让 manager 不再是 worker:

docker node update --availability drain *manager_name*