How can a Kubernetes pod connect to database which is running in the same local network (outside the cluster) as the host?

10,783

I just found out the issue is due to the K8s network conflict with the server local network (192.168.200.x) subnet.

During the K8s cluster initialization

kubadmin init --pod-network-cidr=192.168.0.0/16

The CIDR 192.168.0.0/16 IP range must be change to something else eg. 10.123.0.0/16
And this IP range must be also changed in the calico.yaml file before applying the Calico plugin:

# The default IPv4 pool to create on startup if none exists. Pod IPs will be
# chosen from this range. Changing this value after installation will have
# no effect. This should fall within `--cluster-cidr`.
  - name: CALICO_IPV4POOL_CIDR
    value: "10.123.0.0/16"

Can now ping and telnet server B after reset and re-init the K8s cluster with the different CIDR.

Share:
10,783

Related videos on Youtube

Wuahaha
Author by

Wuahaha

Updated on June 04, 2022

Comments

  • Wuahaha
    Wuahaha almost 2 years

    I have a Kubernetes cluster (K8s) running in a physical server A (internal network IP 192.168.200.10) and a PostgreSQL database running in another physical server B (internal network IP 192.168.200.20). How can my Java app container (pod) running in the K8s be able to connect to the PostgreSQL DB in server B?

    OS: Ubuntu v16.04 Docker 18.09.7 Kubernetes v1.15.4 Calico v3.8.2 Pod base image: openjdk:8-jre-alpine

    I have tried following this example to create a service and endpoint

    kind: Service
    apiVersion: v1
    metadata:
     name: external-postgres
    spec:
     ports:
     - port: 5432
       targetPort: 5432
    ---
    kind: Endpoints
    apiVersion: v1
    metadata:
     name: external-postgres
    subsets:
     - addresses:
         - ip: 192.168.200.20
       ports:
         - port: 5432
    

    And had my JDBC connection string as: jdbc:postgresql://external-postgres/MY_APPDB , but it doesn't work. The pod cannot ping server B or telnet the DB using the said internal IP or ping external-postgres service name. I do not wish to use "hostNetwork: true" or connect server B via a public IP.

    Any advice is much appreciated. Thanks.