как управлять ошибкой отказа в соединении elasticsearc-kibana-nginx через docker?

#docker #elasticsearch #nginx #docker-compose #kibana

#докер #эластичный поиск #nginx #docker-compose #кибана

Вопрос:

Возможно, я потратил 6 часов на поиск ответа в Google. Но я не смог найти никакого решения для этого. Я хочу увеличить 1 узел elasticsearch 1 kibana с помощью nginx (для балансировки нагрузки, прокси и проблем с безопасностью) Но когда docker создает ошибку со стороны kibana.Как я могу разместить узел elasticsearch-kibana с nginx, используя приведенные ниже коды?

 Error:Unable to revive connection: http://elasticsearch:9200/
  

Elasticsearch.yml :

 network.host: localhost
http.port: 9200
xpack.security.enabled: false
xpack.monitoring.enabled: true
xpack.graph.enabled: false
xpack.watcher.enabled: false
  

Файл докера ElasticSearch:

 FROM docker.elastic.co/elasticsearch/elasticsearch:6.6.2
COPY ./config/elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml 
RUN elasticsearch-plugin  install analysis-kuromoji
  

кибана.yml:

 ---
# Default Kibana configuration from kibana-docker.

server.name: kibana
server.host: "0"
elasticsearch.url: http://elasticsearch:9200
elasticsearch.username: elastic
elasticsearch.password: changeme
xpack.monitoring.ui.container.elasticsearch.enabled: true
  

Докер — файл Kibana:

 FROM docker.elastic.co/kibana/kibana:6.6.2
COPY ./config/kibana.yml /opt/kibana/config/kibana.yml
RUN apt-get update amp;amp; apt-get install -y netcat
COPY entrypoint.sh /tmp/entrypoint.sh
RUN chmod  x /tmp/entrypoint.sh
RUN kibana plugin --install elastic/sense
CMD ["/tmp/entrypoint.sh"]
  

entrypoint.sh:

 #!/usr/bin/env bash

# Wait for the Elasticsearch container to be ready before starting Kibana.
echo "Stalling for Elasticsearch"
while true; do
  nc -q 1 elasticsearch 9200 2>/dev/null amp;amp; break
done
echo "Starting Kibana"
exec kibana
  

nginx.conf:

 upstream elasticsearch {
  server 38.252.127.221:9200;
  keepalive 15;
}

upstream kibana {
  server 38.252.127.221:5601;
  keepalive 15;
}

server {
  listen 9200;

  location / {
    auth_basic           "Protected Elasticsearch";
    auth_basic_user_file /etc/nginx/htpasswd.users;

    proxy_pass http://elasticsearch;
    proxy_redirect off;
    proxy_buffering off;

    proxy_http_version 1.1;
    proxy_set_header Connection "Keep-Alive";
    proxy_set_header Proxy-Connection "Keep-Alive";
  }
}

server {
  listen 5601;
  location / {
    auth_basic           "Protected Kibana";
    auth_basic_user_file /etc/nginx/htpasswd.users;
    proxy_pass  http://kibana;
    proxy_redirect off;
    proxy_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Connection "Keep-Alive";
    proxy_set_header Proxy-Connection "Keep-Alive";
  }
}
  

docker-compose.yml

 version: '2'
services:
 elasticsearch:
container_name: esc
image: esi:1.0.0
build: ./es
volumes:
  - ./data/es:/usr/share/elasticsearch/data
ports:
    - 9200:9200
expose:
    - 9300
kibana:
container_name: kibanac
image: kibanai:1.0.0
build: ./kibana
links:
  - elasticsearch
ports:
  - 5601:5601
nginx:
image: nginx:latest
restart: unless-stopped
volumes:
  - ./nginx/config:/etc/nginx/conf.d:ro,Z
  - ./nginx/htpasswd.users:/etc/nginx/htpasswd.users:ro,Z
ports:
  - "8900:5601"
  - "8901:9200"

 depends_on:
  - elasticsearch
  - kibana
  

Ответ №1:

В elasticsearch.yml измените первую строку на:

 network.host: 0.0.0.0
  

Ранее вы говорили elasticsearch прослушивать только localhost, поэтому любые соединения из других контейнеров не будут работать должным образом, поскольку служба поиска elastic не прослушивает другие интерфейсы, однако, когда вы установите для нее значение 0.0.0.0 , вы сделаете elasticsearch способным получать соединения из других контейнеров, и у вас не должно возникнуть Connection Refused проблемы

Также обратите внимание, что вам не нужно публиковать порты 9200, 5601, поскольку это позволит любому пользователю вызывать их напрямую, не проходя базовую аутентификацию nginx.

Следующая часть ниже выходит за рамки вопроса, но стоит упомянуть.

Возможно, вам потребуется заменить эту часть вашего entrypoint.sh , которая добавлена ниже:

 # Wait for the Elasticsearch container to be ready before starting Kibana.
echo "Stalling for Elasticsearch"
while true; do
  nc -q 1 elasticsearch 9200 2>/dev/null amp;amp; break
done
  

Используя ожидание или wait-for, как ваш способ, так и эти скрипты, вы можете дождаться, пока будет доступно другое соединение, прежде чем запускать службу другого контейнера.