Wiki.Pilas.Guru

6. Almacenamiento persistente

Comprobar StorageClass

kubectl get storageclass

En Minikube debe existir una StorageClass standard normalmente marcada como default.

Crear el PVC

Crear k8s/04-db-pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongo-data
  namespace: mern
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Aplicar:

kubectl apply -f k8s/04-db-pvc.yaml
kubectl get pvc -n mern

El PVC debe quedar en estado Bound.

Montar el PVC en MongoDB

En el contenedor de MongoDB añadir:

          volumeMounts:
            - name: mongo-data
              mountPath: /data/db

En spec.template.spec, al mismo nivel que containers, añadir:

      volumes:
        - name: mongo-data
          persistentVolumeClaim:
            claimName: mongo-data

Aplicar:

kubectl apply -f k8s/01-db-api.yaml
kubectl rollout status deployment/db -n mern

Probar persistencia

Crear un registro desde la aplicación y eliminar el Pod de MongoDB:

kubectl delete pod -n mern -l app=db

Esperar el nuevo Pod:

kubectl wait \
  --for=condition=ready \
  pod \
  -l app=db \
  -n mern \
  --timeout=120s

El registro debe continuar existiendo.

Conceptos

Eliminar Pod       -> los datos sobreviven
Eliminar PVC       -> puede eliminarse el volumen y perderse la información

El PV creado por Minikube utiliza normalmente:

Reclaim Policy: Delete

No eliminar el PVC durante esta fase.

Pruebas a realizar

  1. Revisar el estado del PVC, el PV asociado y la StorageClass utilizada:

    kubectl get pvc,pv,storageclass -n mern
    kubectl describe pvc mongo-data -n mern
    
  2. Comprobar que el Pod de MongoDB tiene montado el volumen en /data/db:

    kubectl describe pod -n mern -l app=db
    kubectl exec -n mern deploy/db -- mount | grep /data/db
    
  3. Revisar qué volumen está usando el Pod:

    kubectl get pod -n mern -l app=db \
      -o jsonpath='{.items[0].spec.volumes[*].persistentVolumeClaim.claimName}'
    
  4. Crear o verificar un registro, eliminar el Pod de MongoDB y esperar su
    recreación. Después, comprobar que el registro sigue disponible:

    kubectl delete pod -n mern -l app=db
    kubectl wait --for=condition=ready pod -l app=db -n mern --timeout=120s
    kubectl logs deployment/db -n mern
    

    La comprobación del registro se puede hacer desde mongosh o desde la API.

  5. Observar los eventos durante la recreación para relacionar el Pod con el
    volumen persistente:

    kubectl get events -n mern --sort-by=.lastTimestamp
    

No se debe eliminar el PVC como parte de esta prueba: con la política de
reclamación Delete, esa acción puede eliminar también el volumen asociado.

Aprendizajes del despliegue