Docker Swarm - 策略似乎没有任何效果
Docker Swarm - strategy doesn't seem to have any effect
我已经使用 Docker 机器配置了 swarm master 和 swarm 节点(如 here 所述)。一切正常;所有机器都已创建并 运行ning,它们都已被发现并接受容器。
'docker-machine ls' 的输出是:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Stopped Unknown
local - virtualbox Stopped Unknown
my-swarm * (swarm) digitalocean Running tcp://104.131.161.197:2376 my-swarm (master) v1.11.1
node0 - digitalocean Running tcp://104.236.29.169:2376 my-swarm v1.11.1
node1 - digitalocean Running tcp://104.236.216.164:2376 my-swarm v1.11.1
我遇到的问题是容器的分发。无论我为 swarm 设置哪种策略,它似乎一次只将容器分发到其中一个节点。 IE。我运行一堆容器,都是在同一个节点启动的,如下图(策略Spread):
$ docker ps
5c075d7ccddc stress "/bin/sh -c /stress.s" 32 seconds ago Up 31 seconds node0/elated_goldstine
5bae22a15829 stress "/bin/sh -c /stress.s" 46 seconds ago Up 44 seconds node0/cocky_booth
dc52b3dfa0e6 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/goofy_kalam
3b9e69c694da stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/focused_fermat
ef0e006ff3e0 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/stoic_engelbart
53e46b19ab33 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/condescending_rosalind
e9e126c7f4c6 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/sleepy_jang
f9c0003d509d stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/amazing_bhaskara
我在这里期望的是容器大致均匀地分布在 3 个节点上,特别是因为我 运行 在容器中设置的脚本旨在占用尽可能多的 CPU 尽可能。但是它们都在 node0 上(我只希望 Binpack 有)。随机策略具有完全相同的行为。
'docker info' 的 swarm master 设置为活动的输出似乎是正确的:
$ docker info
Containers: 15
Running: 4
Paused: 0
Stopped: 11
Images: 5
Server Version: swarm/1.2.1
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3
my-swarm: 104.131.161.197:2376
└ ID: L2HK:F6S3:WWIM:BHNI:M4XL:KLEA:4U22:J6CE:ZHZI:OGGT:76KF:MTQU
└ Status: Healthy
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 513.4 MiB
└ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-09T10:25:24Z
└ ServerVersion: 1.11.1
node0: 104.236.29.169:2376
└ ID: I3TQ:5BMS:TM2P:GLL4:64OH:BDMY:SWBU:3QG4:TOZ2:LEDW:A6SQ:X34H
└ Status: Healthy
└ Containers: 12
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 513.4 MiB
└ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-09T10:25:02Z
└ ServerVersion: 1.11.1
node1: 104.236.216.164:2376
└ ID: OTQH:UBSV:2HKE:ZVHL:2K7Z:BYGC:ZX25:Y6BQ:BN5J:UWEB:65KE:DABM
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 513.4 MiB
└ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-09T10:25:10Z
└ ServerVersion: 1.11.1
Plugins:
Volume:
Network:
Kernel Version: 4.2.0-27-generic
Operating System: linux
Architecture: amd64
CPUs: 3
Total Memory: 1.504 GiB
Name: my-swarm
Docker Root Dir:
Debug mode (client): false
Debug mode (server): false
WARNING: No kernel memory limit support
是否有一些我遗漏的部分是让这种类型的自动分发按我期望的方式工作所必需的?
问题
很可能您 Docker 代理没有您尝试 运行 在他们身上的图像。
请注意,swarm build
和 swarm pull
不会在每个 Docker 代理上 build
或 pull
。
解决方案 A
运行 pull
在每个 Docker 代理上手动
解决方案 B (未测试)
运行 本地 Docker registry,其中 Docker 代理将从中提取图像。
与 Swarm 一起玩得开心!另外,如果可以的话,我建议您阅读 this answer,其中详细介绍了有关 Swarm 的整个分步教程。
我已经使用 Docker 机器配置了 swarm master 和 swarm 节点(如 here 所述)。一切正常;所有机器都已创建并 运行ning,它们都已被发现并接受容器。
'docker-machine ls' 的输出是:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Stopped Unknown
local - virtualbox Stopped Unknown
my-swarm * (swarm) digitalocean Running tcp://104.131.161.197:2376 my-swarm (master) v1.11.1
node0 - digitalocean Running tcp://104.236.29.169:2376 my-swarm v1.11.1
node1 - digitalocean Running tcp://104.236.216.164:2376 my-swarm v1.11.1
我遇到的问题是容器的分发。无论我为 swarm 设置哪种策略,它似乎一次只将容器分发到其中一个节点。 IE。我运行一堆容器,都是在同一个节点启动的,如下图(策略Spread):
$ docker ps
5c075d7ccddc stress "/bin/sh -c /stress.s" 32 seconds ago Up 31 seconds node0/elated_goldstine
5bae22a15829 stress "/bin/sh -c /stress.s" 46 seconds ago Up 44 seconds node0/cocky_booth
dc52b3dfa0e6 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/goofy_kalam
3b9e69c694da stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/focused_fermat
ef0e006ff3e0 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/stoic_engelbart
53e46b19ab33 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/condescending_rosalind
e9e126c7f4c6 stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/sleepy_jang
f9c0003d509d stress "/bin/sh -c /stress.s" About a minute ago Up About a minute node0/amazing_bhaskara
我在这里期望的是容器大致均匀地分布在 3 个节点上,特别是因为我 运行 在容器中设置的脚本旨在占用尽可能多的 CPU 尽可能。但是它们都在 node0 上(我只希望 Binpack 有)。随机策略具有完全相同的行为。
'docker info' 的 swarm master 设置为活动的输出似乎是正确的:
$ docker info
Containers: 15
Running: 4
Paused: 0
Stopped: 11
Images: 5
Server Version: swarm/1.2.1
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3
my-swarm: 104.131.161.197:2376
└ ID: L2HK:F6S3:WWIM:BHNI:M4XL:KLEA:4U22:J6CE:ZHZI:OGGT:76KF:MTQU
└ Status: Healthy
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 513.4 MiB
└ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-09T10:25:24Z
└ ServerVersion: 1.11.1
node0: 104.236.29.169:2376
└ ID: I3TQ:5BMS:TM2P:GLL4:64OH:BDMY:SWBU:3QG4:TOZ2:LEDW:A6SQ:X34H
└ Status: Healthy
└ Containers: 12
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 513.4 MiB
└ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-09T10:25:02Z
└ ServerVersion: 1.11.1
node1: 104.236.216.164:2376
└ ID: OTQH:UBSV:2HKE:ZVHL:2K7Z:BYGC:ZX25:Y6BQ:BN5J:UWEB:65KE:DABM
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 513.4 MiB
└ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-09T10:25:10Z
└ ServerVersion: 1.11.1
Plugins:
Volume:
Network:
Kernel Version: 4.2.0-27-generic
Operating System: linux
Architecture: amd64
CPUs: 3
Total Memory: 1.504 GiB
Name: my-swarm
Docker Root Dir:
Debug mode (client): false
Debug mode (server): false
WARNING: No kernel memory limit support
是否有一些我遗漏的部分是让这种类型的自动分发按我期望的方式工作所必需的?
问题
很可能您 Docker 代理没有您尝试 运行 在他们身上的图像。
请注意,swarm build
和 swarm pull
不会在每个 Docker 代理上 build
或 pull
。
解决方案 A
运行 pull
在每个 Docker 代理上手动
解决方案 B (未测试)
运行 本地 Docker registry,其中 Docker 代理将从中提取图像。
与 Swarm 一起玩得开心!另外,如果可以的话,我建议您阅读 this answer,其中详细介绍了有关 Swarm 的整个分步教程。