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