Las aplicaciones necesitan guardar archivos: adjuntos, imágenes, backups, evidencias. El block storage (PVC) no es ideal para eso; el object storage sí lo es.
MinIO ofrece una API compatible con S3 dentro del clúster. Es ligero, corre en Kubernetes y escala con erasure coding.
Sello del curso: probado en Kubernetes 1.35 con MinIO Operator y Tenant de 4 servidores.
Object storage en 30 segundos
- Bucket: contenedor de objetos.
- Objeto: archivo + metadatos, accedido por clave.
- S3 API: HTTP con firma (SigV4).
- Presigned URL: URL temporal para subir/descargar sin credencial.
A diferencia de un PVC, no lo montas; la aplicación habla HTTP con el bucket. Esto facilita múltiples pods y acceso externo.
El Tenant MinIO
El operador crea un Tenant con N servidores. Cada servidor tiene su PVC; el conjunto forma un pool con erasure coding.
apiVersion: minio.min.io/v2
kind: Tenant
metadata:
name: portal-minio
namespace: portal
spec:
features:
bucketDNS: false
requestAutoCert: false
configuration:
name: minio-tenant-config
pools:
- name: pool-0
servers: 4
volumesPerServer: 1
volumeClaimTemplate:
metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: portal-nfs
resources:
requests:
storage: 10Gi
Con 4 servidores, MinIO usa erasure coding: tolera la pérdida de servidores/discos sin perder datos, siempre que haya quórum (mitad + 1).
Servicios típicos:
minio-s3(API S3, puerto 9000).minio(consola/API, según el manifiesto).portal-minio-hl(headless).
Credenciales: root no es para la aplicación
El operador crea un secret de root (minio-tenant-creds) con accesskey/secretkey. No uses root en la aplicación.
Crea usuarios/service accounts con policy mínima:
mc alias set local http://minio-s3:9000 "$ROOT_USER" "$ROOT_PASS"
mc admin user add local portal-backend '<secret-forte>'
mc admin policy attach local readwrite --user portal-backend
O service account (credencial vinculada a un usuario):
mc admin user svcacct add local portal-backend
Para producción, crea una policy restringida a los buckets necesarios (ej.: portal-storage, whatsapp-backup) en lugar de readwrite global.
El caso INF-SEC-01
Nuestra app usaba minioadmin como access/secret. La imagen nueva tenía un guard que rechaza credenciales default en producción. El deploy falló — y el guard tenía razón.
Lección: la aplicación nunca debe usar la credencial root de MinIO, y las credenciales default deben rotarse antes del deploy.
Buckets, versionado y lifecycle
mc mb local/portal-storage
mc version enable local/portal-storage
mc ilm add local/portal-storage --expiry-days 90
- Versionado: protege contra sobrescritura/borrado accidental.
- Lifecycle: mueve/expira objetos antiguos.
- Object lock/WORM: retención legal (compliance), cuando sea necesario.
Cada bucket tiene política. No hagas todo público; prefiere presigned URLs.
Acceso externo
Opciones:
- Ingress con path
/minio→ Service de MinIO. - Subdominio dedicado
minio.exemplo.com. - Acceso interno solo (la aplicación habla
http://minio-s3:9000).
Cuidado con la presigned URL: usa el endpoint configurado. Si el endpoint interno es minio-s3, la URL no funciona en el navegador. Configura la URL pública (MINIO_PUBLIC_URL) correctamente.
Laboratorio
- Comprueba el Tenant:
kubectl -n portal get tenant.minio.min.io
kubectl -n portal get pods -l v1.min.io/tenant=portal-minio
kubectl -n portal get pvc | grep minio
- Usa
mcdesde dentro de un pod MinIO:
kubectl -n portal exec portal-minio-pool-0-0 -c minio -- sh
mc --config-dir /tmp/.mc alias set local http://127.0.0.1:9000 "$ROOT_USER" "$ROOT_PASS"
mc --config-dir /tmp/.mc ls local
-
Crea un bucket y un usuario de aplicación con policy mínima.
-
Haz subir/descargar:
echo hello > /tmp/hello.txt
mc --config-dir /tmp/.mc cp /tmp/hello.txt local/portal-storage/
mc --config-dir /tmp/.mc cat local/portal-storage/hello.txt
- Genera una presigned URL y pruébala en el navegador.
Errores comunes
| Síntoma | Causa |
|---|---|
Tenant no queda Ready |
PVC, recurso, imagen o config |
ImagePullBackOff |
la imagen no está en el nodo/registry |
| App recibe 403 | policy/usuario incorrecto |
| Presigned URL no abre | endpoint público incorrecto |
| Console 404 en el Ingress | path rewrite incorrecto |
| Rendimiento malo | NFS lento o pocos discos |
Checklist
- [ ] Tenant con 4 servidores y PVCs Bound.
- [ ] Root creds fuera de la aplicación.
- [ ] Service account/policy mínima por app.
- [ ] Versionado/lifecycle definidos.
- [ ] Endpoint público y presigned URLs probados.
- [ ] Backup de los buckets (Velero o
mc mirror). - [ ] Rotación de credenciales documentada.
Glosario
- Tenant: recurso del MinIO Operator.
- erasure coding: redundancia por fragmentación.
- bucket: contenedor de objetos.
- presigned URL: URL firmada temporal.
- service account: credencial vinculada a un usuario MinIO.
- lifecycle: reglas de expiración/migración.
Siguiente
Ahora que tenemos base de datos y object storage, vamos a las colas y caché: RabbitMQ y Redis con quórum, sentinel y PDB.
Siguiente: Curso Kubernetes 17 — RabbitMQ y Redis: quórum, sentinel y PDB
Seguir leyendo
Lea también
ArmazenamentoManual LSI / Broadcom MegaRAID — MegaCli y StorCLI
Con esta guía, su equipo gana autonomía para diagnosticar rebuilds, resolver foreign configurations, gestionar BBU y CacheCade — con escenarios reales de producción documentados.
20 min de leitura
Nginx Cheatsheet
Guía de bolsillo con ejemplos listos para configurar Nginx en producción: desde instalación y virtual hosts hasta ajuste de rendimiento y resolución de problemas.
12 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa
Qué prometer, cómo medir y qué hacer cuando el error se dispara: SLI, SLO, presupuesto de error, alertas que despiertan a alguien y postmortem sin caza de brujas.
5 min de leitura
Comentarios
Aún sin comentarios
Sea el primero en compartir su opinión sobre este artículo.

Deje un comentario