envoy non si connette a VerneMQ per MQTT su websockets, codice di errore 503

Alcune rapide informazioni di base per chiunque si imbatta negli stessi problemi, e come debuggarli.

Codice di errore 503

Questo è il codice di errore che sto ricevendo:

immagine

Errore durante l'handshake WebSocket: Codice di risposta inaspettato: 503.

Impostare la registrazione di envoy su debug

Ecco il mio docker-compose.yaml per envoy:

versione: '3.7'

servizi:
   inviato:
     costruire:
       contesto: ./
       dockerfile: Dockerfile
     nome_contenitore: penvoyage-morpheus-envoy
     porti:
       – “80:1080”
       – “443:1443”
     volumi:
       - tipo: volume
         fonte: penvoyage_volume
         obiettivo: /etc/envoy
     reti:
       - envoy_net
     utente: "2000:2000"
     #user: "root:root"
     riavvio: a meno che non si sia fermato
     ambiente:
       livello di log: debug

volumi:
   penvoyage_volume:
     esterno:
       nome: penvoyage_volume

reti:
   envoy_net:
     esterno:
       nome: my-bridge-network

Mostra gli ascoltatori di VerneMQ

sul contenitore VerneMQ, mostra gli ascoltatori e gli ip:

vmq-admin listener show

ip -4 addr show

immagine

Notate come mqttws è legato a 172.21.0.2 sulla porta 8080.

Ci sono due IP presenti nel sistema:

  • 172.21.0.2
  • 172.18.0.7

questo è dovuto al fatto che il contenitore VerneMQ fa parte di due reti docker interne.

Guarda l'output del log di envoy

Ecco alcuni estratti per illustrare una richiesta di apertura di websocket dal client MQTT:

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

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

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

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

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

[C85][S10028475751570510266] cluster 'target_verne' match per URL '/mqtt'

[C85][S10028475751570510266] router che decodifica le intestazioni:

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] creando una nuova connessione

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][connessione] [source/common/network/connection_impl.cc:638] [C86] connessione a 172.18.0.7:8080

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

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/conn_pool_base.cc:20] richiesta in coda a causa di nessuna connessione disponibile

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connessione] [source/common/network/connection_impl.cc:525] [C86] errore di connessione in ritardo: 111
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connessione] [source/common/network/connection_impl.cc:183] [C86] chiusura socket: 0
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][client] [source/common/http/codec_client.cc:82] [C86] disconnessione. azzerare 0 richieste in sospeso
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:123] [C86] cliente disconnesso
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][router] [source/common/router/router.cc:532] [C85][S100284751570510266] 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] codifica intestazioni tramite codec (end_stream=false):

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

Il motivo dell'errore 503

In questo caso la ragione dell'errore 503 è che envoy non è in grado di raggiungere VerneMQ sull'IP 172.18.0.7 porta 8080 - VerneMQ è in ascolto sull'altro IP!

Quindi envoy restituisce 503, che il server upstream non è disponibile - e che questa condizione potrebbe essere risolta una volta che il server upstream diventa nuovamente disponibile.