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?