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.