如何通过 Ingress 使用域名公开 K3s 中运行的 MQTT 服务并使其可公开访问?

问题描述 投票:0回答:1

我正在尝试使用域名将 K3s 集群中运行的 MQTT 服务公开到互联网。但是,我遇到了无法公开访问该服务的问题。当我尝试通过域使用 ESP32 设备连接到 MQTT 代理时,我收到“连接被拒绝”错误。

以下是我正在使用的相关配置:

  1. 部署:

    mqtt.example.com

  2. 服务:

    apiVersion: apps/v1 kind: Deployment metadata: name: mqtt namespace: mqtt-dev labels: app: mqtt spec: replicas: 1 selector: matchLabels: app: mqtt template: metadata: labels: app: mqtt spec: containers: - name: mqtt image: eclipse-mosquitto:latest ports: - containerPort: 1883 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: tcpSocket: port: 1883 initialDelaySeconds: 15 periodSeconds: 10 readinessProbe: tcpSocket: port: 1883 initialDelaySeconds: 10 periodSeconds: 5

  3. 入口:

    apiVersion: v1 kind: Service metadata: name: mqtt namespace: mqtt-dev spec: type: NodePort selector: app: mqtt ports: - protocol: TCP port: 1883 targetPort: 1883 nodePort: 30083

    
    
故障排除和观察:

    apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mqtt-ingress namespace: mqtt-dev spec: ingressClassName: traefik rules: - host: mqtt.example.com http: paths: - path: / pathType: Prefix backend: service: name: mqtt port: number: 1883 tls: - hosts: - mqtt.example.com
  • 命令通常将
    kubectl get svc
    显示为
    EXTERNAL-IP
    none
    我尝试使用各种服务类型,例如
  • pending
  • LoadBalancer
    ,但都没有解决问题。
    使用域名 (
  • NodePort
  • ) 连接到代理会导致 ESP32 客户端出现“连接被拒绝”错误。
    Ingress 使用 K3s 集群中配置的 Traefik 控制器。
  • 我验证了 DNS 已正确解析
  • mqtt.example.com
  • 到集群的外部 IP。
    
    
  • 问题:

在 K3s 中使用 Ingress 公开基于 TCP 的服务(例如 MQTT)的正确配置是什么?
  1. Traefik 是否需要为此用例进行特定设置来处理 TCP 流量(而不是 HTTP)?
  2. 如何确保可以使用域名通过互联网公开访问该服务?
  3. 任何解决此问题的意见或建议将不胜感激!

kubernetes mqtt traefik k3s traefik-ingress
1个回答
0
投票

Ingress 使用基于 HTTP 主机名的代理,但 MQTT 不在协议连接数据包中包含主机名,因此控制器无法确定如何将流量路由到正确的 pod

暴露这些的正确方法是使用

mqtt.example.com

类型的

Service
(而不是
LoadBalancer
NodePort
)。
您可以使用 Ingress 通过 WebSocket 公开 MQTT,因为该引导程序作为 HTTP。

© www.soinside.com 2019 - 2024. All rights reserved.