Кластер Elasticsearch не работает в Docker Swarm

#docker #elasticsearch

#докер #эластичный поиск

Вопрос:

В файле YAML docker-compose ниже отображается кластер Elasticsearch с 3 узлами при использовании с docker compose командой. Это нормально для отладки, но я хочу перейти к развертыванию, поэтому я хочу развернуть в рое, где контейнеры могут работать в разных системах.

Так

 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. Я вызываю оболочку на одном из контейнеров. Я могу проверить каждый из других контейнеров. Я также могу выполнить curl -XGET проверку каждого из контейнеров и получить ответ от порта 9200.
  2. Если я выполняю curl-XGET на порту 9300 в одном из контейнеров, я получаю сообщение «Не порт HTTP». Но, по крайней мере, он смог решить этот адрес.
  3. Docker stack любит наносить префиксы на имена объектов. Поэтому, если вы назовете сеть 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   

Ответ №1:

Как оказалось, Elasticsearch запутывается, когда Docker предоставляет ему несколько сетей наложения. Итак, директива:

 ports:  - 9200:9200  

заставляет Docker предоставлять оверлейную сеть в дополнение к указанной оверлейной сети (в данном случае es9300). По какой-то причине, когда Elasticsearch запускается в контейнерах, он получает неправильный IP-адрес при разрешении службы/DNS «es01».

Я не определил, почему это так, но удаление директивы ports для публикации порта 9200 решает проблему.

Надеюсь, это сообщение поможет кому-то, кто столкнется с той же проблемой.