How to make My Sql Pod to save data in Persistent Volume

2/10/2022

I started to use Kubernetes to understant concepts like pods, objects and so on. I started to learn about Persistent Volume and Persistent Volume Claim, from my understanding, if i save data from mysql pod to a persistent volume, the data is saved no matter if i delete the mysql pod, the data is saved on the volume, but i don't think it works in my case...

I have a spring boot pod where i save data in mysql pod, data is saved, i can retreived, but when i restart my pods, delete or replace them, that saved data is lost, so i think i messed up something, can you give me a hint, please? Thanks...

Bellow are my Kubernetes files:

  • Mysql pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels: #must match Service and DeploymentLabels
        app: mysql
    spec:
      containers:
        - image: mysql:5.7
          args:
            - "--ignore-db-dir=lost+found"
          name: mysql #name of the db
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-secret #name of the secret obj
                  key: password #which value from inside the secret to take
            - name: MYSQL_ROOT_USER
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: username
            - name: MYSQL_DATABASE
              valueFrom:
                configMapKeyRef:
                  name: db-config
                  key: name
          ports:
            - containerPort: 3306
              name: mysql
        volumeMounts: #mount volume obtained from PVC
          - name: mysql-persistent-storage
            mountPath: /var/lib/mysql #mounting in the container will be here


  volumes:
    - name: mysql-persistent-storage #obtaining volume from PVC
      persistentVolumeClaim:
        claimName: mysql-pv-claim # can use the same claim in different pods

apiVersion: v1
kind: Service
metadata:
  name: mysql #DNS name
  labels:
    app: mysql
spec:
  ports:
    - port: 3306
      targetPort: 3306
  selector: #mysql pod should contain same label
    app: mysql
  clusterIP: None # we use DNS

Persistent Volume and Persistent Volume Claim files:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim #name of our pvc
  labels:
    app: mysql
spec:
  volumeName: host-pv #claim that volume created with this name
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 1Gi

apiVersion: v1 #version of our PV
kind: PersistentVolume #kind of obj we gonna create
metadata:
  name: host-pv # name of our PV
spec: #spec of our PV
  capacity: #size
    storage: 4Gi
  volumeMode: Filesystem #storage Type, File and Blcok
  storageClassName: standard
  accessModes:
    - ReadWriteOnce  # can be mount from multiple pods on a single nod, cam be use by multiple pods, multiple pods can use this pv but only from a single node
   # - ReadOnlyMany    #                                on multiple nodes
   # - WriteOnlyMany   #  doar pt multiple nods, nu hostPath type
  hostPath: #which type of pv
    path: "/mnt/data"
    type: DirectoryOrCreate
  persistentVolumeReclaimPolicy: Retain

My Spring book K8 file:

apiVersion: v1
kind: Service
metadata:
  name: book-service
spec:
  selector:
    app: book-example
  ports:
    - protocol: 'TCP'
      port: 8080
      targetPort: 8080
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: book-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: book-example
  template:
    metadata:
      labels:
        app: book-example
    spec:
      containers:
        - name: book-container
          image: cinevacineva/kubernetes_book_pv:latest
          imagePullPolicy: Always
      #    ports:
      #      - containerPort: 8080
          env:
            - name: DB_HOST
              valueFrom:
                configMapKeyRef:
                  name: db-config
                  key: host
            - name: DB_NAME
              valueFrom:
                configMapKeyRef:
                  name: db-config
                  key: name
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: db-user
                  key: username
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-user
                  key: password

#  & minikube -p minikube docker-env | Invoke-Expression    links docker images we create with minikube, nu mai trebe sa ppusham
-- MyProblems
docker
kubernetes
mysql
spring-boot
spring-cloud-kubernetes

1 Answer

2/11/2022

...if i save data from mysql pod to a persistent volume, the data is saved no matter if i delete the mysql pod, the data is saved on the volume, but i don't think it works in my case...

Your previous data will not be available when the pod switch node. To use hostPath you don't really need PVC/PV. Try:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  ...
spec:
  ...
  template:
    ...
    spec:
      ...
      nodeSelector:    # <-- make sure your pod runs on the same node
        <node label>: <value unique to the mysql node>
      volumes:         # <-- mount the data path on the node, no pvc/pv required.
      - name: mysql-persistent-storage
        hostPath:
          path: /mnt/data
          type: DirectoryOrCreate
      containers:
      - name: mysql
        ...
        volumeMounts:  # <-- let mysql write to it
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
  
-- gohm&#39;c
Source: StackOverflow