Я новичок с эластичными и докерскими роями. Я потратил две недели на то, чтобы научиться и попытаться подготовить рой докеров с резинкой. Я хочу подготовить эластичный кластер с docker swarm. Где мы можем легко использовать масштабирование вверх и вниз. Я думал, что нам нужен рой для этого и эластичный кластер для синхронизации данных между узлами роя. Я также подумал, что для полного автоматизма я хотел бы использовать Zen, настроенный с именем хоста контейнера. Из-за swarm round rubin имя хоста "elasticsearch" должно возвращать все ip.
- версия докера: 17.06.2-ce
- версия эластичного образа докера: elasticsearch: latest
- версия docker-compose> = 3
Сначала я попытался выполнить эту инструкцию: sematext.com/blog/2016/12/12/docker-elasticsearch-swarm
Здесь nginx-proxy не работает как служба (часть файла docker-compose), но работает как контейнер. (запуск докера). Понятия не имею, в чем может быть разница. Но сама идея была подготовлена более ранней версией докера и она у меня не работает.
Основная идея этой инструкции заключается в том, что Discovery.zen.ping.unicast.hosts имеет имя контейнера. Docker самостоятельно балансирует нагрузку, а затем эластичный может найти другие узлы.
Поскольку nginx-proxy не работает как служба, я попытался выполнить эту инструкцию: derpturkey.com/elasticsearch-cluster-with-docker-engine-swarm-mode/
Я определил службу nginx для подключения эластичного интерфейса и настроил здесь все параметры.
version: '3'
services:
elasticsearch:
image: 'elasticsearch:5'
command: [ elasticsearch, -E, network.host=0.0.0.0, -E, discovery.zen.ping.unicast.hosts=elasticsearch, -E, discovery.zen.minimum_master_nodes=1 ]
nginx:
image: 'nginx:1'
ports:
- '9200:9200'
command: |
/bin/bash -c "echo '
server {
listen 9200;
add_header X-Frame-Options "SAMEORIGIN";
location / {
proxy_pass http://elasticsearch:9200;
proxy_http_version 1.1;
proxy_set_header Connection keep-alive;
proxy_set_header Upgrade $$http_upgrade;
proxy_set_header Host $$host;
proxy_set_header X-Real-IP $$remote_addr;
proxy_cache_bypass $$http_upgrade;
}
}' | tee /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
Это не сработало. Позже я внес некоторые изменения:
- Я создал собственное изображение и установил параметры nginx прямо в файле конфигурации nginx.
- Вот моя новая конфигурация файла docker-compose.
Я это тестировал. Nginx работает. curl -XGET http://elastic:[email protected]:9200/_cluster/state?pretty возвращается с данными.
version: '3'
services:
elasticsearch:
image: elasticsearch:latest
deploy:
replicas: 2
ports: ["9300:9300"]
command: [elasticsearch, -E, network.bind_host=0.0.0.0, -E, discovery.zen.ping.unicast.hosts=elasticsearch, -E, discovery.zen.minimum_master_nodes=1]
nginx:
image: 'dodi1983/nginx:0.1'
ports:
- 9200:9200
depends_on:
- elasticsearch
Последствия:
- nginx работает.
- В контейнере nginx работает elasticsearch resolve dns и балансировка нагрузки между узлами.
К сожалению, когда я спрашиваю у эластичного о доступных узлах. Elastic всегда возвращает информацию о текущем узле (балансировка нагрузки). Я вижу разные идентификаторы. Доступен только один узел, но я подумал, что обнаружение ZEN должно было найти оба. Я вошел в контейнер nginx и пытаюсь получить информацию о кластере. здесь вы можете видеть, что это разные узлы, и они не входят в кластер. curl -XGET http: // elastic: changeme @ elasticsearch: 9200 / _cluster / state? pretty а>
У кого-нибудь есть идея или решение? Спасибо.
docker service update --endpoint-mode=dnsrr <service name>
после развертывания стека? - person Bad_Coder   schedule 02.05.2018