Elasticsearch集群在Docker Swarm上不起作用

q0qdq0h2  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(167)

下面的docker-compose YAML文件在与docker compose命令一起使用时会产生一个3节点的Elasticsearch集群。这对于调试来说是可以的,但是我想移动到部署,所以我想在一个容器可以在不同系统上运行的群上部署。
所以

docker compose up

可以,但是

docker stack deploy -c docker-compose.yml p3es

创建了相同的容器(尽管在不同的系统上)和覆盖网络,但elasticsearch示例无法通过矶钓9300相互通信。因此,不会分配主服务器,尽管elasticsearch响应HTTP请求,但它们只是出错。
在日志中,每个容器上都会显示以下异常/堆栈跟踪:

p3es_es01.1.sv26uqp4i4s3@carbon    | "stacktrace": ["org.elasticsearch.transport.RemoteTransportException: [es03][10.0.12.9:9300][internal:cluster/coordination/join]",
p3es_es01.1.sv26uqp4i4s3@carbon    | "Caused by: org.elasticsearch.transport.ConnectTransportException: [es01][10.0.0.53:9300] connect_exception",
(etc)

异常的原因原来是:

p3es_es01.1.sv26uqp4i4s3@carbon    | "Caused by: java.io.IOException: connection timed out: 10.0.0.53/10.0.0.53:9300",

下面是我尝试过的一些方法:
1.我在其中一个容器上调用一个shell,我可以ping其他每个容器,我也可以在每个容器上执行curl -XGET,并从端口9200获得响应。
1.如果我在其中一个容器的端口9300上执行curl -XGET,我会得到一个“不是HTTP端口”的消息,但至少它能够解析地址。

  1. Docker堆栈喜欢在对象的名称上加上前缀。所以如果你把一个网络命名为xyz,那么这个网络实际上会被命名为project_xyz。所以我修改了告诉elasticsearch谁是集群的一部分的环境变量,以包括项目名称前缀。没有运气。
    我没办法了。有什么建议吗?
version: '3.9'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
    environment:
      - HOSTNAME=es01
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - es9300
    volumes:
      - nfs-es01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
    environment:
      - HOSTNAME=es02
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - es9300
    volumes:
      - nfs-es02:/usr/share/elasticsearch/data
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
    environment:
      - HOSTNAME=es03
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - es9300
    volumes:
      - nfs-es03:/usr/share/elasticsearch/data

volumes:
  nfs-es01:
    driver_opts:
      type: nfs
      o: addr=10.2.0.1,rw,nfsvers=4,local_lock=all
      device: :/sbn/process3/elasticsearch01
  nfs-es02:
    driver_opts:
      type: nfs
      o: addr=10.2.0.1,rw,nfsvers=4,local_lock=all
      device: :/sbn/process3/elasticsearch02
  nfs-es03:
    driver_opts:
      type: nfs
      o: addr=10.2.0.1,rw,nfsvers=4,local_lock=all
      device: :/sbn/process3/elasticsearch03

networks:
  es9300:
    driver: overlay
    attachable: true
wlp8pajw

wlp8pajw1#

事实证明,当Docker为Elasticsearch发现提供多个覆盖网络时,它会感到困惑。

ports:
  - 9200:9200

导致每个es0*服务在指定的覆盖网络(在本例中为es9300)* 之外 * 的入口覆盖网络上。由于某些原因,当Elasticsearch在容器中运行时,它在解析服务/DNS es01时获得错误的IP地址。
我还没有确定为什么会这样,但是删除发布端口9200的端口指令可以解决这个问题。
希望这篇文章能帮助遇到同样问题的人。

相关问题