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.