Saltar al contenido principal
Version: 1.8.1

Instalando NFS en Swarm

Nota: los siguientes instructivos fueron testeados en servidores Debian 11.

Esta guía detalla la instalación y configuración de un servidor y un cliente NFS, explicando además cómo montar dichos volumenes en servicios de docker swarm.

A continuacion, se presuponen los siguientes 2 equipos como ejemplos:

  • 192.168.0.100 como server NFS
  • 192.168.0.101 como cliente NFS (quien a su vez es manager de un cluster docker swarm)

En el servidor de NFS (192.168.0.100)

1. Instalar el servicio de server NFS

apt update && apt install nfs-kernel-server

2. Creo el directorio que será compartido con el server cliente

mkdir -p /mnt/nfs_share
chown -R nobody:nogroup /mnt/nfs_share/

3. Asigno permisos de acceso

Los permisos para acceder al server NFS se gestionan desde /etc/exports (el cual puede ser modificado con su editor preferido)

Si se desea otorgar acceso a un solo cliente, se puede utilizar la siguiente sintaxis

echo "/mnt/nfs_share  IP_Cliente(rw,sync,all_squash,no_subtree_check)" >> /etc/exports
  • rw: Esta opción le otorga al cliente nfs el permiso de lectura y escritura sobre el volumen montado.
  • sync: Esta opción mantiene la sincronización de los cambios que se realicen a los archivos dentro del volumen NFS, lo que resulta en un entorno más estable y consistente.
  • no_subtree_check: Esta opción previene el chequeo del subtree (es un proceso donde el server nfs chequea si un archivo sigue disponible en cada pedido de un cliente). No agregar esta opción puede generar problemas en caso que un archivo sea renombrado mientras un cliente lo tiene abierto.
  • all_squash: Esta opción simplifica el control de acceso del cliente mappeando todos los UIDs y GIDs provenientes de distintos clientes a un mismo usuario y grupo anónimo (por defecto en debian: nobody:nogroup). Como contrapartida, al habilitar esta opción no es posible trackear el acceso a archivos del NFS vía UIDs específicos.

Ejemplo agregando nuestro servidor cliente 192.168.0.101:

echo "/mnt/nfs_share 192.168.0.101(rw,sync,all_squash,no_subtree_check)" >> /etc/exports

Para otorgar a diversos clientes, se puede agregar más de una linea:

/mnt/nfs_share  IP_Cliente_1 (rw,sync,all_squash,no_subtree_check)
/mnt/nfs_share IP_Cliente_2 (rw,sync,all_squash,no_subtree_check)
/mnt/nfs_share DNS_Cliente_3 (rw,sync,all_squash,no_subtree_check)

O si quiere simplemente puede agregar una subred.

Ejemplo en donde agregaríamos una subred de todos los equipos entre 192.168.0.0 a 192.168.0.255:

echo "/mnt/nfs_share 192.168.0.0/24(rw,sync,all_squash,no_subtree_check)" >> /etc/exports

4. Exporto el directorio y aplico los cambios

exportfs -a
systemctl restart nfs-kernel-server

En los clientes (192.168.0.101)

1. Instalo el servicio necesario para montar NFS

apt update && apt install nfs-common

2. Crear el o los directorios donde montar las carpetas NFS

En este ejemplo, se montará todo sobre /mnt/nfs_clientshare

mkdir -p /mnt/nfs_clientshare

3. Montar las carpetas compartidas del servidor NFS al cliente

mount 192.168.0.100:/mnt/nfs_share /mnt/nfs_clientshare # (reemplazo la IP)

Ya tenemos un NFS funcionando.

Para más información les dejamos los siguientes links

NFS dentro de docker/docker swarm

Para configurar el volumen de NFS como volumen en alguno de nuestros contenedores, tenemos que asegurarnos de especificar la informacion correcta en el YAML correspondiente.

Siguiendo los equipos brindados como ejemplo a lo largo de la guía, el siguiente es un archivo YAML para desplegar un servicio de nginx en el cliente de NFS (192.168.0.101), que monta la carpeta /mnt/nfs_share del servidor NFS (192.168.0.100) en un directorio interno del contenedor /usr/local/app/nfs.

version: '3.8'
services:
test:
image: nginx
volumes:
- volume_nginx:/usr/local/app/nfs # Especifica dónde se montara el directorio nfs DENTRO del contenedor.

volumes:
volume_nginx:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=192.168.0.100,rw # Reemplazar la IP de addr con la IP o DNS del servidor NFS.
device: ":/mnt/nfs_share" # Especifica el PATH del directorio montado en el servidor NFS

Lectura sugerida:

Tutorial NFS debian digital ocean Docker Swarm persistent storage using NFS Documentacion Oficial Docker volume create Properly set permissions for NFS folder
Tutorial NFS en Ubuntu