使用 nginx-ingress 从 kubernetes 集群外部向 RabbitMQ 发送消息
Send messages to RabbitMQ from outside kubernetes cluster using nginx-ingress
我正在尝试在 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
如果我从集群内的 VM 执行同样的操作,我可以创建消息并将消息发送到队列。我也可以从集群外部连接到 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: /
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: /
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(至少它不是默认设置)。 NGINX-Ingress 无法使用 Ingress 资源向 HTTP 服务公开任何不同的内容。 Take a look at the documentation to learn how to expose a TCP- or UDP-Based service.
我正在尝试在 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
如果我从集群内的 VM 执行同样的操作,我可以创建消息并将消息发送到队列。我也可以从集群外部连接到 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: /
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: /
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(至少它不是默认设置)。 NGINX-Ingress 无法使用 Ingress 资源向 HTTP 服务公开任何不同的内容。 Take a look at the documentation to learn how to expose a TCP- or UDP-Based service.