<p>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? </p>

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

<p>I have tried following <a href="https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-mapping-external-services" rel="nofollow noreferrer">this example</a> to create a service and endpoint</p>

<pre><code>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
</code></pre>

<p>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.</p>

<p>Any advice is much appreciated. Thanks.</p>

<p>I just found out the issue is due to the K8s network conflict with the server local network (192.168.200.x)
subnet.<br><br>
During the K8s cluster initialization 
<br><br>
<code>kubadmin init --pod-network-cidr=192.168.0.0/16</code>
<br><br>
The <strong>CIDR 192.168.0.0/16</strong> IP range must be change to something else eg. 10.123.0.0/16
<br>
And this IP range must be also changed in the calico.yaml file before applying the Calico plugin:</p>

<pre><code># 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"
</code></pre>

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