首页 > 解决方案 > 在 Kubernates GCP 环境中通过 WebSocket 服务 MQTT

问题描述

我目前正在通过 WebSocket 向 js 客户端提供 MQTT 消息。我使用 RabbitMQ 从 java 后端将消息写入队列,并将它们路由到客户端/前端应用程序。我在 Google Cloud Platform 上的 Kubernetes 集群上部署了所有内容,只要我将带有 Kubernetes 负载均衡器的 RabbitMQ pod 直接发布到互联网,一切都可以正常工作。

    apiVersion: v1
kind: Service
metadata:
  labels:
    app: rabbitmq
  name: rabbitmq
spec:
  type: LoadBalancer
  ports:
  - name: http-manager
    nodePort: 30019
    port: 80
    protocol: TCP
    targetPort: 15672
  - name: mqtt-broker
    nodePort: 31571
    port: 1883
    protocol: TCP
    targetPort: 1883
  - name: ws-service
    nodePort: 32048
    port: 15675
    protocol: TCP
    targetPort: 15675
  selector:
    app: rabbitmq

我尝试用 Node 端口服务替换 Kubernetes 负载均衡器,并通过 Ingress 和 GCP Balancer 公开它,但运行状况探测失败并且永远无法恢复。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: rabbitmq
  name: rabbitmq-internal
spec:
  ports:
  - name: ws-port
    port: 15675
    protocol: TCP
    targetPort: 15675
  - name: mamanger-port
    port: 15672
    protocol: TCP
    targetPort: 15672
  selector:
    app: rabbitmq
  sessionAffinity: None
  type: NodePort


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basictest
  namespace: default
spec:
  rules:
  - host: mqtt-host.dom.cloud
    http:
      paths:
      - backend:
          serviceName: rabbitmq-internal
          servicePort: 15675
        path: /ws/*
      - backend:
          serviceName: rabbitmq-internal
          servicePort: 15672
        path: /*

探针是 HTTP,因此我尝试分配自定义 TCP 探针,甚至使用指向同一 pod 上的另一个 HTTP 端口的探针来欺骗 GCP 切换,但没有成功。

我需要使用 GCP Balancer 来拥有一个统一的前端来为 HTTPS 和 WSS 协议分配 SSL 证书。

标签: kuberneteswebsocketgoogle-cloud-platformgoogle-kubernetes-enginekubernetes-ingress

解决方案


推荐阅读