OpenStack es una plataforma Open Source de Cloud Computing para proporcionar Infraestructura como Servicio (IaaS) multi-tenant, capaz de controlar grandes grupos de recursos de Compute, Storage y Networking de uno o varios Data Center, gestionados a través de un Dashboard que proporciona control de Administración y auto-provisión para usuarios, además de un acceso API y una CLI, permitiéndote la creación de tu propia nube privada. Es modular, formado por un conjunto de componentes Core (Nova, Glance, Neutron, Swift, Keyston, y Cinder) y otros opcionales (Horizon, Heat, Designate, Trove, Mistral, Murano, etc.), que se comunican entre sí a través de sus propias APIs, junto con un sistema de colas de mensajes y bases de datos para su configuración y estado.
Comenzamos una nueva serie de Posts, en este caso sobre OpenStack, una plataforma Open Source que permite crearnos nuestra propia nube privada, como si fuéramos un proveedor de Cloud, con una API, una CLI, y un Portal o Dashboard para tareas de gestión y autoconsumo por parte de los usuarios finales.
Mi interés por OpenStack es doble, por un lado conocer el producto con la intención de que me pueda ayudar en algún proyecto a proponer una solución creativa, y por otro lado comprender mejor el funcionamiento y detalles internos (under the hood) de los proveedores Cloud, como Azure, AWS, GCP, Digital Ocean, etc.
Introducción a OpenStack
OpenStack es una plataforma Open Source que nos permite crear nuestra propia nube privada, formado por diferentes componentes que podamos instalar y configurar de la forma que nos resulte más apropiada. El Proyecto OpenStack comenzó en el año 2010 de la NASA y Rackspace, y posteriormente se creó la organización OpenStack Foundation, que es la que actualmente se encarga de liderar el Proyecto.
Con OpenStack podremos gestionas nuestros recursos y facilitar tareas de administración y de autoservicio de usuarios. Una solución interesante, que suele apoyarse KVM como solución de virtualización (hypervisor).
Los principales componentes de OpenStack son los siguientes, aunque hay muchos más.
- Keystone (Identity Server) – equivalente a IAM en AWS. Proporciona autenticación y autorización dentro de OpenStack, tanto para usuarios como servicios (los servicios se registran también en Keystone).
- Glance (Image Service). Almacena las imágenes de la máquinas virtuales, para la provisión de las mismas.
- Neutron (Networking). Permite crear Redes Virtuales (Virtual Network) y conectar la Máquinas Virtuales sobre ellas, proporcionando conectividad entre los diferentes componentes de OpenStack. Ofrece una arquitectura extensible y soporta muchas tecnologías y fabricantes.
- Nova (Compute Services) – equivalente a EC2 en AWS. Gestiona el ciclo de vida de las Máquinas Virtuales (Instancias), como una capa por encima de Hypervisor.
- Cinder (Block Storage / Volume Service) – equivalente a EBS en AWS. Habitualmente las Máquinas Virtuales arrancan con discos efímeros, por lo que al apagar la máquina, se pierden los datos del disco. Cinder proporciona almacenamiento de bloques a las Máquinas Virtuales, con persistencia tras reinicios y apagados, y no compartido (sólo puede estar conectado a una máquina), permitiendo que puedan seguir funcionando con normalidad (ej: bases de datos), o incluso conectarse a otra máquina diferente, y también proporciona el servicio de Snapshots y Backup de los discos.
- Swift (Object Storage) – equivalente a S3. Permite el acceso a objetos simples (ej: imágenes, videos, etc) a través de una API. Podremos tener Contenedores públicos cuyos objetos son accesibles sin autenticación, o contenedores privados para los que podremos generar URLs temporales y seguras mediante una clave privada de cifrado, para compartir el acceso de forma segura a nuestros ficheros.
- Horizon (Dashboard) – equivalente a AWS Console. Proporciona un Portal Web de auto-servicio donde poder realizar tareas de administración sobre los recursos gestionados por OpenStack.
Además del Dashboard (Horizon) y de las propias APIs de los diferentes componentes, tambien podemos utilizar el OpenStack CLI para acceder a OpenStack desde línea de comandos (CLI).
A continuación se muestra el diagrama de arquitectura lógica de OpenStack, donde se ven sus principales componentes, la arquitectura de los mismos, y esboza como se conectan y comunican entre sí. Para más info: OpenStack – Logical Architecture
Para continuar, que mejor que realizar nuestra propia instalación de OpenStack, en modo all-in-one, sobre una máquina virtual de laboratorio, donde podamos tocar y trastear sin miedo a romper nada.
Instalación de OpenStack en un entorno de laboratorio: Preliminares
Antes de poder instalar OpenStack, deberemos crear una máquina con CenOS 7 y un conjunto de configuraciones, que será la base o el entorno sobre el que realizaremos dicha instalación. Empezaremos por ahí.
Podemos utilizar VirtualBox para nuestro laboratorio. Imporante un mínimo de 8GB de RAM, y que la NIC esté en modo Bridge y con el modo Promiscuo habilitado, para tener conectividad con/desde el exterior. En mi caso, con un portátil con Windows 11 Home y procesador AMD Ryzen 7 4800H, no me acabó de funcionar bien, ya que OpenStack no me detectaba ningún Hypervisor en la máquina (cuando debería detectar QEMU).
También podemos utilizar Hyper-V. En mi caso, tenía a mano un Mini PC con Windows 11 Pro y procesador Celeron N5095, que me fué suficiente para instalarle Hyper-V, una VM con CentOS 7 y OpenStack, y esta vez si que me detectó un Hypervisor de tipo QEMU, como veremos al final en el Dashboard.
Indiferentemente de qué usemos para virtualizar nuestro laboratorio (VirtualBox, Hyper-V, o cualquier otra alternativa), crearemos una nueva VM con al menos 6GB de RAM, al menos 40GB de disco (idealmente dinámico), y descargaremos una ISO de CentOS 7, por ejemplo de aquí (hay más mirrors): http://centos.uvigo.es/7.9.2009/isos/x86_64/
Arrancaremos la VM, y seguimos el proceso de instalación de CentOS.
- Configuramos el particionado como LVM y con al menos 2GB o 4GB Swap
- Deshabilitamos Kdump para liberar algo de memoria.
- Establecemos nuestra configuración regional (en mi caso Madrid).
- Deshabilitaremos la política de seguridad (más adelante deshabilitaremos selinux).
- Configuramos IP4 de forma Manual (sin DHCP), y deshabilitamos IP6 (opción ignore… ni manual ni dhcp…). Importante activar el check para que la NIC se habilite al arrancar el sistema.
Seguidamente estableceremos la contraseña de root, y acabaremos la instalación, para finalmente reiniciar y arrancar CentOS.
Finalizada la instalación, comprobaremos que tenemos red. Quizás tengamos que modificar el fichero de configuración de nuestra NIC (puede ser eth0, enp0s3, etc) para asegurar que la opción ONBOOT esté a yes (esto será necesario, si no marcamos el check oportuno durante la instalación de CentOS – está un poco escondido, para que la NIC se inicie en el arranque). Si es el caso, lo corregimos y reiniciamos para comprobar que todo funciona correctamente, y listo.
Estableceremos la configuración de idioma en /etc/environment y deshabilitaremos el Firewall de sistema operativo para evitar problemas.
Configuraremos selinux en modo permisivo o lo deshabilitaremos.
Deshabilitaremos el servicio Network Manager.
Estableceremos un hostname, actualizaremos el sistema operativo, y reciniciaremos.
hostnamectl set-hostname openstack01.willie.lan
yum install yum-utils -y
yum update
reboot now
Instalación de OpenStack en un entorno de laboratorio: Packstack
Con los pasos anteriores, tenemos el entorno casi listo para poder realizar la instalación de OpenStack. El siguiente paso, es la instalación de Packstack.
Tenemos varias formas de instalar OpenStack, dos de ellas (que no son las únicas) serían:
- RedHat Distribution of OpenStack (RDO) es una distribución gratuita y soportada por la comunidad de OpenStack, basada en RPM, para Red Hat y distros derivadas como CentOS y Fedora, que proporciona herramientas de instalación para facilitar el despliegue de OpenStack.
- Packstack es una utilidad basada en Puppet para el despliegue de diferentes partes de RDO sobre uno o varios servidores, a través de SSH. Facilita tanto la instalación inicial, como el futuro crecimiento de la misma añadiendo nuevos nodos. Para más info: GitHub – RedHat-OpenStack PackStack
En nuestro caso vamos a instalar OpenStack con Packstack sobre CentOS 7, para lo cual deberemos instalar el repositorio de la versión de OpenStack que queremos instalar, que debería ser una versión anterior a OpenStack Ussuri, conforme a la documentación.
La versión inmediatamente anterior a OpenStack Ussuri es OpenStack Train, por lo que instalaremos su repositorio, para después poder instalar PackStack. Importante comprobar cuál es nuestra NIC (comando ip a), ya que nos será necesario inmediatamente después (probablemente sea eth0 ó enp0s3). Para más detalle, en la siguiente página está el historial de releases de OpenStack: OpenStack Releases
yum install centos-release-openstack-train -y
yum-config-manager --enable openstack-train
yum update -y
yum install openstack-packstack -y
packstack --version
ip a
Con esta ya tenemos PackStack instalado !
Antes de continuar, vamos a comentar las principales opciones que tenemos para instalar OpenStack con PackStack, tal y como se describe en el Readme del GitHub de PackStack: GitHub – PackStack
- Opción 1: all-in-one. Instalará todos los servicios de OpenStack en una misma máquina, sin preguntar por ninguna configuración, lo que hace que sea la forma más sencilla. La propia instalación generará un fichero de respuestas con todas las configuraciones, contraseñas y credenciales, utilizadas durante la instalación. El fichero de respuestas es importante si necesitamos volver a ejecutar instalación, por cualquier motivo, ya que contiene información de configuración y credenciales imprescindibles. Para ejecutar PackStack en modo all-in-one, basta con el siguiente comando:
packstack --allinone
- Opción 2: mediante fichero de respuestas. Consiste en pre-generar un fichero de respuestas que contendrá todos los datos de configuración necesarios. Este fichero generado lo usaremos como una plantilla, que modificaremos para ajustar a nuestras necesidades, para seguidamente ejecutar la instalación utilizando dicho fichero. Es más complejo, ya que requiere tener ciertos conocimientos de OpenStack para poder enfrentarse con éxito a este tipo de instalación, pero permite personalizar y automatizar la instalación de OpenStack. Los comandos para generar un fichero de respuestas, y para ejecutar la instalación utilizándolo, serían los siguientes.
packstack --gen-answer-file=ans.txt
packstack –answer-file=ans.txt - Opción 3: imput interactivo (prompt). En este caso, se pedirá por pantalla los datos que se necesiten para poder realizar la instalación.
packstack
En nuestro caso de ejemplo, vamos a realizar una instalación all-in-one, pero personalizando algunas configuraciones, que indicarémos como parámetros adicionales del propio comando packstack.
Instalación de OpenStack en un entorno de laboratorio: Instalando…
Ya tenemos PackStack instalado, y ciertas nociones de cómo hacer la instalación, así que, vamos a por ello.
Podemos hacer una installación all-in-one con una red plana y conectividad con el mundo exterior, mediante un único comando como el siguiente, donde referenciaremos la NIC de la VM (probablemente sea eth0 ó enp0s3). Esta es una forma de instalación sencilla y habitual para instalaciones de OpenStack en entornos de laboratorio.
packstack --allinone --provision-demo=n --os-neutron-ovs-bridge-mappings=extnet:br-ex --os-neutron-ml2-mechanism-drivers=openvswitch --os-neutron-l2-agent=openvswitch --os-neutron-ovs-bridge-interfaces=br-ex:eth0 --os-neutron-ml2-type-drivers=vxlan,flat --os-neutron-ml2-tenant-network-types=vxlan
Es posible que nos encontremos con el error «facter: error while loading shared libraries: leatherman_curl.so.1.3.0: cannot open shared object file: No such file or directory» debido a que tengamos instalada una versión muy superior de leatherman (ej: 1.10.0), en cuyo caso deberíamos poder resolverlo bajando la versión de dicho paquete, y reintentando de nuevo la ejecución de packstack.
yum downgrade leatherman
La instalación puede tardar aproximadamente una hora. Si aparecieran errores deberíamos revisar los logs para resolverlos y volver a intentar. Si va todo bien, nos deberíamos de encontrar en la pantalla algo así.
En nuestro caso la instalación finalizó con éxito. Importantes las notas que nos incluye al final:
- Fichero de respuestas (answer file). Es importante, porque incluye tanto las credenciales del usuario Admin que usaremos para acceder al Dashboard (Horizon) o incluso con la CLI (son las mismas credenciales que hay en keystonerc_admin), como las credenciales de los servicios que acabamos de instalar, y otros detalles de configuración. Además, lo necesitaremos para poder añadir más servidores a nuestra instalación de OpenStack en el futuro, por lo que es recomendable hacer un copia de seguridad del mismo.
- Fichero con las credenciales admin de OpenStack (keystonerc_admin). Incluye un conjunto de variables de entorno que tendremos que cargar para conectarnos a través de CLI de OpenStack (o de la CLI de sus componentes, como Neutron) y ejecutar comandos.
- La URL del Dashboard (Horizon).
- El Log de la instalación y los manifiestos generados durante la instalación.
OpenStack mantiene varios Logs de sus diferentes componentes en /var/log, que nos pueden ser de utilidad en muchas ocasiones para depurar problemas que nos podamos encontrar.
Se puede configurar el nivel de Log según el standard: Trace, Debug, Info, Audit, Warning, Error, y Critical. La forma de configurarlo depende de cada componente o proyecto de OpenStack.
- En Neutron, establecer debug=true en el fichero de configuración /etc/neutron/neutron.conf
- En Nova, establecer debug=true en el fichero de configuración /etc/nova/nova.conf
- En Horizon utilizaremos el fichero de configuración /etc/openstack_dashboard/local_settings.py
- En Keystone utilizaremos el fihcero de configuración /etc/keystone/logging.conf
- En Glance utilizaremos los ficheros de configuración /etc/glance/glance-api.conf y /etc/glance/glance-registry.conf
Si comprobamos la configuración de la red tras la instación de OpenStack veremos que nuestra NIC (eth0, enp0s3, o la que tengamos) tiene una configuración muy diferente a la que teníamos antes de la instalación, y que además ahora no tiene ninguna dirección IP (está en modo bridge y tipo OVSPort), además de que han aparecido nuevas NIC.
La configuración de la nueva NIC br-ex (es el propio Bridge en sí), quedaría como sigue.
Para continuar, vamos a crear en Neutron una External Network (de tipo flat) con un segmento de red (sin DHCP, con un rango de IPs definido por nosotros) en ella. Para ello utilizaremos la CLI de Neutron (también se podría hacer desde el Dashboard, y de hecho, las podremos ver desde ahí), que require cargar las variables definidas en el Script keystonerc_admin (incluye las credenciasles de administrador de OpenStack), que cargaremos previamente con el comando source. En resumen, necesitaremos ejecutar los siguientes comandos.
source keystonerc_admin
neutron net-list
neutron net-create external_network --provider:network_type flat --provider:physical_network extnet --router:external
neutron net-list
neutron subnet-create --name public_subnet --enable_dhcp=false --allocation-pool start=192.168.10.164,end=192.168.10.174 --gateway=192.168.10.50 external_network 192.168.10.0/24
neutron subnet-list
A continuación se muestra la salida de ejecución de los anteriores comandos.
También tenemos disponible la CLI de OpenStack, aunque por ahora no lo utilizaremos.
Podemos comprobar los servicios que se han instalado en systemd y utilizar systemctl para comprobar el estado de cualquiera de ellos, como por ejemplo se representa con los siguientes comandos.
cd /etc/systemd/system/multi-user.target.wants/ && ls *service
systemctl status openstack-nova-compute
A continuación se muetra la salida de ejecución de los comandos anteriores.
Otra forma más sencilla de comprobar el estado de los servicios de OpenStack es con la utilidad openstack-status, que se instala por separado, y que además proporciona información adicional que puede ser de utilidad.
yum install openstack-utils -y
openstack-status
A continuación podemos ver un ejemplo de ejecución de openstack-status, sobre nuestro laboratorio.
Para continuar, vamos a acceder al Dashboar (Horizon) para comprobar el resultado de nuestra instalación. El Dashboard, sería el equivalente al Portal de Azure o a la Consola de AWS, un Portal que podemos personalizar con el Branding de nuestra Compañía, y que es capaz de ejecutar las acciones que le indiquemos, al comunicarse con el resto de componentes de OpenStack a través de sus correspondientes APIs.
Aunque acabamos de ver como comprobar el estado de salud de los servicios de OpenStack desde línea de comandos, desde el Dashboard es bastante más sencillo hacer esto, y otras muchas cosas. Accederemos con el usuario admin, y su contraseña (si no la recordamos, está en el fichero keystonerc_admin).
Una ven dentro, podemos ir a Admin -> System -> System Information y comprobar el estado de salud de todos los servicios y agentes, utilizando las diferentes pestañas que hay en esta página. Todo debería estar OK (habilitado y levantado).
También podemos ir a Admin -> Compute -> Hypervisors y comprobar los Hypervisores que tenemos disponibles. En nuestro caso de ejemplo, tenemos sólamente uno de tipo QEMU.
Con esto ya deberíamos no sólo haber instalado OpenStack, sino también hecho una primera comprobación básica.
Despedida y Cierre
Como primer Post de OpenStack, creo que es suficiente, hemos intentado explicar en qué consiste OpenStack, una plataforma para poder crearnos nuestra propia nube privada, además de explicar cómo poder montarnos nuestro propio entorno de laboratorio de OpenStack donde podamos trastear y aprender, sobre una máquina virtual que puede correr en nuestro propio portátil o incluso en un Mini PC económico de 200€, usando VirtualBox ó Hyper-V.
Poco más por hoy. Como siempre, confío que la lectura resulte de interés.