我的办公室里有一个小型的 docker swarm:一个 40 核(128GB RAM)和两个 8 核(每个 16GB RAM)。当我在 swarm 中部署服务时,作业正在运行,但它们分布在均匀地而不考虑每台机器的容量。
我在管理器上启动了集群:
docker swarm init
docker swarm update --task-history-limit 2
在每个节点上:
docker swarm join --token <token-string> <ipaddr:port>
然后我使用以下命令启动服务:
docker service create --detach \
--mount type=bind,src=/s/mypath,dst=/home/mypath \
--entrypoint "/home/mypath/myscript.sh arg1 arg2" \
--name "mystuff" -w /home/mypath myregistry.me.com:5433/myimage
该过程独立进行。我尚未发现基于节点强度的分配权重或亲和力的迹象。
理想情况下,我希望能够说出类似这样的话:
- 加入群体,只承担
n
任务(有点天真) - 加入集群,将我的(CPU)容量加权为
0.2
(或5
更大的) - 启动此服务,每个可用核心分配不超过一个任务
我正在使用 自行调节服务的整体规模docker service scale
,但这并没有提供任何粒度。是否可以根据可用资源调节每个节点的 docker swarm 服务?
(这可能更有动力转向 k8s,我认为它提供了类似的功能。在学习和过渡过程中,我一直在努力克服成长的烦恼。)
答案1
当您创建或更新 Swarm 服务时,所有这一切确实是可能的。
这属于这些命令中的“容器放置”选项。如果您只是担心资源预留,请查看--reserve-cpu
和--reserve-memory
。这些将确保在为每个容器分配任务之前,节点上有可用的 CPU 或内存。
示例:如果您需要 Swarm 服务来部署两个 php 副本,并且每个副本都需要确保位于具有 1GB 内存和 1 个 CPU 的节点上,则只service create --reserve-cpu 1 --reserve-memory 1GB php
会将容器调度到 Swarm 调度程序知道具有该数量可用硬件的节点上。如果一个节点只有 2 个逻辑 CPU,那么它永远不会在该节点上部署该服务的 2 个以上副本。