Отправляйте сообщения на RabbitMQ из-за пределов кластера kubernetes, используя nginx -ingress - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь настроить очередь задач RabbitMQ в кластере kubernetes и должен иметь возможность заполнять очередь задач снаружи кластера kubernetes. Я пытаюсь выполнить это sh, используя входной контроллер nginx. Я сталкиваюсь с ошибками при попытке объявить очередь или отправить сообщения в существующую очередь за пределами кластера. Используя amqp-tools cli в Ubuntu из-за пределов кластера, я получаю сообщение об ошибке:

$ 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 извне кластера, но если я пытаюсь объявить очередь из интерфейса, я получаю сообщение об ошибке 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

1 Ответ

0 голосов
/ 09 апреля 2020

Насколько я знаю, RabbitMQ не предоставляет HTTP-API для взаимодействия (по крайней мере, это не по умолчанию). NGINX -Ingress не может использовать ресурс Ingress для предоставления чего-либо отличного от HTTP-сервиса. Ознакомьтесь с документацией, чтобы узнать, как открыть службу на основе TCP или UDP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...