Almacenamiento compartido con LVM sobre iSCSI en Proxmox VE (Parte I)

Saludos nuevamente.

Como está reflejado en la Wiki de Proxmox, el tipo de almacenamiento compartido que se debe utilizar en un clúster Proxmox de dos nodos es el DRBD. No obstante, en este anexo se describe cómo utilizar un almacenamiento compartido basado en un dispositivo de bloques iSCSI exportado por una NAS/SAN o equipo con GNU/Linux.

Primero que todo, hay que saber qué cosa es iSCSI. Tomado de Wikipedia:

¿Qué es iSCSI?

iSCSI (Abreviatura de Internet SCSI) es un estándar que permite el uso del protocolo SCSI sobre redes TCP/IP. iSCSI es un protocolo de la capa de transporte definido en las especificaciones SCSI-3. Otros protocolos en la capa de transporte son SCSI Parallel Interface y canal de fibra.

La adopción del iSCSI en entornos de producción corporativos se ha acelerado en estos momentos gracias al aumento del Gigabit Ethernet. La fabricación de almacenamientos basados en iSCSI (red de área de almacenamiento) es menos costosa y está resultando una alternativa a las soluciones SAN basadas en Canal de fibra.

Funcionalidad de iSCSI

El protocolo iSCSI utiliza TCP/IP para sus transferencias de datos. Al contrario que otros protocolos de red diseñados para almacenamiento, como por ejemplo el canal de fibra (que es la base de la mayor parte de las redes de áreas de almacenamiento), solamente requiere una simple y sencilla interfaz Ethernet (o cualquier otra red compatible TCP/IP) para funcionar. Esto permite una solución de almacenamiento centralizada de bajo coste sin la necesidad de realizar inversiones costosas ni sufrir las habituales incompatibilidades asociadas a las soluciones canal de fibra para redes de área de almacenamiento.

Los críticos de iSCSI argumentan que este protocolo tiene un peor rendimiento que el canal de fibra ya que se ve afectado por la sobrecarga que generan las transmisiones TCP/IP (cabeceras de paquetes, por ejemplo). Sin embargo las pruebas que se han realizado muestran un excelente rendimiento de las soluciones iSCSI SANs, cuando se utilizan enlaces Gigabit Ethernet.

Dispositivos de almacenamiento

En el contexto de almacenamiento, iSCSI permite a un ordenador utilizar un iniciador iSCSI (initiator) para conectar a un dispositivo SCSI (target) como puede ser un disco duro o una cabina de cintas en una red IP para acceder a los mismos a nivel de bloque. Desde el punto de vista de los drivers y las aplicaciones de software, los dispositivos parecen estar conectados realmente como dispositivos SCSI locales. Los entornos más complejos, consistentes en múltiples hosts y/o dispositivos son llamados redes de área de almacenamiento.

Los dispositivos iSCSI no deben ser confundidos con los dispositivos Network-Attached Storage (NAS), los cuales incluyen software en el servidor para controlar las peticiones de acceso simultáneo desde los diferentes hosts. Sin embargo, en la actualidad muchos NAS tienen capacidades de generar iSCSI LUN con sus respectivos Targets asociados. Permitir que múltiples hosts tengan acceso simultáneo a un dispositivo único es una tarea difícil pero muy común en los dispositivos SCSI. Sin comunicación host-a-host, cada uno de los hosts desconoce cuáles son las intenciones del resto de los hosts en la red.

Distribuciones que se pueden utilizar como SAN/NAS

Existen varias distribuciones en la comunidad Open-Source que pueden servir como SAN/NAS, estás son algunas de ellas:

  • Red Hat y derivados (CentOS)
  • Debian
  • FreeNAS (basada en distribuciones de la rama FreeBSD)
  • NAS4Free (basada en distribuciones de la rama FreeBSD)
  • OpenMediaVault (basada en Debian, pero un poco limitada en cuanto a servicios de almacenamiento en red)
  • NexentaStor Community (basada en Solaris de SUN/Oracle), distribución gratuita limitada a 18 TB de capacidad máxima en bruto (RAW).

 

