4 votes

Connexion à l'instance Docker Elasticsearch via Java/Spring Boot

Je fais fonctionner une instance Elasticsearch à partir de Docker. L'image provient de jHipster docker hub repo : jhipster/jhipster-elasticsearch/ - J'utilise image v1.3.2 car j'ai besoin d'Elasticsearch 2.4.0 (pour être en ligne avec la version Spring Boot du projet).

Je démarre le conteneur ES avec les images Logstash et Kibana, avec docker-compose . Il s'agit des paramètres de démarrage du conteneur ES :

jhipster-elasticsearch:
    image: jhipster/jhipster-elasticsearch:v1.3.2
    ports:
        - 9400:9200
        - 9500:9300
    volumes:
       - ./log-es-config/elasticsearch_custom.yml:/usr/share/elasticsearch/config/elasticsearch.yml

J'utilise donc 9400 pour REST et 9500 pour la communication de transport.

Il s'agit de la configuration à l'intérieur elasticsearch_custom.yml qui est monté sur ES config :

cluster.name: "log-cluster"
node.name: "log-node"
http.host: 0.0.0.0
transport.host: 127.0.0.1
transport.tcp.port: 9500
transport.publish_port: 9500

Lorsque je lance le conteneur, voici ce que j'obtiens à partir de http://localhost:9400/_nodes :

"cluster_name": "log-cluster",
  "nodes": {
    "xLsGj2DyTdCF89I7sAToVw": {
      "name": "log-node",
      "transport_address": "127.0.0.1:9500",
      "host": "127.0.0.1",
      "ip": "127.0.0.1",
      "version": "2.4.0",
      "build": "ce9f0c7",
      "http_address": "172.18.0.5:9200",
      "settings": {
        "cluster": {
          "name": "log-cluster"
        },
        ... (I can put all response if needed)

API JAVA :

J'essaie maintenant de me connecter à ce nœud ES comme suit :

    @Bean
    public ElasticsearchOperations logsElasticsearchOperations() throws UnknownHostException {
        Settings settings = Settings.settingsBuilder()
            .put("cluster.name", "log-cluster")
            .put("node.name", "log-node")
            .build();

        Client client = TransportClient.builder()
            .settings(settings)
            .build()
            .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1", 9500)));

        ElasticsearchTemplate template = new ElasticsearchTemplate(client);
        template.createIndex(ProcessLog.class);
        log.debug("Elasticsearch for logs configured.");
        return template;
    }

L'erreur que j'obtiens est la plus connue :

Caused by: org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9500}]

J'ai cherché sur Internet et essayé différentes approches de configuration, y compris avec client.transport.sniff fixé à false mais aucune n'a fonctionné. J'ai passé beaucoup de temps à essayer de configurer celui-ci et il me manque toujours quelque chose.

Merci d'avance pour votre aide.

UPDATE :

Il y a également une instance ES intégrée qui fonctionne lorsque je démarre l'application. La configuration des ports de l'hôte est donc la suivante :

  • ES intégré : 9200 (http), 9300 (tcp)
  • ES de Docker : 9400 (http), 9500 (tcp)

Voici le texte intégral docker-compose.yml :

    version: '2'
    services:
    jhipster-elasticsearch:
        # elasticsearch 2.4.0 - to be in line with spring boot version
        image: jhipster/jhipster-elasticsearch:v1.3.2
        ports:
            - 9400:9200
            - 9500:9300
        volumes:
           - ./log-es-config/elasticsearch_custom.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    jhipster-logstash:
        image: jhipster/jhipster-logstash:v2.2.1
        command: logstash -f /conf/logstash_custom.conf
        ports:
            - 5000:5000/udp
            - 6000:6000/tcp
        volumes:
            - ./logstash-log-es-conf/:/conf
    jhipster-console:
        image: jhipster/jhipster-console:v2.0.1
        ports:
            - 5601:5601
    jhipster-zipkin:
        image: jhipster/jhipster-zipkin:v2.0.1
        ports:
            - 9411:9411
        environment:
            - ES_HOSTS=http://jhipster-elasticsearch:9400
            - ZIPKIN_UI_LOGS_URL=http://localhost:5601/app/kibana#/dashboard/logs-dashboard?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-1h,mode:quick,to:now))&_a=(filters:!(),options:(darkTheme:!f),panels:!((col:1,id:logs-levels,panelIndex:2,row:1,size_x:6,size_y:3,type:visualization),(col:7,columns:!(stack_trace),id:Stacktraces,panelIndex:7,row:1,size_x:4,size_y:3,sort:!('@timestamp',desc),type:search),(col:11,id:Log-forwarding-instructions,panelIndex:8,row:1,size_x:2,size_y:3,type:visualization),(col:1,columns:!(app_name,level,message),id:All-logs,panelIndex:9,row:4,size_x:12,size_y:7,sort:!('@timestamp',asc),type:search)),query:(query_string:(analyze_wildcard:!t,query:'{traceId}')),title:logs-dashboard,uiState:())

2voto

hideburn Points 80

J'ai réussi à faire fonctionner ce système en définissant l'élément transport.host como 0.0.0.0 à l'intérieur elasticsearch_custom.yml afin que l'instance soit liée à l'adresse IP du conteneur.

Peut-être que cela devrait également être la configuration par défaut pour elasticsearch.yml sur le github du projet repo .

0voto

Val Points 94829

Dans votre fichier docker compose, le port 9500 sur l'hôte est mappé au port 9300 à l'intérieur du conteneur, c'est-à-dire :

ports:
    - 9500:9300

Ainsi, puisque le port 9500 est le port TCP à l'extérieur du conteneur Docker, dans votre elasticsearch_custom.yml vous devriez avoir ceci à la place

transport.tcp.port: 9300
transport.publish_port: 9300

ou simplement ne pas tenir compte de ces deux lignes puisque 9300 est le port TCP par défaut.

0voto

motou Points 500

Je recommanderais de prendre du recul et d'installer le plugin Head( https://github.com/mobz/elasticsearch-head ) afin d'obtenir une vue d'ensemble de votre cluster, il affichera les informations détaillées du nom du cluster.

Essayez également d'envoyer une simple requête d'index à partir de la ligne de commande pour vous assurer que vous pouvez vous connecter à votre cluster.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X