Prueba de la conectividad con el corredor MQTT con clientes MQTT
Importante
En esta página se incluyen instrucciones para administrar componentes de Operaciones de IoT de Azure mediante manifiestos de implementación de Kubernetes, que se encuentra en versión preliminar. Esta característica se proporciona con varias limitacionesy no se debe usar para cargas de trabajo de producción.
Consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure para conocer los términos legales que se aplican a las características de Azure que se encuentran en la versión beta, en versión preliminar o que todavía no se han publicado para que estén disponibles con carácter general.
En este artículo se muestran diferentes formas de probar la conectividad con el corredor MQTT con clientes MQTT en un entorno de no producción.
De manera predeterminada, el corredor MQTT:
Implementa un cliente de escucha habilitado para TLS en el puerto 18883 con ClusterIp como tipo de servicio. ClusterIp significa que solo se puede acceder al agente desde el clúster de Kubernetes. Para acceder al agente desde fuera del clúster, debe configurar un servicio de tipo LoadBalancer o NodePort.
Acepta cuentas de servicio de Kubernetes para la autenticación de conexiones desde el clúster. Para conectarse desde fuera del clúster, debe configurar un método de autenticación diferente.
Precaución
En escenarios de producción, debe usar la autenticación de cuentas de servicio y TLS para proteger la solución de IoT. Para más información, vea:
- Configurar TLS con administración automática de certificados para asegurar la comunicación MQTT en el corredor MQTT
- Configuración de la autenticación en el corredor MQTT
- Exponga los servicios de Kubernetes a dispositivos externos mediante el reenvío de puertos o un conmutador virtual con Azure Kubernetes Services Edge Essentials.
Antes de comenzar, instale o configure operaciones de loT. Use las siguientes opciones para probar la conectividad con el corredor MQTT con clientes MQTT en un entorno de no producción.
Conexión al cliente de escucha predeterminado dentro del clúster
La primera opción es conectarse desde el clúster. Esta opción usa la configuración predeterminada y no requiere actualizaciones adicionales. En los ejemplos siguientes se muestra cómo conectarse desde dentro del clúster mediante Alpine Linux sin formato y un cliente MQTT usado habitualmente, mediante la cuenta de servicio y el certificado de entidad de certificación raíz predeterminado.
En primer lugar, cree un archivo denominado client.yaml
con el código de configuración siguiente:
apiVersion: v1
kind: ServiceAccount
metadata:
name: mqtt-client
namespace: azure-iot-operations
---
apiVersion: v1
kind: Pod
metadata:
name: mqtt-client
# Namespace must match MQTT broker BrokerListener's namespace
# Otherwise use the long hostname: aio-broker.azure-iot-operations.svc.cluster.local
namespace: azure-iot-operations
spec:
# Use the "mqtt-client" service account created from above
# Otherwise create it with `kubectl create serviceaccount mqtt-client -n azure-iot-operations`
serviceAccountName: mqtt-client
containers:
# Mosquitto and mqttui on Alpine
- image: alpine
name: mqtt-client
command: ["sh", "-c"]
args: ["apk add mosquitto-clients mqttui && sleep infinity"]
volumeMounts:
- name: broker-sat
mountPath: /var/run/secrets/tokens
- name: trust-bundle
mountPath: /var/run/certs
volumes:
- name: broker-sat
projected:
sources:
- serviceAccountToken:
path: broker-sat
audience: aio-internal # Must match audience in BrokerAuthentication
expirationSeconds: 86400
- name: trust-bundle
configMap:
name: azure-iot-operations-aio-ca-trust-bundle # Default root CA cert
A continuación, use kubectl
para implementar la configuración. Solo debe tardar unos segundos en iniciarse.
kubectl apply -f client.yaml
Una vez que se ejecuta el pod, use kubectl exec
para ejecutar comandos dentro del pod.
Por ejemplo, para publicar un mensaje en el agente, abra un shell dentro del pod:
kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh
Dentro del shell del pod, ejecute el siguiente comando para publicar un mensaje en el agente:
mosquitto_pub --host aio-broker --port 18883 --message "hello" --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
La salida debe tener una apariencia similar a la siguiente:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT
El cliente de mosquitto usa el token de cuenta de servicio montado en /var/run/secrets/tokens/broker-sat
para autenticarse con el agente. El token es válido durante 24 horas. El cliente también usa el certificado de CA raíz predeterminado montado en /var/run/certs/ca.crt
para comprobar la cadena de certificados TLS del agente.
Sugerencia
Puede usar kubectl
para descargar el certificado de entidad de certificación raíz predeterminado para utilizarlo con otros clientes. Por ejemplo, para descargar el certificado de entidad de certificación raíz predeterminado en un archivo denominado ca.crt
:
kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt
Para suscribirse al tema, ejecute el siguiente comando:
mosquitto_sub --host aio-broker --port 18883 --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
La salida debe tener una apariencia similar a la siguiente:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending SUBSCRIBE (Mid: 1, Topic: world, QoS: 0, Options: 0x00)
Client (null) received SUBACK
Subscribed (mid: 1): 0
El cliente de mosquitto usa el mismo token de cuenta de servicio y certificado de CA raíz para autenticarse con el agente y suscribirse al tema.
Para quitar el pod, ejecute kubectl delete pod mqtt-client -n azure-iot-operations
.
Conexión de clientes desde fuera del clúster
Dado que el cliente de escucha del corredor predeterminado se establece en el tipo de servicio ClusterIp, no se puede conectar al corredor desde fuera del clúster directamente. Para evitar interrupciones involuntarias en la comunicación entre los componentes internos de operaciones de IoT de Azure, se recomienda mantener el cliente de escucha predeterminado sin modificar y dedicado para la comunicación interna de AIO. Aunque es posible crear un servicio LoadBalancer de Kubernetes independiente para exponer el servicio IP del clúster, es mejor crear un cliente de escucha independiente con diferentes configuraciones, como el puerto MQTT 1883 y 8883 más común, para evitar confusiones y posibles riesgos de seguridad.
Puerto del nodo
La manera más fácil de probar la conectividad es usar el tipo de servicio NodePort en el cliente de escucha. Con eso, puede usar <nodeExternalIP>:<NodePort>
para conectarse como en la documentación de Kubernetes.
Por ejemplo, para crear un agente de escucha con el tipo de servicio de puerto de nodo, el nombre del servicio aio-broker-nodeport
, y la escucha en el puerto 1884 (puerto de nodo 31884):
En Azure Portal, vaya a la instancia de operaciones de IoT.
En Componentes, seleccione MQTT Broker.
Seleccione Cliente de escucha de agente MQTT para NodePort>Create. Solo puede crear un cliente de escucha por tipo de servicio. Si ya tiene un cliente de escucha del mismo tipo de servicio, puede agregar más puertos al cliente de escucha existente.
Precaución
Al establecer la autenticación en Ninguno y no configurar TLS , solo se desactiva la autenticación y TLS con fines de prueba.
Escriba la siguiente configuración:
Configuración Value Nombre aio-broker-nodeport
Nombre del servicio Dejar vacío o aio-broker-nodeport
Port 1884 Autenticación Elija entre una existente o Ningun Autorización Elija entre una existente o Ningun Protocolo Elegir MQTT Puerto del nodo 31884 Agregue la configuración de TLS al cliente de escucha seleccionando TLS>Agregar en el puerto. Este paso no es necesario si no necesita TLS para las pruebas. Para obtener más información, consulte BrokerListener.
Seleccione Crear para crear el cliente de escucha.
Nota:
De forma predeterminada, el número de puerto de nodo debe estar en el intervalo 30000-32767.
Obtenga la dirección IP externa del nodo:
kubectl get nodes -o yaml | grep ExternalIP -C 1
La salida debe tener una apariencia similar a la siguiente:
- address: 104.197.41.11
type: ExternalIP
allocatable:
--
- address: 23.251.152.56
type: ExternalIP
allocatable:
...
Use la dirección IP externa y el puerto del nodo para conectarse al corredor. Por ejemplo, para publicar un mensaje en el corredor:
mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Si no hay ninguna dirección IP externa en la salida, es posible que esté usando una configuración de Kubernetes que no exponga la dirección IP externa del nodo de forma predeterminada, como muchas configuraciones de k3s, k3d o minikube. En ese caso, puede acceder al corredor con la dirección IP interna junto con el puerto de nodo desde máquinas de la misma red. Por ejemplo, para obtener la dirección IP interna del nodo:
kubectl get nodes -o yaml | grep InternalIP -C 1
La salida debe tener una apariencia similar a la siguiente:
- address: 172.19.0.2
type: InternalIP
allocatable:
A continuación, use la dirección IP interna y el puerto de nodo para conectarse al corredor desde una máquina dentro del mismo clúster. Si Kubernetes se ejecuta en una máquina local, como con k3s de nodo único, a menudo puede usar localhost
en lugar de la dirección IP interna. Si Kubernetes se ejecuta en un contenedor de Docker, como con k3d, la dirección IP interna corresponde a la dirección IP del contenedor y debe ser accesible desde la máquina host.
Equilibrador de carga
Otra manera de exponer el corredor a Internet es usar el tipo de servicio LoadBalancer. Este método es más complejo y puede requerir una configuración adicional, como configurar el reenvío de puertos.
Por ejemplo, para crear un nuevo agente de escucha con el tipo de servicio del equilibrador de carga, el nombre del servicio aio-broker-loadbalancer
, y la escucha en el puerto 1883:
En Azure Portal, vaya a la instancia de operaciones de IoT.
En Componentes, seleccione MQTT Broker.
Seleccione Cliente de escucha de agente MQTT para NodePort>Create. Solo puede crear un cliente de escucha por tipo de servicio. Si ya tiene un cliente de escucha del mismo tipo de servicio, puede agregar más puertos al cliente de escucha existente.
Precaución
Al establecer la autenticación en Ninguno y no configurar TLS , solo se desactiva la autenticación y TLS con fines de prueba.
Escriba la siguiente configuración:
Configuración Value Nombre aio-broker-loadbalancer
Nombre del servicio Dejar vacío o aio-broker-loadbalancer
Port 1883 Autenticación Elija entre una existente o Ningun Autorización Elija entre una existente o Ningun Protocolo Elegir MQTT Agregue la configuración de TLS al cliente de escucha seleccionando TLS>Agregar en el puerto. Este paso no es necesario si no necesita TLS para las pruebas. Para obtener más información, consulte BrokerListener.
Seleccione Crear para crear el cliente de escucha.
Seleccione Crear para crear el cliente de escucha.
Obtenga la dirección IP externa para el servicio del agente:
kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations
Si la salida es similar a la siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
aio-broker-loadbalancer LoadBalancer 10.x.x.x x.x.x.x 1883:30382/TCP 83s
Esto significa que se ha asignado una dirección IP externa al servicio del equilibrador de carga y puede usar la dirección IP externa y el puerto para conectarse al corredor. Por ejemplo, para publicar un mensaje en el corredor:
mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Si no se asigna la dirección IP externa, es posible que tenga que usar el reenvío de puertos o un conmutador virtual para acceder al corredor.
Uso del reenvío de puertos
Con minikube, kind y otros sistemas de emulación de clúster, es posible que no se asigne automáticamente una dirección IP externa. Por ejemplo, podría mostrarse como estado Pendiente.
Para acceder al agente, reenvíe el puerto de escucha del agente al host.
# Using aio-broker-loadbalancer service name and listener port 1883 as example kubectl port-forward --namespace azure-iot-operations service/aio-broker-loadbalancer <HOST_PORT>:1883
Deje el comando de reenvío de puertos en ejecución en el terminal.
Conéctese al atente en el puerto del host con la misma autenticación y configuración de TLS que la del ejemplo sin reenvío de puertos.
Para más información sobre minikube, vea Uso del enrutamiento de puerto para acceder a aplicaciones en un clúster
Enrutamiento de puerto en AKS Edge Essentials
Para Edge Essentials de Azure Kubernetes Services, debe realizar algunos pasos adicionales. Con AKS Edge Essentials, la obtención de la dirección IP externa puede no ser suficiente para conectarse al corredor. Es posible que tenga que configurar el reenvío de puertos y abrir el puerto en el firewall para permitir el tráfico al servicio del corredor.
En primer lugar, obtenga la dirección IP externa del cliente de escucha del equilibrador de carga:
kubectl get service broker-loadbalancer --namespace azure-iot-operations
La salida debe tener una apariencia similar a la siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Configure el enrutamiento de puerto al servicio
broker-loadbalancer
en la dirección IP externa192.168.0.4
y el puerto1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
Abra el puerto en el firewall para permitir el tráfico al servicio del agente:
New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
Use la dirección IP pública del host para conectarse al agente MQTT.
Para más información sobre el enrutamiento de puerto, vea Exposición de servicios de Kubernetes a dispositivos externos.
Acceso a través de localhost
Algunas distribuciones de Kubernetes pueden exponer el corredor MQTT a un puerto en el sistema host (localhost) como parte de la configuración del clúster. Utilice este enfoque para facilitar que los clientes del mismo host accedan al corredor MQTT.
Por ejemplo, para crear un clúster K3d con la asignación del puerto MQTT predeterminado del corredor MQTT 1883 a localhost:1883
:
k3d cluster create --port '1883:1883@loadbalancer'
O bien, para actualizar un clúster existente:
k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'
A continuación, use localhost
y el puerto para conectarse al corredor. Por ejemplo, para publicar un mensaje en el corredor:
mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Desactivación solo de TLS y de la autenticación con fines pruebas
La razón por la que el corredor MQTT usa la autenticación TLS y las cuentas de servicio de forma predeterminada es proporcionar una experiencia segura de manera predeterminada que minimiza la exposición involuntaria de la solución de IoT a los atacantes. No debe desactivar TLS ni la autenticación en producción. Exponer el corredor MQTT a Internet sin autenticación y TLS puede provocar accesos no autorizados e incluso ataques DDOS.
Advertencia
Si comprende los riesgos y necesita usar un puerto no seguro en un entorno bien controlado, puede desactivar TLS y la autenticación con fines de prueba eliminando los ajustes tls
y authenticationRef
de la configuración del cliente de escucha.
En Azure Portal, vaya a la instancia de operaciones de IoT.
En Componentes, seleccione MQTT Broker.
Seleccione agente de escucha de agente MQTT para NodePort o agente de escucha de agente MQTT para LoadBalancer>Crear. Solo puede crear un cliente de escucha por tipo de servicio. Si ya tiene un cliente de escucha del mismo tipo de servicio, puede agregar más puertos al cliente de escucha existente.
Precaución
Al establecer la autenticación en Ninguno y no configurar TLS , solo se desactiva la autenticación y TLS con fines de prueba.
Escriba la siguiente configuración:
Configuración Value Nombre Escriba un nombre para el cliente de escucha Nombre del servicio Escriba un nombre de servicio Port Escriba un número de puerto Autenticación Elija Ninguno. Authorization Elija Ninguno. Protocolo Elegir MQTT Puerto del nodo Escriba un número entre 30000-32767 si usa el puerto de nodo. Seleccione Crear para crear el cliente de escucha.