En este apartado se ejemplificarán con tres de las distribuciones antes mencionadas: GNU/Linux Debian 7.0, NAS4Free 9.2.0.1.972 y NexentaStor Community 4.02. La infraestructura de red que se utilizará es la siguiente:

  • Red de Gestión de los hipervisores y servidor(es) SAN/NAS: 192.168.137.0/24
  • Subred 1 de Almacenamiento en Red (Red SAN): 10.0.0.0/29
  • Subred 2 de Almacenamiento en Red (Red SAN): 10.0.1.0/29

 

O sea, cada hipervisor tendrá dos conexiones diferentes al área de almacenamiento o servidor SAN/NAS. Esto se utilizará para la parte de la configuración de multipathing de iSCSI, pero por ahora se utilizará una sola conexión.

Configuración del Target iSCSI

A continuación se mostrará la configuración del Target iSCSI en algunas distribuciones, donde cada cual tiene sus similitudes y diferencias. Las que cuentan con una interfaz gráfica para la gestión de los dispositivos de almacenamiento en red son mucho más fáciles de configurar que las que son mediante la interfaz de línea de comandos (CLI).

A medida que se vayan configurando los diferentes tipos de SAN/NAS con el Target iSCSI, se irán añadiendo a este manual. El identificador que se utilizará será
iqn.2014-09.codesa.co.cu y se creará un LUN a exportar en cada ejemplo. El nombre de dicho LUN será storage.lun0. En el clúster de hipervisores se irá añadiendo y quitando el almacenamiento compartido basado en iSCSI a medida que se vayan probando los ejemplos.

GNU/Linux Debian 7.0

Configurar un Target iSCSI en GNU/Linux Debian no es algo difícil. Lo primero que hay que hacer es configurar las interfaces de red y la visibilidad entre el servidor SAN/NAS y los demás equipos, ya sea por nombres FQDN, aliases de los mismos, o por direcciones IP (en otras palabras, teniendo o un servidor DNS bien configurado o el archivo /etc/hosts de cada elemento de la granja de servidores con los datos básicos bien establecidos).

En el caso de usar el archivo /etc/hosts para la resolución básica de nombres FQDN, aliases y direcciones IP, el contenido sería el siguiente (las direcciones que aparecen aquí pueden ser adaptadas al escenario que se tenga):

127.0.0.1        localhost.localdomain        localhost

192.168.137.140    san.red.codesa.co.cu        san
10.0.0.3        san.red.codesa.co.cu        san
10.0.1.3        san.red.codesa.co.cu        san

192.168.137.130    prx-c0-1.red.codesa.co.cu    prx-c0-1
192.168.137.131    prx-c0-2.red.codesa.co.cu    prx-c0-2

10.0.0.1        prx-c0-1.red.codesa.co.cu    prx-c0-1
10.0.1.1        prx-c0-1.red.codesa.co.cu    prx-c0-1

10.0.0.2        prx-c0-2.red.codesa.co.cu    prx-c0-2
10.0.1.2        prx-c0-2.red.codesa.co.cu    prx-c0-2

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Luego de probar la conectividad y visibilidad en red (haciendo ping a los nombres de los servidores), se pasa al plato fuerte: configurar el Target iSCSI.

Primero que todo hay que instalar los paquetes:

# apt-get install iscsitarget iscsitarget-dkms

Luego abrir el archivo /etc/default/iscsitarget con el editor que se desee y establecer a “true” el valor del parámetro ISCSITARGET_ENABLE, o sea:

ISCSITARGET_ENABLE=true

Esto hará que, cuando el sistema inicie, el servicio “iSCSI Target” se cargue automáticamente.

Como dispositivo base del almacenamiento a exportar (LUN) se pueden escoger, por ejemplo, volúmenes lógicos LVM que no se estén usando, archivos imágenes (dispositivos cíclicos o de tipo loop), discos duros completos (/dev/sdc), particiones de discos duros (/dev/sdc1) o dispositivos RAID por software (/dev/md0), etc. En este caso se escogerá un disco duro de 80 GB (/etc/sdb) completo. No obstante, si fuese una partición de un disco duro, claro está que debe estar previamente creada.

NOTA: Si se desea usar un archivo imagen, hay que crearlo de la siguiente manera:

