Estoy tratando de configurar una cola de tareas de RabbitMQ en un clúster de kubernetes y necesito poder completar la cola de tareas desde fuera del clúster de kubernetes. Estoy tratando de lograr esto usando el controlador de ingreso nginx. Me encuentro con errores al intentar declarar una cola o enviar mensajes a una cola existente desde fuera del clúster. Al usar amqp-tools cli en Ubuntu desde fuera del clúster, aparece un error:
$ 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 Si hago lo mismo desde una máquina virtual dentro del clúster, puedo crear y enviar un mensaje a la cola sin problemas. También puedo conectarme a la interfaz de usuario de administración de RabbitMQ desde fuera del clúster, pero si trato de declarar una cola desde la interfaz de usuario, aparece el Management API returned status code 405 - error, que se muestra en la parte inferior de la pantalla.
Estaba leyendo que el host virtual en RabbitMQ '/' tiene problemas con nginx debido a cómo analiza el host, pero no tengo mucha experiencia con este tipo de cosas y no sé cómo solucionarlo.
Cualquier ayuda con esto sería muy apreciada.
Estoy implementando el controlador de ingreso nginx con el manifiesto recomendado:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yamlRabbitMQ se implementa con este manifiesto:
--- 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: 100mHasta donde yo sé, RabbitMQ no proporciona una API HTTP para interactuar (al menos no es el valor predeterminado). NGINX-Ingress no puede usar un recurso de Ingress para exponer algo diferente a un servicio HTTP. Eche un vistazo a la documentación para aprender a exponer un servicio basado en TCP o UDP .