跳到主要內容

使用 Nginx Ingress Controller 進行 MQTT L4 負載均衡

使用 Nginx Ingress Controller 進行 MQTT L4 負載均衡

在 Kubernetes 中,當你希望為 MQTT (Message Queuing Telemetry Transport) 提供 L4 (Layer 4) 負載均衡,可以使用 Nginx Ingress Controller 來管理 TCP 流量。由於 MQTT 運行在 TCP 層,並不適用於 HTTP/2,因此需要特別配置。


為什麼選擇 Nginx Ingress Controller?

  • 支援 TCP 負載均衡:可直接處理 MQTT 連線。

  • 與 Kubernetes 無縫整合:利用 ConfigMap 設定 TCP 服務。

  • 可擴展與高可用性:透過 Kubernetes 自動擴展。

  • 支援 TLS 加密:可進行安全通訊。


步驟 1:安裝並配置 Nginx Ingress Controller

首先,請確保你的 Kubernetes 叢集 已安裝 Nginx Ingress Controller,這可以透過 Helm Chart 來快速安裝:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx \
    --set controller.publishService.enabled=true \
    --set tcp.1883="default/mqtt-service:1883"
    

步驟 2:使用 ConfigMap 配置 TCP 負載均衡

由於 MQTT 使用 TCP,我們需要定義 ConfigMap 來讓 Nginx Ingress Controller 處理 TCP 連線

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  "1883": "default/mqtt-service:1883"
    

步驟 3:建立 MQTT Service 和 Deployment

定義 mqtt-service 服務,確保 Kubernetes 內部可以正確路由 MQTT 流量:

apiVersion: v1
kind: Service
metadata:
  name: mqtt-service
  namespace: default
spec:
  selector:
    app: mqtt
  ports:
    - protocol: TCP
      port: 1883
      targetPort: 1883
    

步驟 4:啟用 TLS 加密 (可選)

如果你需要保護 MQTT 通訊,建議啟用 TLS 加密。你可以使用 Let's Encrypt自簽名憑證 來保護 MQTT 連線。

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: mqtt-tls
  namespace: default
spec:
  secretName: mqtt-tls-secret
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: mqtt.example.com
  dnsNames:
    - mqtt.example.com
    

步驟 5:開放防火牆與驗證連線

最後,請確保你的防火牆允許 1883 端口 流量:

ufw allow 1883/tcp

測試 MQTT 連線:

mosquitto_pub -h mqtt.example.com -t "test/topic" -m "Hello, MQTT!"
mosquitto_sub -h mqtt.example.com -t "test/topic"
    

如果你啟用了 TLS,請使用:

mosquitto_pub -h mqtt.example.com -p 8883 --cafile ca.crt -t "test/topic" -m "Hello, MQTT Secure!"
mosquitto_sub -h mqtt.example.com -p 8883 --cafile ca.crt -t "test/topic"
    

總結

透過 Nginx Ingress Controller 來提供 MQTT L4 負載均衡 的完整流程如下:

  • 安裝 Nginx Ingress Controller,並啟用 TCP 負載均衡。
  • 配置 ConfigMap 來讓 Ingress Controller 處理 MQTT 流量。
  • 建立 MQTT Service 與 Deployment,確保 Kubernetes 內部正確運行。
  • (可選)啟用 TLS 加密 來保護 MQTT 流量。
  • 開放防火牆與驗證連線,確保外部設備可以連線到 MQTT Broker。
END

留言