envoy no se conecta a VerneMQ para MQTT sobre websockets, código de error 503

Algunos antecedentes rápidos para cualquiera que se encuentre con los mismos problemas, y cómo depurarlos.

Código de error 503

Este es el código de error que recibo:

imagen

Error durante el handshake de WebSocket: Código de respuesta inesperado: 503.

Establecer el registro de envoy a la depuración

Aquí está mi docker-compose.yaml para envoy:

versión: '3.7'

servicios:
   enviado:
     construir:
       contexto: ./
       archivo docker: Dockerfile
     nombre_contenedor: penvoyage-morpheus-envoy
     puertos:
       – “80:1080”
       – “443:1443”
     volúmenes:
       - tipo: volumen
         fuente: penvoyage_volume
         objetivo: /etc/envoy
     redes:
       - envoy_net
     usuario: "2000:2000"
     #user: "root:root"
     reinicio: a menos que se detenga
     ambiente:
       nivel de registro: depuración

volúmenes:
   penvoyage_volume:
     externo:
       nombre: penvoyage_volume

redes:
   envoy_net:
     externo:
       nombre: mi-red-puente

Mostrar los oyentes de VerneMQ

en el contenedor VerneMQ, muestra los listeners y las ip's:

vmq-admin listener show

ip -4 addr show

imagen

Observe que mqttws está vinculado a 172.21.0.2 en el puerto 8080.

Hay dos IPs presentes en el sistema:

  • 172.21.0.2
  • 172.18.0.7

esto se debe a que el contenedor VerneMQ forma parte de dos redes docker internas.

Mira la salida del registro de envoy

A continuación se muestran algunos extractos para ilustrar una solicitud de apertura de websocket desde el cliente MQTT:

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

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 for URL '/mqtt'

[C85][S10028475751570510266] router decodificando cabeceras:

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 nueva conexión

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

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

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:638] [C86] conectando con 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] conexión en curso

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/conn_pool_base.cc:20] solicitud de cola debido a que no hay conexiones disponibles

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:525] [C86] error de conexión retrasado: 111
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][connection] [source/common/network/connection_impl.cc:183] [C86] cerrando socket: 0
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug]

[source/common/http/codec_client.cc:82] [C86] disconnect. resetting 0 pending requests
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:123] [C86] cliente desconectado
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] codificando cabeceras a través del códec (end_stream=false):

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

El motivo del error 503

En este caso la razón del error 503 es que envoy no es capaz de alcanzar VerneMQ en la IP 172.18.0.7 puerto 8080 - ¡VerneMQ está escuchando en la otra IP!

Por lo tanto, envoy devuelve 503, que el servidor upstream no está disponible - y que esta condición podría ser arreglada una vez que el servidor upstream vuelva a estar disponible.