Joseph Hwang
Joseph Hwang

Reputation: 1421

MySQL connection failed between 2 pods in kubernetes

I am a newbie on Kubernetes and try to generate 2 pods including front-end application and back-end mysql. First I make a yaml file which contains both application and mysql server like below,

apiVersion: v1
kind: Pod
metadata:
  name: blog-system
spec:
  containers:
  - name: blog-app
    image: blog-app:latest
    imagePullPolicy: Never 
    ports:
      - containerPort: 8080
    args: ["-t", "-i"]
    link: blog-mysql
  - name: blog-mysql
    image: mysql:latest
    env:
      - name: MYSQL_ROOT_PASSWORD
        value: password
      - name: MYSQL_PASSWORD
        value: password
      - name: MYSQL_DATABASE
        value: test
    ports:
      - containerPort: 3306

The mysql jdbc url of front-end application is jdbc:mysql://localhost:3306/test. And pod generation is successful. The application and mysql are connected without errors. And this time I seperate application pod and mysql pod into 2 yaml files.

== pod-app.yaml

apiVersion: v1
kind: Pod
metadata:
  name: blog-app
spec:
  selector:
    app: blog-mysql
  containers:
  - name: blog-app
    image: app:latest
    imagePullPolicy: Never
    ports:
      - containerPort: 8080
    args: ["-t", "-i"]
    link: blog-mysql

== pod-db.yaml

apiVersion: v1
kind: Pod
metadata:
  name: blog-mysql
  labels: 
    app: blog-mysql
spec:
  containers:
  - name: blog-mysql
    image: mysql:latest
    env:
      - name: MYSQL_ROOT_PASSWORD
        value: password
      - name: MYSQL_PASSWORD
        value: password
      - name: MYSQL_DATABASE
        value: test
    ports:
      - containerPort: 3306

But the front-end application can not connect to mysql pod. It throws the connection exceptions. I am afraid the mysql jdbc url has some incorrect values or the yaml value has inappropriate values. I hope any advices.

Upvotes: 1

Views: 1678

Answers (3)

Tummala Dhanvi
Tummala Dhanvi

Reputation: 3380

Pods created will have dns configured in the following manner

pod_name.namespace.svc.cluster.local

In your case assuming these pods are in default namespace your jdbc connection string will be

jdbc:mysql://blog-mysql.default.svc.cluster.local:3306/test

Refer: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods

Like Arghya Sadhu and Sachin Arote suggested you can always create a service and deployment. Service and deployment helps you in the cases where you have more than one replicas of pods and service takes care of the load-balancing.

Upvotes: 0

Sachin Arote
Sachin Arote

Reputation: 1017

For this you need to write service for exposing the db pod. There are 4 types of services.

  1. ClusterIP

  2. NodePort

  3. LoadBalancer

  4. ExternalName

Now you need only inside the cluster then use ClusterIP For reference use following yaml file.

kind: Service
apiVersion: v1
metadata:
 name: mysql-svc
spec:
  type: ClusterIP
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: blog-mysql

Now you will be access this pod using mysql-svc:3306 Refer this in blog-app yaml with

    env:
      - name: MYSQL_URL
        value: mysql-svc
      - name: MYSQL_PORT
        value: 3306

For more info use Url :https://kubernetes.io/docs/concepts/services-networking/service/

Upvotes: 1

Arghya Sadhu
Arghya Sadhu

Reputation: 44549

In the working case since same pod has two containers they are able to talk using localhost but in the second case since you have two pods you can not use localhost anymore. In this case you need to use the pod IP of the mysql pod in the frontend application. But problem with using POD IP is that it may change. Better is to expose mysql pod as service and use service name instead of IP in the frontend application. Check this guide

Upvotes: 3

Related Questions