# mkdir <Ruta donde estará el archivo imagen>
# dd if=/dev/zero of=<Ruta donde estará el archivo imagen>/storage_lun0.img bs=1024k count=80000

Esto creará un archivo imagen de 80 GB.

El siguiente paso es editar el archivo /etc/iet/ietd.conf, pero antes se debe crear una copia del archivo original (por ejemplo /etc/iet/ietd.conf.orig) para luego modificarlo. Particularmente, yo elimino todo el contenido y empezar de cero la edición del archivo.

El nuevo contenido del archivo /etc/iet/ietd.conf es el siguiente:

Target iqn.2014-09.codesa.co.cu:storage.lun0
    Lun 0 Path=/dev/sdb,Type=fileio
    Alias LUN0
    MaxSessions 16
    MaxConnections 4

El nombre del Target debe ser un nombre único global, los estándares de iSCSI definen el iSCSI Qualified Name (Nombre Calificado de iSCSI) como sigue:

  • iqn.AAAA-MM.<Nombre de Dominio directo o a la inversa>[:Identificador]

 

En esta línea, AAAA-MM es la fecha en la cual es dominio es válido; el identificador es elegible a voluntad.

  • Lun 0 Path=/dev/sdb,Type=fileio

 

En esta línea se debe especificar el apuntador al dispositivo de bloques que exportará el Target (por ejemplo, /dev/sdb, storage.lun0.img, etc.).

  • Alias LUN0

 

En esta línea se establece el alias por el cual los iniciadores identificarán el dispositivo de almacenamiento o LUN que brida el Target.

  • MaxSessions 16

 

Aquí se establece la cantidad máxima de sesiones permitidas por el Target.

  • MaxConnections 4

Aquí se establece la cantidad máxima de conexiones por sesión por parte de los iniciadores al Target. Por defecto es 2.

Ahora hay que “decirle” al Target quienes serán los iniciadores que se conectarán al dispositivo iqn.2014-09.codesa.co.cu:storage.lun0 y de cuales subredes se van a realizar estas conexiones. Dichos iniciadores son los nodos del clúster Proxmox, con direcciones IP 10.0.0.1 y 10.0.0.2 (prx-c0-1.red.codesa.co.cu y prx-c0-2.red.codesa.co.cu).

La definición de los iniciadores que se van a conectar al Target se hace editando el archivo /etc/iet/initiators.allow y poniéndole el contenido siguiente:

iqn.2014-09.codesa.co.cu:storage.lun0    10.0.0.1, 10.0.0.2

Y las subredes desde donde se conectarán los mismos se definen dentro del archivo /etc/iet/targets.allow. El contenido es el siguiente:

iqn.2014-09.codesa.co.cu:storage.lun0    10.0.0.0/29

Hechos los cambios antes mencionados, se procede a iniciar el servicio:

# service iscsitarget start

Todas las operaciones que se realizan en el Target se guardan en el log del sistema operativo: /var/log/syslog.

En este punto solamente queda añadir el LUN del Target iSCSI en el clúster Proxmox.

NAS4Free 9.2.0.1.972

NAS4Free es una de las soluciones Open-Source de bajo costo para la creación de cabinas SAN/NAS de almacenamiento en red. Al igual que FreeNAS está basada en una distribución de la rama BSD.

La instalación de dicha distribución es relativamente fácil, no lleva mucho tiempo completar todo el proceso. Una vez completado tenemos un servidor de almacenamiento completamente funcional, al cual se puede acceder mediante su interfaz WEB. Las credenciales iniciales son:

  • Nombre de usuario: admin
  • Contraseña: nas4free

 

Claro está que estas credenciales por defecto pueden cambiarse.

Ahora bien, y ya entrando en materia, toca el turno de configurar el Target iSCSI y el dispositivo de bloques o LUN a exportar. Para ello hay que realizar varios pasos, estos son:

  1. Configurar las interfaces de red.
  2. Poner a punto el(los) disco(s) que será(n) exportado(s) (formateo al sistema de archivos ZFS, creado por la gente de Sun Microsystems [ahora de Oracle])
  3. Crear los Pools y Volúmenes ZFS.
  4. Configurar el servicio Target iSCSI y sus correspondientes LUNs.

