introducción
Como el corredor MQTT distribuido de código abierto líder en el mundo, EMQX introdujo MQTT sobre QUIC en la versión 5.0, combinando las ventajas del protocolo MQTT con las características de QUIC. Al aprovechar al máximo la sobrecarga de conexión baja y las funciones de multiplexación del protocolo QUIC, MQTT sobre QUIC proporciona una solución muy prometedora para los usuarios en entornos de red débiles y redes irregulares. Es capaz de hacer frente a la pérdida de conexión y al lento establecimiento de la conexión en escenarios de IoT, como vehículos conectados que operan en entornos hostiles, como montañas o túneles. Con el desarrollo de la tecnología nativa de la nube, cada vez más usuarios eligen implementar clústeres EMQX en Kubernetes para disfrutar de las ventajas de una creación rápida y una administración conveniente. Este artículo presentará cómo implementar un clúster EMQX en Kubernetes y habilitar la función MQTT sobre QUIC.
Exponer el servicio EMQX
Al implementar EMQX en Kubernetes, puede usar LoadBalancer
o NodePort
para exponer los servicios de EMQX a clientes fuera del clúster.
LoadBalancer
El método se basa en el equilibrador de carga proporcionado por el proveedor de servicios en la nube para proporcionar servicios. Actualmente, el equilibrador de carga del proveedor de servicios en la nube no admite la función de migración de direcciones de QUIC.NodePort
El método se basa en el componente kube-proxy de Kubernetes para reenviar solicitudes externas, puede conectarse sin problemas a los servicios EMQX y es compatible con la función de migración de direcciones QUIC.
En el escenario de Internet de los vehículos, la dirección del extremo del vehículo puede cambiar con frecuencia, por lo que la función de migración de direcciones de QUIC es muy importante. Por lo tanto, al implementar EMQX 5.0 con la función MQTT sobre QUIC en Kubernetes, le recomendamos que elija exponer NodePort
el servicio de forma externa.
A continuación, presentaremos los pasos específicos para implementar EMQX 5.0 en Kubernetes y habilitar MQTT sobre QUIC. Al mismo tiempo, expondremos NodePort
el servicio y verificaremos la función de migración de direcciones de QUIC de alguna manera.
requisito previo
Antes de implementar EMQX 5.0 en Kubernetes, asegúrese de que se cumplan los siguientes requisitos:
-
Versión de Kubernetes >= 1.27
Cuando la versión de K8s es inferior a 1.27, los paquetes UDP se descartan debido al error de kube-proxy IPVS que interrumpe los servicios UDP NodePort . En la actualidad, este error se ha corregido en la versión 1.27 de K8. Para obtener más información, consulte: Sincronización de la limpieza de conexiones de IPVS con IPTables . Si la versión de su clúster K8s es inferior a 1.27, se recomienda usar kube-proxy en modo iptables.
-
Versión de timón >= 3
Instalar el Operador EMQX
-
Instalar y empezar
cert-manager
.cert-manager
La versión debe ser igual o superior a1.1.6
. Si ya está instalado e iniciadocert-manager
, omita este paso.$ helm repo add jetstack https://charts.jetstack.io $ helm repo update $ helm upgrade --install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --set installCRDs=true
También puede consultar la guía de instalación de cert-manager para la instalación.
-
Utilice Helm para instalar el operador EMQX.
$ helm repo add emqx https://repos.emqx.io/charts $ helm repo update $ helm install emqx-operator emqx/ emqx-operator --namespace emqx-operator-system --create-namespace
-
Espere a que el Operador EMQX esté listo.
$ kubectl wait --for=condition=Ready pods -l "control-plane=controller-manager" -n emqx-operator-system # 如果您得到类似以下的输出结果,说明 emqx-operator 已经就绪: pod/emqx-operator-controller-manager-57bd7b8bd4-h2mcr condition met
Implemente EMQX 5.0 y habilite MQTT sobre QUIC
-
Guarde el siguiente contenido como un archivo YAML y use
kubectl apply
el comando para implementar.apiVersion: apps.emqx.io/v2alpha1 kind: EMQX metadata: name: emqx spec: image: emqx:5.0 bootstrapConfig: | listeners.quic.default { enabled = true bind = "0.0.0.0:14567" max_connections = 1024000 keyfile = "/opt/emqx/etc/certs/key.pem" certfile = "/opt/emqx/etc/certs/cert.pem" } coreTemplate: spec: replicas: 3 replicantTemplate: spec: replicas: 3 listenersServiceTemplate: spec: type: NodePort ports: - name: quic-default protocol: UDP port: 14567 targetPort: 14567
listeners.quic.default
Indica que la escucha QUIC está habilitada y el14567
puerto UDP está enlazado. -
Espere a que el clúster EMQX esté listo. Puede
kubectl get
ver el estado del clúster EMQX a través del comando, asegúrese deSTATUS
que seaRunning
. Esto puede tomar algo de tiempo.$ kubectl get emqx NAME IMAGE STATUS AGE emqx emqx:5.0 Running 10m
-
Obtenga el servicio de escucha del clúster EMQX.
El operador EMQX creará dos recursos de servicio EMQX, a saber
emqx-dashboard
yemqx-listeners
, que se utilizan para la consola EMQX y el puerto de escucha EMQX.$ kubectl get service emqx-listeners NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE emqx-listeners NodePort 192.168.50.64 <none> 14567:30171/UDP,1883:32633/TCP 2m1s
Puede ver que el agente de escucha QUIC está habilitado en el servicio.
Prueba QUIC con eMQTT-Bench
eMQTT-Bench es una herramienta de referencia liviana de MQTT 5.0 escrita en Erlang. Puede descargar e instalar eMQTT-Bench que admita el protocolo QUIC para su plataforma desde la página de lanzamiento de eMQTT-Bench .
-
Utilice el protocolo QUIC para establecer una conexión y
--quic
suscribirse con la opción especificada. Aquí hay 10 clientes suscritos alt/test
tema.$ ./emqtt_bench sub --quic -h ${node_ip} -p ${node_port} -t t/test -c 10
-
Abra otro terminal, conéctese usando el protocolo QUIC y realice una prueba de liberación.
$ ./emqtt_bench pub --quic -h ${node_ip} -p ${node_port} -t t/test -c 1
En este punto, puede ver la tasa de publicación de suscripción de mensajes del suscriptor y el publicador desde el registro de salida de la línea de comando.
-
Realice una prueba de migración de direcciones.
Cambiamos la red del cliente en el punto de tiempo marcado por la flecha en la figura y observamos la situación del clúster EMQX enviando y recibiendo mensajes:
Como se puede ver en la figura anterior, cuando cambia la red del cliente, QUIC no tiene efecto en la recepción y el envío de mensajes. Al mismo tiempo, no existe ninguna anomalía en la publicación y suscripción de mensajes del cliente, como se muestra en la siguiente figura:
Desafíos de usar QUIC en Kubernetes
En la actualidad, el principal problema de usar el protocolo QUIC en Kubernetes es que el balanceador de carga proporcionado por el proveedor de servicios en la nube no es totalmente compatible con el protocolo QUIC, como por ejemplo, no es compatible con el protocolo QUIC de IETF y la función de migración de direcciones QUIC.
epílogo
Lo anterior es todo el proceso de usar EMQX 5.0 en Kubernetes para experimentar MQTT sobre QUIC. Se puede ver que implementar EMQX 5.0 en Kubernetes es muy simple y solo necesita un archivo YAML para completarse. Después de habilitar MQTT sobre QUIC, su dispositivo puede comunicarse con el clúster EMQX basado en el protocolo QUIC, aprovechando al máximo sus ventajas en la transmisión de mensajes de IoT.
Declaración de derechos de autor: este artículo es original de EMQ, indique la fuente para la reimpresión.
Enlace original: https://www.emqx.com/zh/blog/enabling-mqtt-over-quic-on-kubernetes-with-emqx-5-0