Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access host's localhost from inside kubernetes cluster

In this application, nodejs pods are running inside kubernetes, and mongodb itself sitting outside at host as localhost.

This indeed not good design, but its only for dev environment. In production a separte mongodb server will be there, as such option to have a non loopback ip in endpoint, so will not be a problem in Production.

Have considered following options for dev environment

  1. Use localhost connect string to connect to mongodb, but it will refer to pod's own localhost not host's localhost

  2. Use headless service and provide localhost ip and port in endpoint. However endpoint doesn't allow loopback

Suggest if there is a way to access mongodb database at host's localhost from inside cluster (pod / nodejs application).

like image 724
GLK Avatar asked Dec 03 '20 09:12

GLK


2 Answers

127.0.0.1 is a localhost(lo0) interface IP address. Hosts, nodes and pods have their own localhost interfaces and they are not connected to each other.

Your mongodb is running on the Host machine and cannot be accessible using the localhost (or it's IP range) from inside a cluster pod or from inside vm.

In your case, create a headless service and Endpoint for it inside the cluster:

Your mongodb-service.yaml file should look like this:

apiVersion: v1
kind: Service
metadata:
   name: mongodb-service
spec:
   clusterIP: None
   ports:
   - protocol: TCP
     port: <multipass-port-you-are-using>
     targetPort: <multipass-port-you-are-using>
   selector:  
     name:  example
   type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
  name: mongodb-service
subsets:
  - addresses:
    - ip: 10.62.176.1
    ports:
      - port: <multipass-port-you-are-using>

I have add IP you've mentioned in comment section.

After creating service and endpoint you can use mongodb-service name and port <multipass-port-you-are-using> inside any pod of this cluster as a destination point.

Take a look: mysql-localhost, mongodb-localhost.

like image 138
Malgorzata Avatar answered Sep 25 '22 17:09

Malgorzata


I'm running on docker for windows, and for me just using host.docker.internal instead of localhost seems to work fine.

For example, my mongodb connection string looks like this:

mongodb://host.docker.internal:27017/mydb

As an aside, my hosts file includes the following lines (which I didn't add, I guess the docker desktop installation did that):

# Added by Docker Desktop
192.168.1.164 host.docker.internal
192.168.1.164 gateway.docker.internal
like image 42
joniba Avatar answered Sep 25 '22 17:09

joniba