Saltar al contenido

Kubernetes: Guía para Utilizar Correctamente la Persistencia

  • por

La persistencia en Kubernetes puede parecer complicada al principio, pero es esencial para garantizar que tus datos estén seguros y disponibles, incluso cuando tus contenedores se reinician o se trasladan a diferentes nodos. En esta guía, te explicaré paso a paso cómo configurar la persistencia en Kubernetes, usando ejemplos claros y detallados.

¿Qué es la Persistencia en Kubernetes?

En Kubernetes, la persistencia se refiere a la capacidad de mantener datos a través de reinicios de contenedores y mover estos datos entre diferentes nodos del clúster. Sin persistencia, los datos almacenados en un contenedor se perderían cuando este se apague o se reinicie.

Volúmenes en Kubernetes

Un volumen en Kubernetes es similar a un volumen en Docker: es una forma de montar un directorio (desde el host o un sistema de almacenamiento externo) dentro de un contenedor. Sin embargo, Kubernetes ofrece más tipos de volúmenes y opciones de configuración.

Ejemplo de Volumen Simple

apiVersion: v1
kind: Pod
metadata:
  name: simple-pod
spec:
  containers:
  - name: mycontainer
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: html-volume
  volumes:
  - name: html-volume
    emptyDir: {}

En este ejemplo, hemos definido un pod con un contenedor que utiliza la imagen de nginx. Hemos montado un volumen vacío (emptyDir) en /usr/share/nginx/html, donde emptyDir significa que el volumen será creado cuando el pod sea asignado a un nodo y se eliminará cuando el pod se elimine.

HostPath: El Equivalente a Bind Mounts de Docker

Para los que están acostumbrados a los bind mounts de Docker, Kubernetes ofrece una opción similar llamada hostPath. Esto permite montar un directorio o archivo del sistema de archivos del nodo (host) en el que se está ejecutando el pod.

Ejemplo de hostPath

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  containers:
  - name: mycontainer
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: html-volume
  volumes:
  - name: html-volume
    hostPath:
      path: /data/html
      type: Directory

Aquí, el volumen hostPath monta el directorio /data/html del host en /usr/share/nginx/html del contenedor. Esto puede ser útil para acceder a archivos específicos del host, pero se debe usar con precaución debido a posibles implicaciones de seguridad y portabilidad.

Persistent Volumes (PV) y Persistent Volume Claims (PVC)

Para una persistencia más robusta y flexible, Kubernetes utiliza Persistent Volumes (PV) y Persistent Volume Claims (PVC).

¿Qué es un Persistent Volume (PV)?

Un PV es un recurso de almacenamiento en el clúster que existe independientemente de los pods. Los administradores de clúster crean PVs y los usuarios los consumen mediante Persistent Volume Claims (PVC).

Ejemplo de Persistent Volume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data/pv-example"

En este ejemplo, hemos definido un PV llamado pv-example con una capacidad de 10GiB. El accessModes está configurado en ReadWriteOnce, lo que significa que solo un nodo puede montar el volumen en modo lectura/escritura a la vez. El volumen está respaldado por el directorio /mnt/data/pv-example en el host.

¿Qué es un Persistent Volume Claim (PVC)?

Un PVC es una solicitud de almacenamiento por parte de un usuario. Similar a cómo los pods consumen recursos del nodo, los PVCs consumen PVs disponibles.

Ejemplo de Persistent Volume Claim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

En este ejemplo, hemos definido un PVC llamado pvc-example que solicita 10GiB de almacenamiento con acceso ReadWriteOnce.

Usando PVCs en Pods

Para usar un PVC en un pod, simplemente lo referenciamos en la configuración del volumen del pod.

Ejemplo de Pod Usando PVC

apiVersion: v1
kind: Pod
metadata:
  name: pvc-pod
spec:
  containers:
  - name: mycontainer
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: html-volume
  volumes:
  - name: html-volume
    persistentVolumeClaim:
      claimName: pvc-example

Aquí, el pod pvc-pod monta el PVC pvc-example en /usr/share/nginx/html del contenedor nginx.

Configuración de la Base de Datos con Persistencia

Para aplicaciones como WordPress, no solo necesitas almacenamiento para los archivos de la aplicación, sino también para la base de datos.

Ejemplo Completo de MySQL Deployment y PVC

Deployment para MySQL

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_DATABASE
          value: exampledb
        - name: MYSQL_USER
          value: exampleuser
        - name: MYSQL_PASSWORD
          value: examplepass
        - name: MYSQL_ROOT_PASSWORD
          value: somewordpress
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

Service para MySQL

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql

Persistent Volume y Persistent Volume Claim para MySQL

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data/mysql-pv"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Conclusión

La persistencia en Kubernetes es crucial para asegurar que los datos de tus aplicaciones sean duraderos y estén siempre disponibles. Ya sea utilizando volúmenes simples, hostPath, Persistent Volumes (PV), o Persistent Volume Claims (PVC), Kubernetes te ofrece una gran flexibilidad y control. Con esta guía, ahora tienes los conocimientos necesarios para implementar una estrategia de persistencia efectiva en tu clúster de Kubernetes, asegurando que tus aplicaciones puedan gestionar y proteger sus datos adecuadamente.

Join the conversation

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *