OpenStack – El Servicio de Almacenamiento: Cinder y Swift

OpenStack ofrece varios servicios de almacenamiento para diferentes propósitos. Los más conocidos son Cinder y Swift. Cinder proporciona almacenamiento en bloques (Block Storage) que básicamente es el utilizado para gestionar los discos de las máquinas virtuales y los Snapshots, mientras que Swift proporciona almacenamiento de objetos (Object Storage) que básicamente es el equivalente a AWS S3 ó Azure Blob Storage, permitiendo tener contenedores donde subir ficheros, accesibles de forma pública a mediante una URL temporal y segura (similar a los Token SAS de Azure).

Continuando con la serie de Posts sobre OpenStack, después de que tratáramos hace unos días cómo instalar OpenStack en CentOS 7 con PackStack así como un breve introducción a OpenStack, viéramos una introducción al Dashboard y CLI de OpenStack, y conociéramos el Servicio de Identidad (Keystone), el Servicio de Imágenes (Glance), el Servicio de Red (Neutron), y el Servicio de Compute (Nova), ahora le toca el turno a el almacenamiento, en particular a los Servicios Cinder (Block Storage) y Swift (Object Storage). Comenzamos.

OpenStack, al igual que otros proveedores de nube con Azure, AWS, GCP, ó Digital Ocean, ofrece varios tipos de almacenamiento. Podríamos decir que se trata de diferentes soluciones de almacenamiento virtual y remoto, ya que nos permite abstraernos en cierto modo de su ubicación física.

  • Almacenamiento efímero. Es un tipo de Almacenamiento en Bloques, que está asociado a una Instancia y proporcionado por el servicio de Compute (Nova), con un tamaño definido por el flavor de la misma. Habitualmente, se trata del disco del sistema operativo. Si bien es persistente frente a reinicios, su ciclo de vida está limitado a la vida de la Instancia (si la Instancia se borra, perdemos este disco).
  • Almacenamiento en Bloques (Block Storage ó Volumes) – Cinder. Se trata de un almacenamiento en Bloques persistente proporcionado a las Instancias por el servicio Cinder, donde se les presenta un volumen que actuará como un disco, habitualmente a través de iSCSI. Se trata de un almacenamiento independiente de las Instancias, por lo tanto, podemos asociarlo (presentarlo) a una (y sólo una) Instancia, y más adelante en el tiempo se podría asociar a otra Instancia (y sólo a ella, desasociándolo de la anterior), y/o dejarlo sin asociar a ninguna Instancia temporalmente, y en todos los casos, sus datos permanecerían, ofreciendo persistencia. Es decir, no se puede asociar a varias Instancias a la vez, y su ciclo de vida va más allá de la vida de la Instancia (hasta que lo eliminemos). Un caso habitual, sería un disco de datos (un Volumen) para una máquina con MySQL o PostgreSQL, que formatearemos y montaremos como un filesystem, aunque también podríamos crear una nueva Instancia utilizando un Volumen (o incluso un Snapshot) como disco del sistema (en lugar de partir de una Imagen). Pero además, Cinder también permite la realización y gestión de Snapshots, tanto de los Volúmenes Cinder como del almacenamiento efímero de las Instancias (discos del sistema). Cinder también proporciona lo Volume Types, que permite definir etiquetas que podemos asociar a nuestros Volúmenes, para utilizarlas como consideremos (ej: discos rápidos o discos lentos). También es posible crear un Backup de un Volumen mediante OpenStack CLI, que es almacenado en Swift para su archivado. Cinder es capaz de trabajar con diferentes proveedores de almacenamiento (ej: Linux LVM, EMC, NetApp, etc.), a utilizar una arquitectura extensible mediante Drivers, que hace que esto sea posible.
  • Almacenamiento de Objetos (Object Storage) – Swift. Orientado al almacenamiento de Objetos (ficheros con metadatos, como imágenes o videos) accesibles a través de HTTP y API REST (en lugar de iSCSI) y de Internet. Es equivalente al servicio S3 de AWS (Dropbox o OneDrive serían casos de uso especializados). Los Objetos en Swift se almacenan organizados lógicamente en Cuentas y Contenedores. Los Contenedores son como una estructura plana (no jerarquizada, no permite anidamiento) de carpetas, en cuyo interior se almacenan los propios Objetos. Swift proporciona un almacenamiento escalable, distribuido, y replicado, que soporta alta concurrencia de usuarios. Además, OpenStack puede almacenare las imágenes de las VMs en Swift (en lugar de sobre el filesystem). Por defecto, Swift está configurado para trabajar con tres réplicas (se puede cambiar), de tal modo que si una escritura se realiza en dos réplicas y falla en una, se dará por correcta y se corregirá en la fallida a posteriori de forma asíncrona, ofreciendo un gran rendimiento, especialmente a gran escala. Las réplicas suelen almacenarse distribuidas entre diferentes Regiones, Zonas, Servidores y Discos. Además, almacena un Checksum MD5 con cada objeto, que se devuelve en el encabezado al Cliente, para que este también pueda comprobar su corrección. Swift proporciona almacenamiento público, y también privado (accesible por URLs seguras y temporales, de forma similar a los Token SAS de los Blob de Azure).
  • FileSystem Compartido (Shared File System Storage) – Manilla. Proporciona filesystems remotos que pueden ser montados por las Instancias (por una o por varias a la vez), para almacenar e intercambiar ficheros, proporcionados por el servicio Manilla.

