Ceph a través de iSCSI — o esquiando en una hamaca

¿Hay entre nosotros (administradores de Ceph) quienes no amen el 'extremo profesional'?

Difícilmente, de lo contrario no estaríamos lidiando con este producto extremadamente interesante y entretenido.

Muchos de los que han trabajado con Ceph han encontrado un caso que no es muy frecuente (más bien, muy infrecuente) pero a veces solicitado: conectar Ceph a través de iSCSI o FC. ¿Para qué? Por ejemplo, para enviar una imagen desde Ceph a un servidor Windows o Solaris que, por alguna razón, aún no está virtualizado. O a un servidor virtualizado, pero usando un hipervisor que no sabe manejar Ceph, y hay muchos de ellos. Por ejemplo, HyperV o ESXi, que se utilizan de manera activa. Y si surge la necesidad de enviar una imagen desde Ceph a una máquina invitada, esto se convierte en una tarea bastante interesante.

Así que, dado:

  1. un clúster Ceph ya en funcionamiento
  2. una imagen existente que debe ser enviada a través de iSCSI
  3. Nombre del pool mypool, nombre de la imagen myimage

¿Empezamos?

Primero que nada, cuando hablamos de FC o iSCSI, aparecen entidades como el iniciador (initiator) y el objetivo (target). El target es, de hecho, el servidor; el initiator es el cliente. Nuestra tarea es enviar la imagen de Ceph al iniciador con el mínimo esfuerzo. Así que debemos configurar el target. Pero ¿dónde, en qué computadora?

Afortunadamente, en el clúster Ceph tenemos al menos un componente, cuyo IP es fijo y en el que está configurado uno de los componentes más importantes de Ceph, que es el monitor. Por lo tanto, instalamos el target iSCSI en el monitor (y también el initiator, al menos para pruebas). Yo lo hice en CentOS, pero para cualquier otra distribución la solución también es válida: basta con instalar los paquetes de la manera que sea aceptable en tu distribución.

# yum -y install iscsi-initiator-utils targetcli

¿Cuál es el propósito de los paquetes que vamos a instalar?

  • targetcli — herramienta de gestión del target SCSI incorporado en el núcleo de Linux
  • iscsi-initiator-utils — paquete de utilidades utilizadas para gestionar también el initiator iSCSI incorporado en el núcleo de Linux

Para presentar la imagen a través de iSCSI al iniciador, hay dos caminos posibles: utilizar un backend de target en espacio de usuario o conectar la imagen como un dispositivo de bloque visible para el sistema operativo y exportarlo a través de iSCSI. Optaremos por el segundo camino: el backend en espacio de usuario aún se encuentra en un estado "experimental" y está ligeramente preparado para el uso productivo. Además, tiene inconvenientes de los que se puede hablar mucho y (¡oh, horror!) debatir.

Si usamos alguna distribución estable con un ciclo de soporte prolongado, el núcleo que tenemos será de alguna versión muy antigua. Por ejemplo, en CentOS7 es 3.10.*, en CentOS8 es 4.19. Y nos interesa un núcleo de al menos 5.3 (o más bien 5.4) y más nuevo. ¿Por qué? Porque de forma predeterminada, las imágenes en Ceph tienen un conjunto de opciones activadas que no son compatibles con los núcleos antiguos. Por lo tanto, conectamos el repositorio con el nuevo núcleo para nuestra distribución (por ejemplo, para CentOS es elrepo), instalamos el nuevo núcleo y reiniciamos el sistema para trabajar con el nuevo núcleo:

  • Conectamos al monitor elegido para experimentar.
  • Conectamos los repositorios elrepo según las instrucciones — elrepo.org/tiki/tiki-index.php
  • Instalamos el núcleo: yum -y —enablerepo=elrepo-kernel install kernel-ml
  • Reiniciamos el servidor con el monitor (tenemos tres monitores, ¿verdad?)

Conectamos la imagen como un dispositivo de bloque.

# rbd map mypool/myimage
/dev/rbd0

Solo queda configurar el target. En este ejemplo, configuraré el target en modo demo, es decir, sin autenticación, visible y accesible para todos. En un entorno productivo, probablemente querrá configurar la autenticación, pero eso está un poco fuera del alcance del ejercicio de hoy, que es solo por diversión.

Creamos un backend llamado disk1 asociado al archivo /dev/rbd/mypool/myimage. El archivo especificado es un enlace simbólico creado automáticamente por el demonio udev hacia /dev/rbd0. Usamos precisamente el enlace simbólico, ya que el nombre del dispositivo rbd puede cambiar debido al orden de conexión de las imágenes de Ceph al host.

