试着从源码看 Docker task slot 分布的情况
This post was to be done.

1
2
3
4
docker swarmkit 中, 对服务(service)进行 scale 的时候, task 的分配策略, '几乎'是随机的.
task.slot 是一个从 1 开始的数字.
scale UP 的时候, 会从小到大填充 slot
scale DOWN 的时候, '几乎' 是随机的. 稍微做了点负载均衡...

docker task slot

docker service ps <service-id>|<service-name>

1
pass

specifiedSlots > numSlots

service should be scaled up.

  1. 从 1 开始找 slotNum, runningSlots 中没有该 slot 的

specifiedSlots < numSlots

service should be scaled down.

  1. slotsSlice 对 State 排序, [Slot[{State: running}, {}, …], Slot[{State: running}, …], Slot[{State: !running}, {}, …]]
  2. slotsWithIndices = [slotWithIndex{index: 该node上有该task的数量, slot: slot}, …], 对 slotsWithIndices 用 index 排序.
  3. 删除 slotsWithIndices[specifiedSlots:] 的 task

scale down 的时候, 首先 slot 内有多个 Task 会被优先删除, 其次 slot 所在 node 有更多的 slot 的 slot 会被优先删除