De manera detallada, el proceso es así:

Configuración de las interfaces de red

NAS4Free nombra las interfaces de red de manera distinta a como lo hace GNU/Linux, o sea, la interfaz de red principal se nombra em0 (LAN), y si hay más de una, se nombran em1 (OPT1), em2 (OPT2), y así sucesivamente. Durante la instalación solicita cual de todas las interfaces de red será la principal, y una vez escogida, se le establece su dirección IP. Mediante el nombre FQDN establecido o la dirección IP es que se gestiona por WEB el servidor de almacenamiento:

http://<Nombre FQDN o Dirección IP>/

La primera página que se muestra es un resumen de los datos y funcionamiento del servidor. Estos son: el nombre de host, versión del software de almacenamiento y su fecha de emisión, el sistema operativo base o plataforma en la cual está soportado, información del tipo de hardware utilizado, tiempo de encendido del servidor, uso de recursos locales, etc.

NAS4Free - Ventana inicial

Evidentemente, tener un servidor DNS configurado y con sus datos bien establecidos es de mucha utilidad, dado que, una vez dentro de la interfaz de gestión del servidor, NAS4Free muestra un mensaje de error constante solicitando que se le indique la dirección IP del servidor de nombres.

Lo primero que hay que hacer es configurar las interfaces de red secundarias u opcionales.

Para ello, primeramente veremos todas las interfaces de red del servidor mediante la opción

Gestor de NAS4 Free —> Menú Principal —> Network —> Interface Management —> Management

Para saber cuántas tiene el servidor y la que se desee configurar.

NAS4Free - Network Interfaces - 1

Aquí vemos que, para el ejemplo en cuestión, se tienen 3 interfaces de red. Para configurar cada una de las interfaces opcionales se hace mediante la opción

Gestor de NAS4 Free —> Menú Principal —> Network —> OPT{1 | 2 | … | N}

Donde, 1, 2,…, N son la referencia a cada interfaz.

NAS4Free - Network Interfaces - 2

NAS4Free - Network Interfaces - 3

NOTA: Intencionalmente se crearon 2 interfaces de red opcionales para configurar más adelante la opción del multipathing de iSCSI para así no tener un único punto de fallo en la conectividad entre la SAN/NAS y los hipervisores. Por ahora solamente se utilizará una de las dos para configurar un solo portal, el cual es el que se configurará en el Proxmox.

Poner a punto el(los) disco(s) que será(n) exportado(s)

El siguiente paso es escoger cuál (o cuáles) de todos los discos duros físicos locales del servidor se utilizará(n) como LUN(s) de nuestro Target iSCSI. Inicialmente cada disco (excepto el del sistema operativo, claro está) no está formateado.

Gestor de NAS4 Free —> Menú Principal —> Disks à Management

NAS4Free - Disk - 1

NOTA: El disco duro principal, donde está instalado el sistema operativo del servidor de almacenamiento, tiene un sistema de archivo llamado UFS, que es un sistema de archivos nativo de FreeBSD.

Una vez escogido el disco, se procede a formatearlo, para esto hay que pulsar el ícono en forma de llave que está a la derecha de la referencia del disco y antes de la X en rojo, como se ve en la siguiente imagen:

NAS4Free - Disk - 2

Aquí sale una nueva página en la que se muestra el estado del disco escogido (no formateado aún).

NAS4Free - Disk - 3

Usando el menú de formateado se procede formatear el disco con el sistema de archivos ZFS, que es otro sistema de archivos nativo de FreeBSD.

NAS4Free - Disk - 4

Cuando termina de formatear el disco, es bueno echarle un vistazo al mensaje resultante, sobretodo en aviso que muestra en la última parte del mismo.

NAS4Free - Disk - 5

Y así ya el disco cambia de aspecto.

NAS4Free - Disk - 6

Crear los Pools y Volúmenes ZFS

Creadas las condiciones iniciales, se pasa a crear el(los) pool(s) y el(los) volumen(es) ZFS que servirá como dispositivo de bloques o LUN a exportar por el Target iSCSI.

