我有一个使用 docker-swarm 构建的集群,我们在其中运行 apache Spark 应用程序。在集群中,我有一个管理器节点和 3 个工作节点。在这个集群中,我们有一个用于 Spark 的主容器和许多工作器容器。我可以使用以下命令缩放工作器节点的数量。
sudo docker service scale spark_worker=<number of workers>
当我增加工作器的数量时,我想在工作节点上而不是在管理器节点上创建新容器。
两个选项:
-
docker node update --availability=drain <nodename>
这将停止节点上的容器并在其他地方启动它们,并防止将来的容器在该节点上运行。请注意,暂停只会阻止该节点上的新容器,而不会移动现有容器。但是,这种方法非常有限。如果你想在管理器上运行任何东西,如监控、日志记录、管理 GUI 等,你就做不到。
-
更灵活的方法是将现有服务更新为仅在工作器节点上运行:
docker service update --constraint-add 'node.role==worker' <servicename>
。然后,如果您想仅在管理器上运行服务,则可以在其上使用node.role==manager
。
有机会在部署部分中指定副本属性。 所以不允许使用比例参数。所以我在docker-compose.yml中的一个服务看起来像这样:
xxx_nginx:
image: nginx
tty: true
command: ["sh", "-c", "usermod -u 1000 nginx && nginx -g 'daemon off;'"]
volumes:
- "/home/pi/images:/usr/share/nginx/html:ro"
- "/var/log/nginx:/var/log/nginx"
- "/etc/localtime:/etc/localtime:ro"
deploy:
replicas: 2
placement:
constraints:
- "node.hostname==raspberrypi151"
因此,现在我不必每次服务时都进行扩展。