envoy verbindet sich nicht mit VerneMQ für MQTT über Websockets, Fehlercode 503

Einige kurze Hintergrundinformationen für alle, die auf dieselben Probleme stoßen, und wie man sie behebt.

Fehlercode 503

Dies ist der Fehlercode, den ich erhalte:

Bild

Fehler beim WebSocket-Handshake: Unerwarteter Antwortcode: 503.

Envoy-Protokollierung auf Debuggen einstellen

Hier ist meine docker-compose.yaml für envoy:

Version: '3.7'

Dienstleistungen:
   Gesandter:
     bauen:
       Kontext: ./
       Dockerfile: Dockerfile
     container_name: penvoyage-morpheus-envoy
     Häfen:
       – “80:1080”
       – “443:1443”
     Volumen:
       - Typ: Volumen
         Quelle: penvoyage_volume
         Ziel: /etc/envoy
     Netzwerke:
       - envoy_net
     Benutzer: "2000:2000"
     1TP3Benutzer: "root:root"
     Neustart: wenn nicht gestoppt
     Umwelt:
       Loglevel: Debug

Volumen:
   penvoyage_volume:
     extern:
       name: penvoyage_volume

Netzwerke:
   envoy_net:
     extern:
       Name: Mein-Brücken-Netz

Anzeigen der VerneMQ-Listener

auf dem VerneMQ-Container die Listener und die IP's anzeigen:

vmq-admin listener show

ip -4 addr show

Bild

Beachten Sie die Bindung von mqttws an 172.21.0.2 auf Port 8080.

Es gibt zwei IPs im System:

  • 172.21.0.2
  • 172.18.0.7

Das liegt daran, dass der VerneMQ-Container Teil von zwei internen Docker-Netzwerken ist.

Schauen Sie sich die envoy-Log-Ausgabe an

Hier sind einige Auszüge zur Veranschaulichung einer Websocket-Öffnungsanforderung vom MQTT-Client:

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

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

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

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

penvoyage-morpheus-envoy | 'Verbindung', 'Upgrade'

[C85][S10028475751570510266] cluster 'target_verne' Übereinstimmung für URL '/mqtt'

[C85][S10028475751570510266] Router dekodiert Kopfzeilen:

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] erstellt eine neue Verbindung

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][client] [source/common/http/codec_client.cc:26] [C86] connecting

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:638] [C86] Verbindung zu 172.18.0.7:8080

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:647] [C86] Verbindung in Arbeit

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/conn_pool_base.cc:20] Anfrage in der Warteschlange, da keine Verbindungen verfügbar sind

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:525] [C86] verzögerter Verbindungsfehler: 111
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:183] [C86] Socket schließen: 0
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][client] [source/common/http/codec_client.cc:82] [C86] disconnect. 0 anstehende Anfragen zurücksetzen
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:123] [C86] Kunde nicht verbunden
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][router] [source/common/router/router.cc:532] [C85][S10028475751570510266] upstream reset

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][http] [source/common/http/conn_manager_impl.cc:1234] [C85][S10028475751570510266] Verschlüsselung von Headern über Codec (end_stream=false):

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

Der Grund für den 503-Fehler

In diesem Fall ist der Grund für den 503-Fehler, dass envoy nicht in der Lage ist, VerneMQ auf der IP 172.18.0.7 Port 8080 zu erreichen - VerneMQ hört auf der anderen IP!

Daher gibt envoy 503 zurück, dass der Upstream-Server nicht verfügbar ist - und dass dieser Zustand behoben werden kann, sobald der Upstream-Server wieder verfügbar ist.