envoy maakt geen verbinding met VerneMQ voor MQTT over websockets, foutcode 503

Wat achtergrondinformatie voor iedereen die tegen dezelfde problemen aanloopt, en hoe ze te debuggen.

Foutcode 503

Dit is de foutcode die ik krijg:

afbeelding

Fout tijdens WebSocket handshake: Onverwachte antwoordcode: 503.

Stel envoy logging in op debug

Hier is mijn docker-compose.yaml voor envoy:

versie: '3.7'

diensten:
   gezant:
     bouwen:
       context: ./
       dockerfile: Dockerfile
     container_naam: penvoyage-morpheus-envoy
     havens:
       – “80:1080”
       – “443:1443”
     volumes:
       - type: volume
         bron: penvoyage_volume
         doelwit: /etc/envoy
     netwerken:
       - gezantschap_net
     gebruiker: "2000:2000"
     #user: "root:root"
     herstarten: tenzij-gestopt
     omgeving:
       loglevel: debug

volumes:
   penvoyage_volume:
     uitwendig:
       naam: penvoyage_volume

netwerken:
   envoy_net:
     uitwendig:
       naam: mijn-brug-netwerk

Toon de VerneMQ luisteraars

op de VerneMQ container, toon de luisteraars en de ip's:

vmq-admin listener show

ip -4 addr show

afbeelding

Merk op hoe mqttws gebonden is aan 172.21.0.2 op poort 8080.

Er zijn twee IP's aanwezig in het systeem:

  • 172.21.0.2
  • 172.18.0.7

dit komt doordat de VerneMQ container deel uitmaakt van twee interne docker netwerken.

Kijk naar de envoy log output

Hier zijn enkele fragmenten ter illustratie van een websocket openingsverzoek van de MQTT client:

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

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

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

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

penvoyage-morpheus-envoy | "verbinding", "Upgrade

[C85][S100284751570510266] cluster 'target_verne' match voor URL '/mqtt'

[C85][S100284751570510266] router die headers decodeert:

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] een nieuwe verbinding maken

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

[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] verbinden met 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] verbinding in uitvoering

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/conn_pool_base.cc:20] verzoek in wachtrij wegens geen beschikbare verbindingen

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:525] [C86] vertraagde verbindingsfout: 111
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:183] [C86] socket sluiten: 0
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug]

[source/common/http/codec_client.cc:82] [C86] verbreek verbinding. resetten van 0 in behandeling zijnde verzoeken
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:123] [C86] cliënt verbroken
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][S100284751570510266] coderen van headers via codec (end_stream=false):

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

De reden voor de 503 fout

In dit geval is de reden voor de 503 fout dat envoy niet in staat is om VerneMQ te bereiken op IP 172.18.0.7 poort 8080 - VerneMQ luistert op het andere IP!

Daarom geeft envoy 503 terug, dat de upstream server niet beschikbaar is - en dat deze toestand hersteld zou kunnen worden zodra de upstream server weer beschikbaar wordt.