El primer paso es crear el dispositivo virtual como se ve en la siguiente imagen. Esto se hace así:

Gestor de NAS4 Free —> Menú Principal —> Disks —> ZFS —> Pools —> Virtual device

NAS4Free - ZFS - 1 (Pools_Virtual-Device)

Luego aplicar los cambios hechos:

NAS4Free - ZFS - 2 (Pools_Virtual-Device)

NAS4Free - ZFS - 3 (Pools_Virtual-Device)

Ahora toca el turno al Pool ZFS. Para ello ir a

Gestor de NAS4 Free —> Menú Principal —> Disks —> ZFS —> Pools —> Management

NAS4Free - ZFS - 4 (Pools_Management)

Añadir el nuevo Pool ZFS y aplicar los cambios:

NAS4Free - ZFS - 5 (Pools_Management)

NAS4Free - ZFS - 6 (Pools_Management)

Ahora toca el turno a los volúmenes ZFS, esto se hace mediante la opción

Gestor de NAS4 Free —> Menú Principal —> Disks —> ZFS —> Volumes

NAS4Free - ZFS - 7 (Volumes_Volume)

Aquí se establece, entre otros parámetros, el nombre del volumen y su tamaño.

NAS4Free - ZFS - 8 (Volumes_Volume)

Aplicamos los cambios y tendremos el nuevo volumen:

NAS4Free - ZFS - 9 (Volumes_Volume)

Configurar el servicio Target iSCSI y sus correspondientes LUNs

Todas las condiciones están creadas para continuar con la tercera parte del proceso: configurar el Target iSCSI y el(los) correspondiente(s) LUN(s) a exportar.

Lo primero es iniciar el servicio Target iSCSI en el servidor mediante la opción:

Gestor de NAS4 Free —> Menú Principal —> Services —> iSCSI Target —> Settings

De ahí se muestra la página de configuración del Target:

NAS4Free - Services - iSCSI Target - 10 (Settings)

En ella se establece, entre otros parámetros, el valor del parámetro “Base Name”, que no es más que el identificador del Target iSCSI. El formato de este valor es el siguiente:

iqn.<Año en 4 dígitos>-<Mes en dos dígitos>.<Dominio local>

Por ejemplo, el caso que nos ocupa:

iqn.2014-09.codesa.co.cu

La mayoría de los valores de los otros parámetros (o todos los demás) se dejan por defecto.

Salvamos los cambios y reiniciamos el servicio:

NAS4Free - Services - iSCSI Target - 11 (Settings)

NAS4Free - Services - iSCSI Target - 12 (Settings)

Lo siguiente es crear el(los) LUN(s) a exportar. Con NAS4Free esto se hace en dos pasos, primero se crea el extent y luego el LUN. Para ello hay que ir a:

Gestor de NAS4 Free —> Menú Principal —> Services —> iSCSI Target —> Targets

Y para crear el extent hay que pinchar el signo “+” que está al final de la fila “Extent”.

NAS4Free - Services - iSCSI Target - 13 (Targets - Extents)

En la nueva página que se muestra, se puede añadir el nuevo extent especificando el valor “ZFS volume” al tipo de extent y luego  el volumen ZFS previamente creado.

NAS4Free - Services - iSCSI Target - 14 (Targets - Extents - Add)

Aplicamos los cambios…

NAS4Free - Services - iSCSI Target - 15 (Targets - Extents - Add)

Y tendremos el nuevo extent:

NAS4Free - Services - iSCSI Target - 16 (Targets - Extents - Add)

Antes de crear el LUN, cualquiera que este sea, se deben crear antes el(los) portal(es), que no son más que las direcciones IP que se pondrán a la escucha del puerto 3260 y los iniciadores (initiators) que se conectarán a los mismos. Para hacer lo primero, hay que ir a:

Gestor de NAS4 Free —> Menú Principal —> Services —> iSCSI Target —> Portals

NAS4Free - Services - iSCSI Target - 17 (Portal Group)

