How do I access MySQL as a Service on Kubernetes?

7/14/2019

I have the following deployment...

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-data-disk
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: "/var/lib/mysql"
              subPath: "mysql"
              name: mysql-data
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: ROOT_PASSWORD
      volumes:
        - name: mysql-data
          persistentVolumeClaim:
            claimName: mysql-data-disk

This works great I can access the db like this...

kubectl exec -it mysql-deployment-<POD-ID> -- /bin/bash

Then I run...

mysql -u root -h localhost -p

And I can log into it. However, when I try to access it as a service by using the following yaml...

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306

I can see it by running this kubectl describe service mysql-service I get...

Name:              mysql-service
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"mysql-service","namespace":"default"},"spec":{"ports":[{"port":33...
Selector:          app=mysql
Type:              ClusterIP
IP:                10.101.1.232
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         172.17.0.4:3306
Session Affinity:  None
Events:            <none>

and I get the ip by running kubectl cluster-info

#kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

but when I try to connect using Oracle SQL Developer like this...

enter image description here

It says it cannot connect.

enter image description here

How do I connect to the MySQL running on K8s?

-- Jackie
kubernetes
mysql

2 Answers

7/14/2019

Service type ClusterIP will not be accessible outside of Pod network. If you don't have LoadBalancer option, then you have to use either Service type NodePort or kubectl port-forward

-- Ansil
Source: StackOverflow

7/14/2019
  1. You need your mysql service to be of Type NodePort instead of ClusterIP to access it outside Kubernetes.

  2. Use the Node Port in your client config

Example Service:

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      nodePort: 30036
      targetPort: 3306

So then you can use the port: 30036 in your client.

-- Ijaz Ahmad Khan
Source: StackOverflow