Kubernetes connect to external MongoDB

3/26/2020

I have a spring boot application that is running on the Kubernetes cluster (GKE) and I have a DB which is on an instance in the same VPC as Kubernetes cluster. I have configured this as mentioned here. But I am unable to connect to the DB. Gives below error on starting the application

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.net.SocketTimeoutException: connect timed out
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na]
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na]
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) ~[na:na]
    at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
    at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongodb-driver-core-3.4.3.jar!/:na]
    ... 3 common frames omitted

Also I tried pinging the db from the docker container using service name

bash-5.0# ping mongodb
PING mongodb (10.64.2.221): 56 data bytes

When I tried directly pinging using the instance internal ip address, I am able to ping the address but when I tried using the ip address from the application (spring.data.mongodb.host), it didn't work either.

bash-5.0# ping 10.60.0.13
PING 10.60.0.13 (10.60.0.13): 56 data bytes
64 bytes from 10.60.0.13: seq=0 ttl=62 time=1.317 ms
64 bytes from 10.60.0.13: seq=1 ttl=62 time=0.315 ms
64 bytes from 10.60.0.13: seq=2 ttl=62 time=0.385 ms
64 bytes from 10.60.0.13: seq=3 ttl=62 time=0.278 ms
64 bytes from 10.60.0.13: seq=4 ttl=62 time=0.300 ms

Mongo Service YAML

---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  ports:
  - port: 27017
    targetPort: 27017
---
kind: Endpoints
apiVersion: v1
metadata:
  name: mongodb
subsets:
  - addresses:
      - ip: 10.164.0.1
    ports:
      - port: 27017

Deployment YAML

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: test-service
    spec:
    replicas: 1
    selector:
        matchLabels:
        app: test-service
    template: 
        metadata:
        labels:
            app: test-service
        spec:
        containers:
            - name: test-service
            image: gcr.io/rrr-test-project/test-service:latest
            ports:
            - containerPort: 8080
            env:
            - name: MONGO_HOST
                value: mongodb

application.yml in Spring application

spring:
  # Database
  data:
    mongodb:
      host: ${MONGO_HOST:10.164.0.1}
      port: 27017
      database: test
-- rohit
google-kubernetes-engine
kubernetes
mongodb
spring-boot

0 Answers