MySQL StatefulSet on Minikube, including:

This will give you a basic MySQL StatefulSet setup on Minikube, perfect for local dev/testing.

TrackKubernetes Learning Journey
Current SectionDeployments
Progress153 of 271

MySQL StatefulSet on Minikube, including:

  • Headless Service
  • StatefulSet
  • Persistent Volume Claim
  • Secret for root password

This will give you a basic MySQL StatefulSet setup on Minikube, perfect for local dev/testing.


Folder Structure

You can save all YAML in one file or separate like this:

mysql/
├── mysql-secret.yaml
├── mysql-service.yaml
├── mysql-statefulset.yaml

1. mysql-secret.yaml — Secret for Root Password

apiVersion: v1
kind: Secret
metadata:
  name: mysql-root-pass
type: Opaque
data:
  password: bXlzcWwxMjM=  # base64 for "mysql123"

You can generate your own password:

echo -n "yourpassword" | base64

2. mysql-service.yaml — Headless Service

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  clusterIP: None  # Important: Headless service
  selector:
    app: mysql

3. mysql-statefulset.yaml — StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql"
  replicas: 1  # Can be scaled later
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
              name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-root-pass
                  key: password
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
  volumeClaimTemplates:
    - metadata:
        name: mysql-persistent-storage
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

Apply the Setup on Minikube

Run these in order:

kubectl apply -f mysql-secret.yaml
kubectl apply -f mysql-service.yaml
kubectl apply -f mysql-statefulset.yaml

Check pods:

kubectl get pods

Check PVC:

kubectl get pvc

Access MySQL from Inside the Cluster

Create a temporary pod to connect:

kubectl run -it mysql-client --image=mysql:5.7 --rm --restart=Never -- bash

Inside the shell:

mysql -h mysql-0.mysql -u root -p
# Enter password: mysql123