Despliega tu propio servidor de MinIO en Kubernetes: Almacenamiento S3-compat en tu VPS
Nivel de dificultad: Intermedio
¿Echas de menos un almacenamiento S3, pero no quieres depender de Amazon ni de servicios de terceros? Hoy vamos a desplegar MinIO en tu clúster de Kubernetes sobre un VPS, ideal para proyectos personales, devops domésticos o necesidades de almacenamiento en tu nube privada.
¿Qué es MinIO y para qué sirve?
MinIO es un servidor de almacenamiento de objetos altamente compatible con la API S3 de AWS, open source y súper ligero. Perfecto para:
- Respaldar archivos y bases de datos.
- Servir assets estáticos en tus aplicaciones.
- Guardar logs u otros datos generados en tu infraestructura.
- Laboratorios de pruebas con S3 en local.
Lo mejor: instalable en cualquier VPS donde puedas desplegar Kubernetes, y administrable vía consola web.
Arquitectura del despliegue: servicios y persistencia
En este ejemplo, desplegaremos MinIO en un Deployment con 1 pod, una PersistentVolumeClaim para mantener los datos entre reinicios y un Service tipo NodePort para entrar desde fuera de nuestro clúster.
Archivos yaml
necesarios
1. PersistentVolume y PersistentVolumeClaim
El primer paso, reservar espacio en disco. Si estás en un entorno de pruebas (como minikube o kind), puedes usar el provisionamiento dinámico de Kubernetes. Si no, crea el PersistentVolume
apuntando al path real en tu VPS.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minio-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
2. Deployment de MinIO
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
spec:
replicas: 1
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: minio/minio:latest
args:
- server
- /data
env:
- name: MINIO_ROOT_USER
value: minioadmin
- name: MINIO_ROOT_PASSWORD
value: supersecretpassword
ports:
- containerPort: 9000
- containerPort: 9090
volumeMounts:
- name: storage
mountPath: /data
volumes:
- name: storage
persistentVolumeClaim:
claimName: minio-pvc
3. Service NodePort
apiVersion: v1
kind: Service
metadata:
name: minio-service
spec:
type: NodePort
ports:
- port: 9000
targetPort: 9000
nodePort: 30090
name: api
- port: 9090
targetPort: 9090
nodePort: 30091
name: console
selector:
app: minio
Esto abrirá la API S3
en http://[VPS]:30090
y la consola web en http://[VPS]:30091
.
Despliegue paso a paso
- Guarda los fragmentos anteriores en ficheros yaml (
pvc.yaml
,deployment.yaml
,service.yaml
). - Despliégalos en este orden:
kubectl apply -f pvc.yaml kubectl apply -f deployment.yaml kubectl apply -f service.yaml
-
Accede a la consola web desde tu navegador en
http://[tu IP del VPS]:30091
.
Usuario:minioadmin
, Contraseña:supersecretpassword
(¡Modifica esto en producción!). - ¡Crea tus buckets, sube archivos y conecta cualquier cliente compatible con S3!
Consejos extra y troubleshooting
- ¿No puedes acceder? Abre los puertos
30090
y30091
en el firewall del VPS (ufw
,firewalld
o el que uses). - Persistencia real: Si tu VPS tiene almacenamiento dedicado, mapea el
PersistentVolume
a una carpeta física real fuera del contenedor para no perder los datos. - SSL Let’s Encrypt: Frontéalos con un Ingress y cert-manager para disfrutar de HTTPS gratuito (pregúntame en comentarios si quieres ejemplo con Ingress y TLS).
- Escalado: Para alta disponibilidad, consulta la guía oficial sobre el operador de MinIO y despliegue en modo distribuido.