Jason M
Jason M

Reputation: 1053

How can you connect to a database inside a k8 cluster that's behind a headless service?

given a database that is part of a statefulset and behind a headless service, how can I use a local client (outside of the cluster) to access the database? Is it possible to create a separate service that targets a specific pod by its stable id?

Upvotes: 1

Views: 749

Answers (1)

Harsh Manvar
Harsh Manvar

Reputation: 30160

There are multiple ways you can conect to this database service

You can use

Port-forward : https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/

Service as LoadBalancer : https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer

Service as Nodeport : https://kubernetes.io/docs/concepts/services-networking/service/#nodeport

Example MySQL database running on K8s : https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
          # Use secret in real usage
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

The easiest way is to try with port-forwarding :

kubectl port-forward -n <NAMESPACE Name> <POD name> 3306:3306

using the above command you can create the proxy from local to K8s cluster and test the localhost:3306

This is not a method for Prod use case it's can be used for debugging.

NodePort : Expose the port but use the worker node IPs so if worker not get killed during autoscaling IP may changed with time

I would recommend creating a new service with the respective label and type as LoadBalancer.

Upvotes: 4

Related Questions