Docker Swarm–Docker的本地化集群方案,自带两种调度策略,spread和binpack。Spread策略会尝试把每个容器平均地部署到每个节点上,而binpack策略会把容器尽量部署在主要的负载节点上。Spread的优点是如果一个节点失效了,只会有最少量的容器受影响,而binpack的优点是能提高资源使用率,保证空闲的资源得到最大化利用。
Binpack vs Spread 策略
长远来看,我相信以后会越来越多地使用binpack这种方式,因为它可以提高主机资源使用率。而主机宕机的风险也有办法尽量降低,那就是尽量使用无状态的微服务,因为无状态的服务能够自动快速的迁移到可用的节点上,从而把宕机的危害减到最小。
但是,如果你现在正使用着binpack,你需要特别小心的是容器间的协调关系,确保某些必须运行在同一个节点上的容器总能在相同的节点上运行着。
考虑一下这个场景,假如我们有两个有空闲资源的节点,其中一个几乎占用满了,而另一个几乎是没被占用,我们可以用两个装有Docker的虚拟机来模拟这个场景:
$ docker run swarm create
7a6441b8b92448475fb3f8e166ed2170
$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-strategy binpack --swarm-discovery token://7a6441b8b92448475fb3f8e166ed2170 swarm-1
...
$ docker-machine create -d virtualbox --swarm --swarm-strategy binpack --swarm-discovery token://7a6441b8b92448475fb3f8e166ed2170 swarm-2
...
$ eval $(docker-machine env --swarm swarm-1)
$ docker info
Containers: 3
Images: 8
Role: primary
Strategy: binpack
Filters: health, port, dependency, affinity, constraint
Nodes: 2
swarm-1: 192.168.99.103:2376
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.021 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4