MinIO
Dentro del mundo bare-metal solemos encontrar un gran problema: muchas aplicaciones son capaces de conectar a un almacén de objetos para gestionar sus archivos, pero la lista de compatibilidad suele quedarse en el AWS S3 y con suerte los similares del resto de clouds.
Así que tenemos tres opciones:
- No utilizar esas capacidades, lo que puede ser un gran impacto para nuestra infraestructura.
- Pasar por caja y utilizar AWS S3 o similar.
- Desplegar un clon de S3 que nos permita "engañar" al sistema, mientras mantenemos todo en la misma red.
La tercera opción es la más asequible y la que menos afecta a la infraestructura. Para ello tenemos a MinIO, un proyecto que replica todas las funcionalidades de AWS S3 dentro de nuestro clúster.
MinIO está pensado para desplegar un clúster masivo, así que lo configuraremos sin clúster y con requisitos mínimos.
Requisitos
MinIO requiere un volumen donde depositar los archivos. El uso que le daré no va a requerir mucha velocidad, pero es posible que requiera de espacio, así que lo montaré con NFS
.
La carpeta compartida se debe crear previamente.
Despliegue
Más detalles en Artifact Hub.
Añadimos el repositorio.
helm repo add minio-official https://charts.min.io
helm repo update
Creamos el namespace.
kubectl create namespace minio-mngmt
El volumen.
vi minio-pv.yaml
Lo configuramos para la carpeta NFS
.
apiVersion: v1
kind: PersistentVolume
metadata:
name: minio-nfs-pv
namespace: minio-mngmt
spec:
storageClassName: storage-nfs
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
nfs:
server: nas.domain.intranet
path: "/NFS_MinIO"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: minio-nfs-pvc
namespace: minio-mngmt
spec:
storageClassName: storage-nfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Gi
He asignado 50 GiB. Se deberá actualizar según la necesidad.
Aplicamos el volumen.
kubectl apply -f minio-pv.yaml
Creamos el fichero de configuración.
vi minio-values.yaml
Cambiamos el despliegue a modo standalone
, con una única replica y recursos limitados. Únicamente estará disponible en la intranet.
He habilitado también la consola para facilitarme la vida y no tener que configurarlo por comandos.
clusterDomain: domain.local
mode: standalone
replicas: 1
rootUser: admin
rootPassword: adminadmin
persistence:
existingClaim: minio-nfs-pvc
ingress:
enabled: true
ingressClassName: "nginx-intranet"
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/proxy-body-size: 500m
hosts:
- minio.domain.intranet
consoleIngress:
enabled: true
ingressClassName: "nginx-intranet"
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/proxy-body-size: 500m
hosts:
- minio-console.domain.intranet
resources:
requests:
limits:
cpu: 1
memory: 512Mi
La contraseña debe tener al menos 8 caracteres.
Ya que el fichero tiene contraseña, sería recomendable borrarlo después de desplegar.
He asignado al Ingress que permita subir ficheros de hasta 500 MiB debido a que el tamaño original suele ser demasiado pequeño para este tipo de servicios.
Desplegamos el servicio.
helm upgrade --install minio minio-official/minio \
-f minio-values.yaml \
--namespace minio-mngmt
Configuración
Tenemos dos URL, una es utilizada por los servicios compatibles con AWS S3 y la otra es únicamente para la gestión de MinIO, aunque también sirve como explorador de ficheros.
S3 funciona a través de buckets
, estos se acceden mediante paths (https://minio.domain.intranet/bucket1) o subdominios (https://bucket1.minio.domain.intranet). MinIO utiliza paths por defecto.
Si una aplicación nos obliga a utilizar el sistema de subdominio tendremos un problema. Habrá que añadir cada nombre de bucket al DNS y además generar un wildcard para el subdomino minio.domain.intranet
. Ya que los wildcard no aceptan 2 niveles de subdominio.
Sin entrar en muchos detalles, los bloques principales de la consola son los almacenes de datos llamados Buckets
y la gestión de usuarios o cuentas de servicio encontradas en Identity
. Debido a que según el uso que le demos la configuración y permisos variarán, habrá que ajustar MinIO según lo que necesitemos en cada momento.