Docker swarm集群和elasticsearch,使用约束将服务绑定到特定节点

Docker swarm cluster and elasticsearch, using constraints to bind a service to a specific node

我希望这里有人可以就我遇到的问题提供一些意见。

我有一个 Docker 有 3 个节点的 swarm 集群,想 运行 ELK 堆栈,但我不确定如何存储我的数据。

version: '3'
services:
  master01:
    image: elasticsearch:5.2.2
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - es
    volumes:
      - /es/data:/usr/share/elasticsearch/data
    command: >
      elasticsearch
      -E network.host=_eth0_
      -E node.master=true
      -E discovery.zen.ping.unicast.hosts=es_master01,es_master02,es_master03
      -E discovery.zen.minimum_master_nodes=3
      -E cluster.name=ElasticCluster
      -E node.name=es_master01
      -E transport.tcp.port=9300
      -E http.port=9200
      -E node.max_local_storage_nodes=3
    deploy:
      replicas: 1

  master02:
    image: elasticsearch:5.2.2
    ports:
      - 9201:9200
      - 9301:9300
    networks:
      - es
    volumes:
      - /es/data:/usr/share/elasticsearch/data
    command: >
      elasticsearch
      -E network.host=_eth0_
      -E node.master=true
      -E discovery.zen.ping.unicast.hosts=es_master01,es_master02,es_master03
      -E discovery.zen.minimum_master_nodes=3
      -E cluster.name=ElasticCluster
      -E node.name=es_master02
      -E transport.tcp.port=9300
      -E http.port=9200
      -E node.max_local_storage_nodes=3
    deploy:
      replicas: 1

  master03:
    image: elasticsearch:5.2.2
    ports:
      - 9202:9200
      - 9302:9300
    networks:
      - es
    volumes:
      - /es/data:/usr/share/elasticsearch/data
    command: >
      elasticsearch
      -E network.host=_eth0_
      -E node.master=true
      -E discovery.zen.ping.unicast.hosts=es_master01,es_master02,es_master03
      -E discovery.zen.minimum_master_nodes=3
      -E cluster.name=ElasticCluster
      -E node.name=es_master03
      -E transport.tcp.port=9300
      -E http.port=9200
      -E node.max_local_storage_nodes=3
    deploy:
      replicas: 1

  logstash:
    image: logstash:5.2.2
    ports:
      - 5000:5000
    networks:
      - es
    command: >
      logstash -e 'input { tcp { port => 5000 } } output { elasticsearch { hosts => "master01:9200" } }'
    deploy:
      replicas: 1

  kibana:
    image: kibana:5.2.2
    ports:
      - 5601:5601
    environment:
      SERVER_NAME: "kibana"
      SERVER_HOST: "0"
      ELASTICSEARCH_URL: "http://elastic:changeme@master01:9200"
      ELASTICSEARCH_USERNAME: "elastic"
      ELASTICSEARCH_PASSWORD: "changeme"
      XPACK_SECURITY_ENABLED: "true"
      XPACK_MONITORING_ENABLED: "true"
    networks:
      - es
    depends_on:
      - master01
    deploy:
      replicas: 1

networks:
  es:
    driver: overlay

除了我的 master01、02、03 是随机创建的并且可以在 3 个节点上随机移动这意味着它们会在找不到数据时将其数据复制到新节点之外,它实际上是有效的在新节点上重新制作后。 随着时间的推移,这意味着我的数据存在 x3。

我无法正确使用约束将 3 个弹性服务分别绑定到一个节点,而且在搜索时我似乎真的找不到任何有用的东西。

我试过使用 environment: "constraint:node==node1" 但是在使用我的 compose 文件构建时它似乎根本没有任何效果。

我四处搜索并找到了一些关于如何使用 docker service create 执行此操作的示例,但我似乎找不到有效的语法。

第一次在这里发帖,如有不妥之处请多多包涵

我可能自己找到了解决办法。

http://embaby.com/blog/using-glusterfs-docker-swarm-cluster/

Gluster 可能是完美的解决方案,如果它解决了我的问题,我明天会 post 结果。