代码之家  ›  专栏  ›  技术社区  ›  RQDQ

我应该将swarm服务约束到工作节点吗?

  •  1
  • RQDQ  · 技术社区  · 7 年前

    假设我有一个码头工人群,工人和经理分开。我是否必须指定放置约束以确保给定服务仅在工作节点上运行?

    就像在这个docker compose文件中:

    version "3.1"
    
    services: 
      foo:
        image: hello-world
        deploy:
          placement:
             - node.role==worker
    

    或者Swarm会自动限制服务在工作节点上运行吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   BMitch    7 年前

    如果您来自Kubernetes,则有一个概念,即对每个管理器都进行节点污染,然后要在管理器上运行工作负载,您需要将该pod配置为在具有该污染的节点上运行。这在群体模式中并不存在。但是你有几个选择可以自己实现。

    最常用的方法是,如前所述,在 node.role==worker 对于每个服务,您只希望在workers和manager上运行。这需要对计划在集群上调度的每个服务进行一点工作,但这也是更灵活的选项之一,因为您可以指定确实需要在管理器上运行的某些工作负载(例如,需要管理集群或可以访问集群的管理器详细信息的任何实用程序服务,例如自我配置反向代理)。

    下一种方法是更改管理器的可用性:

    $ docker node update --help
    Usage:  docker node update [OPTIONS] NODE
    Options:
          --availability string   Availability of the node ("active"|"pause"|"drain")
    ...
    

    默认情况下,所有节点都处于活动状态。但是,您可以通过更改节点的可用性来暂停在节点上计划的新工作负载,或从节点中排出现有工作负载。这不会影响在swarm模式之外部署的容器(使用 docker container run docker-compose 而不是蜂群模式 docker stack docker service 命令)。然而,它是不灵活的,不允许您在管理者和工人身上轻松运行一些swarm容器。更改可用性设置的最常见用途是使节点停止服务以进行维护,而不是控制管理器上的调度。我唯一一次使用这种方法是将第三个管理器添加到HA的两节点集群中,在该集群中,它不应该在上面安排任何工作负载。