【问题标题】:Docker Stack Swarm - Service Replicas are not spread for Mutli Service StackDocker Stack Swarm - 服务副本不为多服务堆栈传播
【发布时间】:2017-07-02 06:40:58
【问题描述】:

我在两台主机上部署了一个包含 4 个服务的堆栈(docker compose 版本 3)。 这些服务是 Elasticsearch、Kibana。 Redis、Visualiser,最后是我的 Web 应用程序。我还没有设置任何资源限制。 我通过 docker-machine 旋转了两个虚拟主机,一个 2GB,一个 1GB。 然后我将我的网络应用程序的副本增加到 2 个副本,这解决了以下分布:

Host1(主): Kibana、Redis、Web 应用、Visualiser、WebApp

Host2(工作人员): 弹性搜索

为什么 Swarm Manager 将两个 Web App 容器分发到同一主机。如果将 Web App 分发到两个主机上不是更聪明吗? 除了节点标记之外,我在文档中找不到任何其他方式来影响分布。 我错过了什么吗?

谢谢

比约恩

docker-compose.yml

version: "3"
services:
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.4.3
    environment:
      ES_JAVA_OPTS: -Xms1g -Xmx1g
    ulimits:
      memlock: -1
      nofile:
        hard: 65536
        soft: 65536
      nproc: 65538
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 1g
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - webnet


  web:
    # replace username/repo:tag with your name and image details
    image: bjng/workinseason:swarm
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    ports:
      - "80:6000"
    networks:
      - webnet

  kibana:
    image: docker.elastic.co/kibana/kibana:5.4.3
    deploy:
      placement:
        constraints: [node.role == manager]
    ports:
      - "5601:5601"
    networks:
      - webnet

  redis:
    image: "redis:alpine"
    networks:
      - webnet



volumes:
  esdata:
    driver: local


networks:
  webnet:

【问题讨论】:

  • 请包含您的 docker-compose.yml 文件和您的 docker 版本。
  • @BMitch 谢谢,我用 docker-compose.yml 编辑了我的帖子 我的版本是Docker version 17.06.0-ce, build 02c1d87
  • 首先猜测是 elastic 的 1g 内存限制用完了 worker 的主机限制。第二个猜测是,您可能使用 sha256 在本地构建了映像,工作人员无法从注册表中提取该映像(在 17.06 中,使用另一个标志不再发生这种情况)。我最初的猜测是你有一个旧版本的 Docker,它会计算主机上的其他容器,或者你对在管理器上运行的 web 应用程序有限制,但这些都不是你的情况。
  • 我在想 elasticsearch 也使用大量内存,当我只为 master 标记 elasticsearch 时会看到会发生什么。到目前为止还是谢谢。

标签: docker docker-compose docker-swarm


【解决方案1】:

Docker 根据可用资源调度任务(容器);如果两个节点有足够的资源,容器可以调度在任一节点上。

最新版本的 Docker 默认使用“HA”调度,这意味着如果可能,相同服务的任务会分布在多个节点上(请参阅此拉取请求)https://github.com/docker/swarmkit/pull/1446

【讨论】:

  • 谢谢@thaJeztah。我会说我的两个主机都有足够的资源。我的 Docker 版本是 17.06.0-ce,build 02c1d87,这是我认为此时最新的社区版本。因此,如果我理解正确,我的 Web 应用程序应该分布在两个主机之间,但事实并非如此。
  • 那不是真的。如果您将在大多数情况下使用 2 个节点创建 2 个不同的服务,它们将被放置在同一个节点上
  • @AndreyNikishaev 它将尝试在可用节点上传播相同服务的实例。而且,不,没有保证会发生,所以它们可能仍然落在同一个节点上。 Docker 19.03 及更高版本有一个新选项来指定节点上的最大实例数(请参阅github.com/docker/cli/pull/1612),可用于应防止在同一节点上运行多个实例的情况。
  • @thaJeztah 在所有空闲节点上传播不同的服务,我被推动使用资源预留,从而强制传播容器,因此每个容器都有 1 个 cpu 预留。这是唯一的办法。对于相同的服务,有 --max-replicas-per-node 参数,但我没有为撰写文件找到它(
  • 在撰写文件、架构(版本)3.8 及更高版本中支持; github.com/docker/cli/pull/1410。它还没有在文档中,因为 docker compose (standalone) 还不支持 3.8 版
猜你喜欢
  • 1970-01-01
  • 2017-12-02
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多