how to connect to outside world from container in Kubernetes

3/18/2020

I have a Kubernetes cluster and I want to connect to outside world from container in Kubernetes

For example, I have a database on remote server whose IP address is 10.1.1.111 and I can connect to it from my laptop.

Now I deploy my application in Kubernetes cluster on my laptop, the simplified structure is like:

      ------------------------------------------------------
     |   laptop                                             |
     |     ---------------- (Kubernetes) --------------     |
     |    |                                            |    |
     |    |            ------ deployment ------        |    |
     |    |           |  ------- pod --------  |       |    |       ---(remote server)---
     |    |           | |  -- contaniner --  | |       |    |      | (http://10.1.1.111) |
     |    |           | | |                | | |       |    |      |                     | 
user ----- ingress ---  | |      App       | | |-------------------       Database       |
     |    |           | | |________________| | |       |    |      |                     |
     |    |           |  ____________________  |       |    |      |_____________________|
     |    |            ________________________        |    |
     |    |____________________________________________|    |
      _______________________________________________________

If from my laptop, I can connect to remote server,

      ------------------------------------------------------
     |   laptop * ----------------------------------------------------------
     |     ---------------- (kubernete) ----------------    |               | 
     |    |                                            |    |               |  connect ok !
     |    |            ------ deployment ------        |    |               |
     |    |           |  ------- pod --------  |       |    |       ---(remote server)---
     |    |           | |  -- contaniner --  | |       |    |      | (http://10.1.1.111) |
     |    |           | | |                | | |       |    |      |                     | 
user ----- ingress ---  | |      App       | | |-------------------       Database       |
     |    |           | | |________________| | |       |    |      |                     |
     |    |           |  ____________________  |       |    |      |_____________________|
     |    |            ________________________        |    |
     |    |____________________________________________|    |
      _______________________________________________________

If I use eval $(minikube docker-env) to go inside Kubernetes cluster and do curl command, it can connect to remote server:

      ------------------------------------------------------
     |   laptop                                             |
     |     ---------------- (Kubernetes) --------------     |     connect ok !
     |    |                                         * ----------------
     |    |            ------ deployment ------        |    |         |
     |    |           |  ------- pod --------  |       |    |       ---(remote server)---
     |    |           | |  -- contaniner --  | |       |    |      | (http://10.1.1.111) |
     |    |           | | |                | | |       |    |      |                     | 
user ----- ingress ---  | |      App       | | |-------------------       Database       |
     |    |           | | |________________| | |       |    |      |                     |
     |    |           |  ____________________  |       |    |      |_____________________|
     |    |            ________________________        |    |
     |    |____________________________________________|    |
      _______________________________________________________

and then I use docker exec -it (docker id) /bin/bash then do curl, it cannot connect to remote server:

      ------------------------------------------------------
     |   laptop                                             |
     |     ---------------- (Kubernetes) ---------------    |
     |    |                                            |    |   cannot connect !
     |    |            ------ deployment ------        |    |
     |    |           |  ------- pod --------  |       |    |       ---(remote server)---
     |    |           | |  -- contaniner --  | |       |    |      | (http://10.1.1.111) |
     |    |           | | |               *----------------------> |                     | 
user ----- ingress ---  | |      App       | | |-------------------       Database       |
     |    |           | | |________________| | |       |    |      |                     |
     |    |           |  ____________________  |       |    |      |_____________________|
     |    |            ________________________        |    |
     |    |____________________________________________|    |
      _______________________________________________________

The following is my configuration for Kubernetes:

ingress-service:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - http:
        paths:
          - path: /?(.*)
            backend:
              serviceName: qs-ts-cluster-ip-service
              servicePort: 8092

ip-service:

apiVersion: v1
kind: Service
metadata:
  name: qs-ts-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: qs-service-ts
  ports:
    - port: 8092
      targetPort: 8092

deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: qs-service-ts-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: qs-service-ts
  template:
    metadata:
      labels:
        component: qs-service-ts
    spec:
      containers:
        - name: qs-service-ts
          image: app/image
          command: ["sbt"]
          args: ["runMain com.app.http.appService"]
          ports:
            - containerPort: 8092
      imagePullSecrets:
        - name: supersecret

Is there any good way I can connect to remote database from container in Kubernetes?

-- Aaron
docker
kubernetes

0 Answers