Как подключиться к службе rabbitmq, используя имя хоста балансировщика нагрузки

Команда kubectl describe service the-load-balancer возвращает:

Name:                     the-load-balancer
Namespace:                default
Labels:                   app=the-app
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"the-app"},"name":"the-load-balancer","namespac...
Selector:                 app=the-app
Type:                     LoadBalancer
IP:                       10.100.129.251
LoadBalancer Ingress:     1234567-1234567890.us-west-2.elb.amazonaws.com
Port:                     the-load-balancer  15672/TCP
TargetPort:               15672/TCP
NodePort:                 the-load-balancer  30080/TCP
Endpoints:                172.31.77.44:15672
Session Affinity:         None
External Traffic Policy:  Cluster

Сервер RabbitMQ, работающий в другом контейнере за балансировщиком нагрузки, доступен из другого контейнера через Endpoints 172.31.77.44:15672 балансировщика нагрузки.

Но ему не удается подключиться, используя the-load-balancer имя хоста или локальный 10.100.129.251 IP-адрес.

Что нужно сделать, чтобы сделать службу RabbitMQ доступной через имя хоста балансировщика нагрузки the-load-balancer?

Отредактировано позже:

Запуск простого теста Python из другого контейнера:

import socket
print(socket.gethostbyname('the-load-balancer'))

возвращает локальный IP-адрес балансировщика нагрузки 10.100.129.251.

Подключение к RabbitMQ с использованием «172.31.18.32» работает хорошо:

import pika
credentials = pika.PlainCredentials('guest', 'guest')
parameters = pika.ConnectionParameters(host='172.31.18.32', port=5672, credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
print('...channel: %s' % channel)

Но после замены host='172.31.18.32' на host='the-load-balancer' или host='10.100.129.251' клиент не может подключиться.


person alphanumeric    schedule 31.07.2019    source источник


Ответы (3)


При обслуживании RabbitMQ из-за балансировщика нагрузки вам потребуется открыть порты 5672 и 15672. При правильной настройке команда kubectl describe service the-load-balancer должна возвращать оба порта, сопоставленные с локальным IP-адресом:

Name:                     the-load-balancer
Namespace:                default
Labels:                   app=the-app
Selector:                 app=the-app
Type:                     LoadBalancer
IP:                       10.100.129.251
LoadBalancer Ingress:     123456789-987654321.us-west-2.elb.amazonaws.com

Port:                     the-load-balancer-port-15672  15672/TCP
TargetPort:               15672/TCP
NodePort:                 the-load-balancer-port-15672  30080/TCP
Endpoints:                172.31.18.32:15672

Port:                     the-load-balancer-port-5672  5672/TCP
TargetPort:               5672/TCP
NodePort:                 the-load-balancer-port-5672  30081/TCP
Endpoints:                172.31.18.32:5672

Ниже приведен файл the-load-balancer.yaml, используемый для создания службы RabbitMQ:

apiVersion: v1
kind: Service
metadata:
  name: the-load-balancer
  labels:
    app: the-app
spec:
  type: LoadBalancer
  ports:
  - port: 15672
    nodePort: 30080
    protocol: TCP
    name: the-load-balancer-port-15672 
  - port: 5672
    nodePort: 30081
    protocol: TCP
    name: the-load-balancer-port-5672   
  selector:
    app: the-app
person alphanumeric    schedule 31.07.2019

Я заметил, что в вашем коде вы используете порт 5672 для прямого общения с конечной точкой, в то время как в определении службы это 15672, который является портом для веб-консоли?

person Hang Du    schedule 31.07.2019

Убедитесь, что служба балансировки нагрузки и rabbitmq находятся в одном и том же пространстве имен вашего приложения.

Если нет, вы должны использовать полную DNS-запись service-x.namespace-b.svc.cluster.local в соответствии с Документация по DNS для служб и модулей

person Federico Bevione    schedule 31.07.2019