How to connect to rabbitmq service using load balancer hostname

7/31/2019

The kubectl describe service the-load-balancer command returns:

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

The RabbitMQ server that runs on another container, behind of load balancer is reachable from another container via the load balancer's Endpoints 172.31.77.44:15672.

But it fails to connect using the-load-balancer hostname or via its local 10.100.129.251 IP address.

What needs to be done in order to make the RabbitMQ service reachable via the load balancer's the-load-balancer hostname?

Edited later:

Running a simple Python test from another container:

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

returns a load balancer local IP 10.100.129.251.

Connecting to RabbitMQ using '172.31.18.32' works well:

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)

But after replacing the host='172.31.18.32' with host='the-load-balancer' or host='10.100.129.251' and the client fails to connect.

-- alphanumeric
amazon-web-services
eks
google-cloud-platform
kubernetes
rabbitmq

3 Answers

7/31/2019

I've noticed that in your code, you are using port 5672 to talk to the endpoint directly, while it is 15672 in the service definition which is the port for web console?

-- Hang Du
Source: StackOverflow

7/31/2019

Be sure that the load balancer service and rabbitmq are in the same namespace of your application.

If not, you have to use the full dns record service-x.namespace-b.svc.cluster.local, according to the DNS for Services and Pods documentation

-- Federico Bevione
Source: StackOverflow

7/31/2019

When serving RabbitMQ from behind the Load Balancer you will need to open the ports 5672 and 15672. When configured properly the kubectl describe service the-load-balancer command should return both ports mapped to a local IP address:

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

Below is the the-load-balancer.yaml file used to create RabbitMQ service:

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
-- alphanumeric
Source: StackOverflow