【问题标题】:Send messages to RabbitMQ from outside kubernetes cluster using nginx-ingress使用 nginx-ingress 从外部 Kubernetes 集群向 RabbitMQ 发送消息
【发布时间】:2020-07-22 10:59:21
【问题描述】:

我正在尝试在 kubernetes 集群中设置 RabbitMQ 任务队列,并且需要能够从 kubernetes 集群外部填充任务队列。我正在尝试使用 nginx 入口控制器来完成此操作。尝试从集群外部声明队列或向现有队列发送消息时遇到错误。在集群外部使用 Ubuntu 中的 amqp-tools cli 时出现错误:

$ export BROKER_URL=amqp://<host-name>:80/rabbitmq
$ /usr/bin/amqp-declare-queue --url=$BROKER_URL -q foo -d

logging in to AMQP server: invalid AMQP data

如果我在集群内的虚拟机上做同样的事情,我可以创建消息并将消息发送到队列就好了。我还可以从集群外部连接到 RabbitMQ 管理 UI,但是如果我尝试从 UI 声明队列,我会在屏幕底部显示错误 Management API returned status code 405 -

我读到 RabbitMQ '/' 中的虚拟主机存在 nginx 问题,因为它解析主机的方式,但我对这类事情不是很有经验,也不知道如何解决。

对此的任何帮助将不胜感激。

我正在使用推荐的清单部署 nginx 入口控制器:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

使用此清单部署 RabbitMQ:

---
apiVersion: v1
kind: Namespace
metadata:
  name: rabbitmq
  labels:
    app: rabbitmq
---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-service
  namespace: rabbitmq
  labels:
    component: rabbitmq
spec:
  type: ClusterIP
  ports:
  - name: amqp
    port: 5672
    targetPort: 5672
    protocol: TCP
  - name: http
    port: 80
    targetPort: 15672
    protocol: TCP
  selector:
    app: taskQueue
    component: rabbitmq
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rabbit-ingress
  namespace: rabbitmq
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: <host-name>
    http:
      paths:
      - path: /rabbitmq/?(.*)
        backend:
          serviceName: rabbitmq-service
          servicePort: 5672
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rabbit-manage-ingress
  namespace: rabbitmq
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: <host-name>
    http:
      paths:
      - path: /rabbitmq-manage/?(.*)
        backend:
          serviceName: rabbitmq-service
          servicePort: 80
---
apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    app: taskQueue
    component: rabbitmq
  name: rabbitmq-controller
  namespace: rabbitmq
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: taskQueue
        component: rabbitmq
    spec:
      containers:
      - image: rabbitmq:3-management
        name: rabbitmq
        ports:
        - containerPort: 5672
        - containerPort: 15672
        resources:
          limits:
            cpu: 100m

【问题讨论】:

  • 您在这个问题上有什么进展吗?我有同样的场景,并打算在这里创建一个问题,但看到这个,这是同样的问题。
  • 普通的 RabbitMQ 容器不提供 HTTP API。如果您使用容器rabbitmq:3-management,它确实有一个暴露的 REST API,但它非常慢。花了大约 5 分钟发送大约 7k 条消息。下面接受的答案最终对我有用。您可以在 nginx-ingress 中配置 TCP 直通。你真的只需要在配置中添加一行。如果使用 nginx-ingress helm 图表,则该行如下所示:tcp: {"in port":"service:port"}

标签: nginx kubernetes rabbitmq kubernetes-ingress nginx-ingress


【解决方案1】:

据我所知,RabbitMQ 不提供用于交互的 HTTP-API(至少它不是默认的)。 NGINX-Ingress 不能使用 Ingress 资源向 HTTP-Service 公开任何不同的东西。 Take a look at the documentation to learn how to expose a TCP- or UDP-Based service.

【讨论】:

  • 你是对的,它只适用于 HTTP。在 RabbitMQ 管理容器中,它们还包括我现在使用的 HTTP API。我也会更多地研究公开其他服务类型,看看我是否可以让它发挥作用。
  • 有没有人考虑过像 HAProxy 或 Traefik 这样的不同 TCP 入口?
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2019-11-05
  • 2019-04-03
  • 2019-12-29
相关资源
最近更新 更多