引言
作为寰球当先的开源分布式 MQTT Broker,EMQX 在 5.0 版本中引入了 MQTT over QUIC,将 MQTT 协定的劣势与 QUIC 的个性相结合。通过充分利用 QUIC 协定低连贯开销和多路复用的特点,MQTT over QUIC 为弱网络环境和不规则网络中的用户提供了一种十分有前景的解决方案。它可能应答诸如在山区或隧道等顽劣环境中运行的网联车辆等物联网场景中的连贯中断和连贯建设迟缓等问题。云原生技术的倒退,让越来越多的用户抉择在 Kubernetes 上部署 EMQX 集群,享受疾速创立和便捷治理的劣势。本文将介绍如何在 Kubernetes 上部署 EMQX 集群并开启 MQTT over QUIC 性能。
裸露 EMQX 服务
在 Kubernetes 上部署 EMQX 时,您能够应用 LoadBalancer
或 NodePort
将 EMQX 服务对集群外的客户端裸露。
LoadBalancer
形式依赖云服务商提供的负载均衡器来提供服务。目前,云服务商的负载均衡器不反对 QUIC 的地址迁徙个性。NodePort
形式依赖于 Kubernetes 的 kube-proxy 组件来转发内部申请,它能够无缝连贯到 EMQX 服务,并反对 QUIC 地址迁徙个性。
在车联网场景中,车端的地址可能会频繁变动,QUIC 的地址迁徙个性就显得十分重要。因而,在 Kubernetes 上部署具备 MQTT over QUIC 性能的 EMQX 5.0 时,咱们倡议抉择以 NodePort
形式对外裸露服务。
上面,咱们将介绍在 Kubernetes 上部署 EMQX 5.0 并启用 MQTT over QUIC 的具体步骤。同时,咱们将以 NodePort
形式对外裸露服务并验证 QUIC 的地址迁徙性能。
前提条件
在将 EMQX 5.0 部署到 Kubernetes 之前,请确保满足以下要求:
-
Kubernetes 版本 >= 1.27
当 K8s 版本低于 1.27 时,因为 kube-proxy IPVS break UDP NodePort Services 的 bug 导致 UDP 数据包被抛弃。目前这个 bug 曾经在 K8s 1.27 版本中被修复,详情请参考:Syncing IPVS conntrack cleaning with IPTables。若您的 K8s 集群版本低于 1.27,举荐应用 iptables 模式的 kube-proxy。
- Helm 版本 >= 3
装置 EMQX Operator
-
装置并启动
cert-manager
。cert-manager
版本须要等于或高于1.1.6
。如果曾经装置并启动了cert-manager
,请跳过此步骤。$ 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
您也能够参考 cert-manager 装置指南来进行装置。
-
应用 Helm 装置 EMQX Operator。
$ 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
-
期待 EMQX Operator 准备就绪。
$ 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
部署 EMQX 5.0 并启用 MQTT over QUIC
-
将以下内容保留为 YAML 文件,并应用
kubectl apply
命令进行部署。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
示意启用 QUIC 监听器并绑定 UDP14567
端口。 -
期待 EMQX 集群准备就绪。您能够通过
kubectl get
命令查看 EMQX 集群的状态,请确保STATUS
为Running
。这可能须要一些工夫。$ kubectl get emqx NAME IMAGE STATUS AGE emqx emqx:5.0 Running 10m
-
获取 EMQX 集群的监听器服务。
EMQX Operator 将创立两个 EMQX Service 资源,别离为
emqx-dashboard
和emqx-listeners
,用于 EMQX 控制台和 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
您能够看到服务中启用了 QUIC 监听器。
应用 eMQTT-Bench 测试 QUIC
eMQTT-Bench 是一款用 Erlang 编写的轻量级 MQTT 5.0 基准测试工具。您能够从 eMQTT-Bench 发布页面下载并装置适宜您平台的反对 QUIC 协定的 eMQTT-Bench。
-
应用 QUIC 协定建设连贯,并通过指定
--quic
选项进行订阅。这里有 10 个客户端订阅了t/test
主题。$ ./emqtt_bench sub --quic -h ${node_ip} -p ${node_port} -t t/test -c 10
-
关上另一个终端,应用 QUIC 协定进行连贯并执行公布测试。
$ ./emqtt_bench pub --quic -h ${node_ip} -p ${node_port} -t t/test -c 1
此时,您能够从命令行的输入日志中看到订阅者和发布者的音讯订阅公布速率。
-
进行地址迁徙测试。
咱们在图中箭头标记的工夫点切换客户端网络,并察看 EMQX 集群发送和接管音讯的状况:
从上图能够看出,在客户端网络变动时,QUIC 对音讯的接管和发送没有造成影响。同时,客户端公布和订阅音讯也没有呈现任何异样,如下图所示:
在 Kubernetes 上应用 QUIC 的挑战
目前,在 Kubernetes 上应用 QUIC 协定存在的次要问题是云服务商提供的负载均衡器对 QUIC 协定反对不欠缺,如不反对 IETF QUIC 协定和 QUIC 地址迁徙个性。
结语
以上就是在 Kubernetes 上应用 EMQX 5.0 体验 MQTT over QUIC 的全副过程。能够看出,在 Kubernetes 上部署 EMQX 5.0 非常简单,只须要一个 YAML 文件即可实现。启用 MQTT over QUIC 后,您的设施能够基于 QUIC 协定与 EMQX 集群进行通信,充分利用其在物联网音讯传输方面的劣势。
版权申明:本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/enabling-mqtt-over-quic-on-kubernetes-with-emqx-5-0