envoy ne se connecte pas à VerneMQ pour MQTT sur websockets, code d'erreur 503

Quelques informations de base pour tous ceux qui rencontrent les mêmes problèmes, et comment les déboguer.

Code d'erreur 503

Voici le code d'erreur que je reçois :

image

Erreur pendant l'échange de données WebSocket : Code de réponse inattendu : 503.

Définir la journalisation d'Envoy à déboguer

Voici mon docker-compose.yaml pour envoy :

version : " 3.7 ".

services :
   envoyé :
     construire :
       contexte : ./
       dockerfile : Dockerfile
     nom_du_conteneur : penvoyage-morpheus-envoy
     ports :
       – “80:1080”
       – “443:1443”
     volumes :
       - type : volume
         source : penvoyage_volume
         cible : /etc/envoy
     réseaux :
       - envoy_net
     utilisateur : "2000:2000"
     #user : "root:root"
     redémarrage : à moins qu'il ne s'agisse d'un arrêt
     l'environnement :
       loglevel : debug

volumes :
   penvoyage_volume :
     externe :
       nom : penvoyage_volume

réseaux :
   envoy_net :
     externe :
       nom : my-bridge-network

Montrer les écouteurs VerneMQ

sur le conteneur VerneMQ, montrer les listeners et les ip's :

vmq-admin listener show

ip -4 addr show

image

Remarquez comment mqttws est lié à 172.21.0.2 sur le port 8080.

Il y a deux IPs présents dans le système :

  • 172.21.0.2
  • 172.18.0.7

cela est dû au fait que le conteneur VerneMQ fait partie de deux réseaux docker internes.

Regardez la sortie du journal d'envoi

Voici quelques extraits pour illustrer une demande d'ouverture de websocket à partir du client MQTT :

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][http] [source/common/http/conn_manager_impl.cc:210] [C85] nouveau flux

penvoyage-morpheus-envoy | ":authority", "picockpit.local".

penvoyage-morpheus-envoy | ':path', '/mqtt

penvoyage-morpheus-envoy | ':method', 'GET

penvoyage-morpheus-envoy | 'connexion', 'Mise à jour'.

[C85][S10028475751570510266] Le cluster 'target_verne' correspond à l'URL '/mqtt'.

[C85][S10028475751570510266] routeur décodant les en-têtes :

penvoyage-morpheus-envoy | ":authority", "picockpit.local".

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:82] création d'une nouvelle connexion

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug]

[source/common/http/codec_client.cc:26] [C86] connexion

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connexion] [source/common/network/connection_impl.cc:638] [C86] se connectant à 172.18.0.7:8080

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connexion] [source/common/network/connection_impl.cc:647] [C86] connexion en cours

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/conn_pool_base.cc:20] mise en file d'attente de la demande en raison de l'absence de connexions disponibles

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connexion] [source/common/network/connection_impl.cc:525] [C86] erreur de connexion différée : 111
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:183] [C86] fermeture de la socket : 0
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug]

[source/common/http/codec_client.cc:82] [C86] Déconnexion. Remise à zéro des demandes en attente.
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:123] [C86] client déconnecté
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][router] [source/common/router/router.cc:532] [C85][S10028475751570510266] réinitialisation amont

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][http] [source/common/http/conn_manager_impl.cc:1234] [C85][S10028475751570510266] encodage des en-têtes via le codec (end_stream=false) :

penvoyage-morpheus-envoy | ':status', '503'

La raison de l'erreur 503

Dans ce cas, la raison de l'erreur 503 est que envoy n'est pas capable d'atteindre VerneMQ sur l'IP 172.18.0.7 port 8080 - VerneMQ écoute sur l'autre IP !

Par conséquent, envoy renvoie 503, indiquant que le serveur en amont n'est pas disponible - et que cette condition pourrait être corrigée une fois que le serveur en amont sera à nouveau disponible.