Despliega tu propio servidor de MinIO en Kubernetes: Almacenamiento S3-compat en tu VPS

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

  1. Guarda los fragmentos anteriores en ficheros yaml (pvc.yaml, deployment.yaml, service.yaml).
  2. Despliégalos en este orden:
    kubectl apply -f pvc.yaml
    kubectl apply -f deployment.yaml
    kubectl apply -f service.yaml
    
  3. 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!).
  4. ¡Crea tus buckets, sube archivos y conecta cualquier cliente compatible con S3!

Consejos extra y troubleshooting

  • ¿No puedes acceder? Abre los puertos 30090 y 30091 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.
Avatar

Por Mid