Creamos el backend:

# targetcli /backstores/block create disk1 /dev/rbd/mypool/myimage

Creamos el target iSCSI:

# targetcli /iscsi crear iqn.2020-01.demo.ceph:mypool

Conectamos el backend como LUN al target:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/luns crear /backstores/block/disk1

Ajustamos el target para el modo demo:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> atributo demo_mode_write_protect=0
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> atributo generate_node_acls=1
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> atributo cache_dynamic_acls=1

Guardamos la configuración:

# targetcli saveconfig

Verificamos la existencia del target:

# iscsiadm -m discovery -t st -p 127.0.0.1:3260
127.0.0.1:3260,1 iqn.2020-01.demo.ceph:mypool

Conectamos el target:

# iscsiadm -m node --login
Iniciando sesión en [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] (múltiple)
Inicio de sesión en [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] exitoso.

Si ha hecho todo correctamente, aparecerá un nuevo disco en el servidor, que se verá como un dispositivo SCSI, pero en realidad es una imagen de Ceph, a la que se accede a través del objetivo iSCSI. Para evitar problemas al iniciar, es mejor eliminar el disco conectado y el objetivo detectado desde el iniciador local:

# iscsiadm -m node --logout
# iscsiadm -m discoverydb -o delete -t st -p 127.0.0.1:3260

Lo único que queda es persistir la configuración para que la imagen se conecte automáticamente y, tras la conexión, se inicie el objetivo. El inicio del objetivo consiste en dos pasos: conectar RBD y, en sí, iniciar el objetivo.

Primero configuraremos la conexión automática de las imágenes RBD al host. Esto se hace añadiendo líneas al archivo /etc/ceph/rbdmap:

# gato /etc/ceph/rbdmap
# RbdDevice Parameters
mypool/myimage id=admin
# systemctl enable rbdmap

La recuperación de la configuración del objetivo es un poco más complicada: necesitamos escribir una unidad para systemd que recupere la configuración:

# gato /usr/lib/systemd/system/scsi-target.service
[Unidad]
Descripción=Iniciar destino iSCSI

After=network-online.target rbdmap.service
Before=remote-fs-pre.target
Wants=network-online.target remote-fs-pre.target

[Servicio]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/targetcli restoreconfig

[Install]
DeseadoPor=multi-user.target

# systemctl daemon-reload
# systemctl enable scsi-target

La prueba final: reiniciamos nuevamente nuestro monitor (que ahora es el objetivo iSCSI). Cabe señalar que si no hubiéramos limpiado la base del iniciador con el comando iscsiadm -n discoverydb -o delete … podríamos haber obtenido un servidor que no arranca o que arranca lentamente.

¿Qué queda?

Configurar el iniciador en el servidor al que queremos presentar el objetivo.

¿Cómo aseguramos la alta disponibilidad de nuestro objetivo?

Se pueden configurar objetivos similares en otros monitores y establecer multipath (VMware lo entenderá y funcionará, Hyper-V no lo entenderá; se requieren bloqueos SCSI). Dado que el cliente Ceph del núcleo no utiliza almacenamiento en caché, esto es totalmente funcional. Otra opción es crear un recurso de clúster a partir de tres componentes: un objetivo dedicado y los servicios rbdmap y scsi-target, y gestionar este recurso a través de herramientas de clustering (¿quién dijo pacemaker?) IP Como es evidente, este artículo es un poco una broma, pero en él he intentado "rápidamente y con ejemplos" abordar varios temas bastante populares a la vez: el objetivo iSCSI, que no necesariamente tiene que exportar imágenes de Ceph - sino por ejemplo exportar volúmenes LVM, los fundamentos del trabajo con el iniciador iSCSI (cómo escanear el objetivo, cómo conectarse al objetivo, desconectarse, eliminar la entrada del objetivo de la base), la redacción de una unidad propia para systemd y otros aspectos.

En lugar de un epílogo

Como se puede entender, este artículo es un poco una broma, pero en él he intentado examinar al mismo tiempo varios temas bastante populares: el objetivo iSCSI, que no necesariamente tiene que exportar imágenes de Ceph, sino que por ejemplo puede exportar volúmenes LVM, los fundamentos del uso de un iniciador iSCSI (cómo escanear el objetivo, cómo conectarse al objetivo, desconectarse, eliminar una entrada del objetivo de la base de datos), la creación de una unidad propia para systemd y algunos otros.

Espero que, incluso si no repites este experimento en su totalidad, al menos algo de este artículo te resulte útil.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster