<p>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...</p>
<p>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...</p>
<p>Bellow are my Kubernetes files:</p>
<ul>
<li>Mysql pod:</li>
</ul>
<hr />
<pre><code>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:
            - &quot;--ignore-db-dir=lost+found&quot;
          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
</code></pre>
<hr />
<pre><code>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
</code></pre>
<p>Persistent Volume and Persistent Volume Claim files:</p>
<pre><code>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
</code></pre>
<hr />
<pre><code>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: &quot;/mnt/data&quot;
    type: DirectoryOrCreate
  persistentVolumeReclaimPolicy: Retain
</code></pre>
<p>My Spring book K8 file:</p>
<pre><code>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

#  &amp; minikube -p minikube docker-env | Invoke-Expression    links docker images we create with minikube, nu mai trebe sa ppusham
</code></pre>

MyProblems
<p><code>...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...</code></p>
<p>Your previous data will not be available when the pod switch node. To use <code>hostPath</code> you don't really need PVC/PV. Try:</p>
<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  ...
spec:
  ...
  template:
    ...
    spec:
      ...
      nodeSelector:    # &lt;-- make sure your pod runs on the same node
        &lt;node label&gt;: &lt;value unique to the mysql node&gt;
      volumes:         # &lt;-- 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:  # &lt;-- let mysql write to it
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
  
</code></pre>
