ws与wss在k8s部署中,使用domain连线至mqtt

问题1. ws://domain:8083/mqtt 在MQTT Client中可以连线,但是上web却无法成功连线
问题2. wss://domain:8084/mqtt 在MQTT Client中无法连线成功,但telnet domain 8084可以通,最终是希望使用wss://domain:8084/mqtt 上web要可以成功连线,目前没找到完整的技术文件来完成

环境与状况:
我在k8s中使用helm部署了ingress-nginx和emqx的服务,emqx 版本5.1.4、ingress-nginx版本1.21.6,ingress-nginx的svc使用LoadBalancer来放出外部IP,cinfigmap的是nginx的tcp来放出1883、8083、8084 port,domain则是部署emqx的ingress,

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: “3600”
nginx.ingress.kubernetes.io/proxy-send-timeout: “3600”
nginx.ingress.kubernetes.io/server-snippets: |
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection “upgrade”;
proxy_cache_bypass $http_upgrade;
}
manager: nginx-ingress-controller
operation: Update
subresource: status
name: emqx-ingress
namespace: emqx
spec:
defaultBackend:
service:
name: emqx
port:
number: 1883
ingressClassName: nginx
rules:

  • host: domain
    http:
    paths:
    • backend:
      service:
      name: emqx
      port:
      number: 1883
      path: /mqtt
      pathType: Prefix
    • backend:
      service:
      name: emqx
      port:
      number: 18083
      path: /
      pathType: Prefix
      tls:
  • secretName: letsencrypt-certificate-tls

目前已经能够让我telnet的到域名8083、8084 port,並且使用MQTTX的client工具能够连线到ws://domain:8083/mqtt,但提交给前端时却无法连接上,前端只能先使用ws://IP:8083/mqtt去做连线,而wss则是完全不知道如何做。

以下是使用域名在开发者工具中报的错误 (index.html)

mqtt.min.js:1 WebSocket connection to ‘ws://domain:8083/mqtt’ failed:
index.html:44 error

  1. Event
  2. isTrusted: true
  3. bubbles: false
  4. cancelBubble: false
  5. cancelable: false
  6. composed: false
  7. currentTarget: WebSocket {url: ‘ws://domain:8083/mqtt’, readyState: 3, bufferedAmount: 0, onopen: null, onerror: null, …}
  8. defaultPrevented: false
  9. eventPhase: 0
  10. returnValue: true
  11. srcElement: WebSocket {url: ‘ws://domain:8083/mqtt’, readyState: 3, bufferedAmount: 0, onopen: null, onerror: null, …}
  12. target: WebSocket {url: ‘ws://domain:8083/mqtt’, readyState: 3, bufferedAmount: 0, onopen: null, onerror: null, …}
  13. timeStamp: 1040.5
  14. type: “error”
  15. [[Prototype]]: Event

Web 端连接到 ws://domain:8083/mqtt 报错的日志有更详细的内容吗?我们首先需要界定它是由于网络或连接层的报错,还是由于 MQTT 协议层的认证失败或者其他什么原因

ingress-nginx pod log
[10.51.0.27] [05/Sep/2023:06:50:39 +0000] TCP 200 66 517 0.001
[10.51.0.14] [05/Sep/2023:06:50:50 +0000] TCP 200 66 517 0.002
[10.51.0.117] [05/Sep/2023:06:50:55 +0000] TCP 200 66 517 0.000
[10.51.0.117] [05/Sep/2023:06:50:56 +0000] TCP 200 66 517 0.003
[10.51.0.90] [05/Sep/2023:06:51:04 +0000] TCP 200 66 517 0.002
[10.51.0.14] [05/Sep/2023:06:51:06 +0000] TCP 200 66 517 0.001

emqx pod log
开启index.html时,没有刷新log

index.html开启后,开发者工具的error内容

前端测试ws连线mqtt是否成功的html档內容
<!doctype html>

Vite App


call help @yusf

@will 您好,我看您的前端是一个 Vite 项目是吗?MQTT.js 文档首页有关于对 Vite 项目的处理:GitHub - mqttjs/MQTT.js: The MQTT client for Node.js and the browser 可以参考下

不过使用 MQTTX 是只可以连接到 ws,但是无法连接到 wss 是吗?

1 个赞

好的,前端这部分我在研究下,
但我實作流程在k8s中並沒有建立到mqtt.js,可能要再重新研究

是,wss的部分仍无法连接

刚才我和我的前端同事同步资讯后,得知ws://IP:8083/mqtt是可以连得上的,但加了domain就不行,是不是ingress设置哪里出错了?
這IP是ingress-nginx LoadBalancer的IP