Y pulsar el botón “+” al final de la fila “Portal Group”. Ahí se muestra una nueva página, la cual presenta a todas las direcciones IP del servidor a la escucha del puerto 3260, de ellas retiramos la principal, dado que esa dirección IP está destinada a la gestión, no a proveer dispositivos de bloques, y una de las opcionales. Por lo tanto, la configuración del grupo de portales debe quedar así:

NAS4Free - Services - iSCSI Target - 18 (Portal Group - Add)

Aplicamos los cambios…

NAS4Free - Services - iSCSI Target - 19 (Portal Group - Add)

Y tendremos definidos el(los) grupo(s) de portales:

NAS4Free - Services - iSCSI Target - 20 (Portal Group - Add)

NOTA: Normalmente cuando se definen los portales, automáticamente se añaden las subredes de donde se conectarán los iniciadores. No sé por qué no se añadieron esta vez. De todas maneras, no está de más configurarlos.

Ahora, para definir a los iniciadores, hay que ir a la opción:

Gestor de NAS4 Free —> Menú Principal —> Services —> iSCSI Target —> Initiators

Y pulsar el botón “+” al final de la fila “Initiator Group”.

NAS4Free - Services - iSCSI Target - 26 (Initiators - Initiator Groups)

Y como se hizo para el caso de los portales, se debe retirar la subred donde está la dirección IP principal del servidor. Luego añadir el nuevo grupo de iniciadores:

NAS4Free - Services - iSCSI Target - 27 (Initiators - Initiator Groups)

Aplicamos los cambios…

NAS4Free - Services - iSCSI Target - 28 (Initiators - Initiator Groups)

Y tendremos el nuevo grupo de iniciadores definido:

NAS4Free - Services - iSCSI Target - 29 (Initiators - Initiator Groups)

Y llegamos a la definición del(de los) LUN(s). Esto se hace mediante la opción:

Gestor de NAS4 Free —> Menú Principal —> Services —> iSCSI Target —> Targets

Y pinchar el signo “+” que está al final de la fila “Target”.

NAS4Free - Services - iSCSI Target - 21 (Targets -Target)

Se muestra una nueva ventana donde hay que establecer varios valores para el LUN, entre los cuales están el nombre del Target, los grupos de portales e iniciadores (initiators) primarios y el extent que se le asignará.

NAS4Free - Services - iSCSI Target - 22 (Targets -Target - Add)

Los demás parámetros se dejan con sus valores por defecto:

NAS4Free - Services - iSCSI Target - 23 (Targets -Target - Add)

Finalmente añadir el LUN y aplicar los cambios:

NAS4Free - Services - iSCSI Target - 24 (Targets -Target - Add)

NAS4Free - Services - iSCSI Target - 25 (Targets -Target - Add)

Y así completamos el proceso de creación de un Target iSCSI y su(s) respectivos(s) LUN(s) en el servidor NAS/SAN con NAS4Free. Solamente queda configurar en el clúster Proxmox la conexión al mismo.

En la segunda parte veremos cómo integrar el Target iSCSI creado con Proxmox VE.

😀

2 Comments

  1. Juan Jose Morales dice:

    Saludos, tengo una duda que estoy nuevo en esta parte , tengo mi storage con napp-it y cree mi ISCI y LUN perfecto salgo por una ethernet de 10gb conectado al switch del blade de 10gb eso trabaja perfecto y rapido , ahora me llego un servidor aparte con una Tarjeta Qlogic FC HBA 25xx y quiero usar ese canal de fibra para conectarla a mi storage y esa maquina con promox tener un 3er o cuarto nodo

    1. Hector Suarez Planas dice:

      Saludos, Juan José Morales.

      Primero que todo, gracias por su comentario.

      Ahora bien, de lo que me expresa acá, ¿cual es el problema entonces? Una cosa que le sugiero es que separe el tráfico de almacenamiento del de gestión y servicios. En el caso en que, tanto el NAS/SAN como los nodos tengan tarjetas 10GbE (y asumiendo que tiene un switch dedicado a tal efecto), es adecuado para el tráfico de almacenamiento. Y si he habla de un blade, este debe estar en un enclosure, el cual debe tener ya acoplado el switch. Si son L2, como mínimo, puede perfectamente usar VLANs también.

      Espero le sirva. 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *