【问题标题】:How to run Mosquitto on Kubernetes with Istio?如何使用 Istio 在 Kubernetes 上运行 Mosquitto?
【发布时间】:2020-10-02 17:34:20
【问题描述】:

我在订阅和发布到在我的 Kubernetes 集群上运行的 Mosquitto 服务器时遇到问题。

我知道我的服务和 pod 正在运行。我可以使用我的 mosquitto 服务作为主机从集群内部订阅和发布。

我还有一个可用的 HTTPS 网关,因此我可以从外部访问 https://mosquittourl.com.br,我可以看到它到达了我的 mosquitto 容器的 1883 端口。容器日志:

New connection from 127.0.0.1 on port 1883.
Client <unknown> disconnected due to protocol error.

我想这是预期的行为。因为我是通过 https 而不是 mqtt 访问它。

现在,我无法使用以下方法连接到容器:

$ mosquitto_pub --url mqtt://mosquittourl.com.br:<port>/test

如何正确设置 Istio 资源,以便订阅和发布到我的 mosquitto 服务器?有没有办法将 Istio 配置为接受 mqtt 请求并将它们重定向到我的 mosquitto 服务?

【问题讨论】:

  • 我是否正确理解您正在使用 HTTPS 代理连接到 MQTT 客户端?如果是这种情况,您希望它如何工作?为什么你认为将 MQTT 客户端连接到 HTTPS 服务器会做任何有用的事情?
  • 我知道问题描述中就是这种情况,它不应该工作。我正在寻求一种解决方法。就像我如何设置 Istio 以接受 mqtt 请求并将它们重定向到 mosquitto 服务。如果那甚至可能。或者有什么替代方案
  • 你能添加你的yamls吗?你是 istio 网格内的 mosquitto 服务器吗?您是否像@ashu 提到的那样在入口网关上添加并配置了这个 1883 端口作为 TCP? stackoverflow 上还有另一篇关于这个的帖子,也许你会在这里找到有用的东西。

标签: kubernetes istio mosquitto


【解决方案1】:

我最近能够设置 Istio 以将 TLS 加密的 MQTT 连接路由到 Mosquitto 在 Kubernetes 上的容器中运行。对于Istio Gateway 中的端口,您应该使用 TLS 作为protocol。最终,Istio 可能会像 gRPC 和 Mongo 一样支持 MQTT,但现在您需要使用 TCP 来处理未加密的 MQTT 流量,并使用 TLS 来实现安全的 MQTT 连接。

您需要确保正确配置以使其正常工作。

  1. Istio Operator Profile yaml 文件

    对于为 Istio 配置主负载均衡器的 IstioOperator,您需要确保设置正确的端口。对于安全的 MQTT 流量,即 8883(从技术上讲,您可以使用任何端口,但 8883 是默认端口)。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    accessLogFile: /dev/stdout
  components:
    egressGateways:
      - name: istio-egressgateway
        enabled: true
        k8s:
          resources:
            requests:
              cpu: 10m
              memory: 40Mi

    ingressGateways:
      - name: istio-ingressgateway
        enabled: true
        k8s:
          resources:
            requests:
              cpu: 10m
              memory: 40Mi
          service:
            ports:
              - port: 15021
                targetPort: 15021
                name: status-port
              - port: 31400
                targetPort: 31400
                name: tcp
                # This is the port where sni routing happens
              - port: 15443
                targetPort: 15443
                name: tls
              - port: 8883
                targetPort: 8883
                name: mqtt-secure

    pilot:
      k8s:
        env:
          - name: PILOT_TRACE_SAMPLING
            value: "100"
        resources:
          requests:
            cpu: 10m
            memory: 100Mi

  values:
    global:
      proxy:
        resources:
          requests:
            cpu: 10m
            memory: 40Mi

    pilot:
      autoscaleEnabled: false

    gateways:
      istio-egressgateway:
        autoscaleEnabled: false
      istio-ingressgateway:
        autoscaleEnabled: false
        runAsRoot: true
  1. Istio 网关 yaml 文件

这里的重要部分是确保您指定您在 Kubernetes 机密中已有的 SSL 证书的名称,并使用您在 IstioOperator 中使用的相同端口,并确保协议是 TLS。 tls: 块告诉网关使用指定的 SSL 证书执行 TLS 终止。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-mqtt-ssl-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 8883
        name: mqtt-secure
        protocol: TLS
      hosts:
        - "*"
      tls:
        credentialName: cert-my.certname.com
        mode: SIMPLE
        privateKey: sds
        serverCertificate: sds
  1. Istio 虚拟服务 yaml 文件

最后一步是设置一个 Istio 虚拟服务,该服务从 Istio 网关获取流量并将其路由到正确的 pod。更新目标中的 pod 名称。另一方面是在 8883 端口上进行匹配,并将流量重新路由到 1883 端口上的 mosquitto,因为流量已在 Istio 网关中被 TLS 终止。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-mqtt-vs
spec:
  hosts:
    - "*"
  gateways:
    - my-mqtt-ssl-gateway
  tcp:
    - match:
        - port: 8883
      route:
        - destination:
            host: my-mqtt-broker-pod-name
            port:
              number: 1883

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2019-01-21
    • 2021-08-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多