使用 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。
留言
張貼留言