Cinder y la CLI

La introducción a Cinder que acabamos de hacer al comienzo de este Post, junto con cuando hablamos del Dashboard de OpenStack (Horizon), donde también ya vimos varios detalles relacionado con Cinder, es un primer comienzo. Para continuar, vamos a ver el diagrama de Arquitectura de Cinder (para más info: OpenStack – Cinder System Architecture) y vamos a trastear un poco con la CLI.

Podemos listar todos los comando que proporciona OpenStack CLI relacionados con Cinder, con los siguientes comandos.

source keystonerc_admin
openstack command list | grep openstack.volume -A 60

Podemos comprobar el estado de los servicios de Cinder, con los siguientes comandos.

openstack volume service list
cinder service-list

A continuación se muestra, como podemos crear un volumen desde OpenStack CLI, así como la forma para ver qué volúmenes tenemos creados.

openstack volume create --size 1 vol-mysql-data
openstack volume list

Ahora vamos a crear un nuevo volumen desde OpenStack CLI, y se lo vamos a presentar (attach) a una Instancia existente.

openstack server list
openstack server add volume cirros02 vol-mysql-data
openstack volume list

Lo siguiente es formatear el disco creando un filesystem y montándolo bajo la ruta que consideremos, algo que podemos hacer ejecutando los siguientes comandos, y par alo cual, nos tendremos que conectar por SSH a la Instancia.

ssh cirros@192.168.10.171
ls /dev
sudo mkfs.ext3 /dev/vdb
sudo mkdir /data
sudo mount /dev/vdb /data
df -h
ls -l /data
exit

Podemos crear un Backup de nuestro Volumen. Al estar actualmente presentado (atachado) a una Instancia arrancada, deberemos utilizar la opción force. El Backup generado se almacenará en Swiftt. A continuación se muetran los comandos para hacerlo con OpenStack CLI.

openstack volume backup create --name vol-mysql-data-bck --force vol-mysql-data
openstack volume backup show vol-mysql-data-bck

Igualmente, podríamos crear un Snapshot de un Volumen con un comando como el siguiente, teniendo en cuenta que debemos utilizar la opción force al tratarse de un Volumen actualmente presentado (atachado) a una Instancia arrancada.

openstack volume snapshot create --force --volume vol-mysql-data snap-vol-mysql-data

Swift y la CLI

Ya vimos en el anterior Post sobre el Dashboard de OpenStack, como realizar algunas tareas de Swift, en general de forma bastante fácil e intuitiva. Ahora vamos a ver cómo trabajar con Swift desde OpenStack CLI.

Podemos listar todos los comando que proporciona OpenStack CLI relacionados con Swifth, con el siguiente comando.

source keystonerc_admin
openstack command list | grep openstack.object_store -A 20

Aunque como veremos, para algunas tareas deberemos utilizar aún la CLI legacy de Swift, que proporciona algunos comandos adicionales, como se puede ver en su propia ayuda.

swift

Para empezar, podemos mostrar los datos de nuestra Cuenta de Swift, así como listar y crear Contenedores, ejecutando comandos como los siguientes.

openstack object store account show
openstack container list
openstack container create web-static-files
openstack container list
openstack container create download-zone
openstack container list

Podemos subir un fichero a un contenedor, utilizando OpenStack CLI. Para poder recuperar después el fichero que hemos subido, podemos utilizar la CLI legacy de Swift, mediante la cual podemos establecer una Key en nuestra Cuenta (swift post), que nos permitirá obtener URLs seguras que proporcionan un acceso temporal a un objeto. Así que, antes de poder recuperar un objeto, tenemos que establecer la Key y obtener el ID de nuestra Cuenta.

openstack object create web-static-files default.htm
swift tempurl
swift post -m "Temp-URL-Key:b3968d0207b54ece87cccc06515a89d4"
openstack object store account show

Hecho esto, ahora estamos en situación de poder obtener una URL temporal (ej: 1000 seg) que nos permita recuperar nuestro objeto, utilizando la Key que acabamos de crear, y especificando el ID de nuestra Cuenta, así como el Contenedor y el fichero. Dicha URL, la podremos utilizar en un navegador para recuperar nuestro objeto, de forma similar a cómo se hace con los Token SAS en los Blobs de Azure.

swift tempurl get 1000 /v1/AUTH_8e3901c729c54edfa9580354bbaeae6a/web-static-files/default.htm b3968d0207b54ece87cccc06515a89d4
wget http://192.168.10.175:8080/v1/AUTH_8e3901c729c54edfa9580354bbaeae6a/web-static-files/default.htm?temp_url_sig=9c989e9012529ea48c5fa27061c2f29d3378ec1f&temp_url_expires=1668848424

Despedida y Cierre

Hasta aquí llega este Post de OpenStack, en el que hemos podido conocer mejor los servicios de almacenamiento de Cinder (Block Storage, para la gestión de los discos y Snapshots de las máquinas virtuales) y Swift (Object Storage, para la gestión de almacenamiento cloud tipo AWS S3 o Azure Blob Storage), así como hacer algún pequeño ejercicio práctico con la CLI de OpenStack.

Poco más por hoy. Como siempre, confío que la lectura resulte de interés.

Deja un comentario

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

16 + 9 =