Agradecimientos
Gracias a los profesores del I.E.S. Gonzalo Nazareno de Sevilla, Alberto Molina Coballes y José Domingo Muñoz Rodríguez, por compartir con nosotros su conocimiento y experiencia con OpenStack, y ofrecernos su ayuda siempre que los hemos necesitado.
Gracias a los profesores de la Universidad de Almería, José Antonio Martínez García y Manuel Torres Gil, por habernos guiado durante el proceso de instalación y habernos ayudado a resolver todos los problemas que han ido apareciendo a lo largo de esta aventura.
Gracias a los alumnos de 2º ASIR del I.E.S. Celia Viñas de Almería, David Escoriza Martínez y Eduardo Saracho Cruz, por colaborar y ayudar en la puesta en producción de este proyecto.
Muchas gracias a todos por vuestra ayuda.
1. Introducción
1.1. Breve descripción del proyecto
Este documento hace una breve descripción de los pasos que se han llevado a cabo para realizar la implantación de una nube privada con OpenStack en el I.E.S. Celia Viñas (Almería) durante el curso 2021/2022.
El objetivo de este documento es compartir todo lo que hemos aprendido durante este proceso y pueda servir de guía en futuras instalaciones o actualizaciones que se realicen en el centro.
La instalación de OpenStack se ha realizado en dos entornos físicos, un entorno de desarrollo y un entorno de producción. A lo largo de este documento se describen todos los pasos que se han llevado a cabo en cada uno de ellos.
El método que se ha utilizado para realizar la instalación y configuración del entorno OpenStack ha sido OpenStack Ansible. El sistema operativo utilizado en los nodos ha sido Ubuntu Server 20.04 LTS (Focal Fossa) y la versión de OpenStack elegida ha sido Xena (24.0.0
), liberada el 10 de diciembre de 2021.
1.2. ¿Qué es OpenStack?
OpenStack es un proyecto open source que permite gestionar recursos virtuales de computación, redes, almacenamiento e imágenes, para diseñar y gestionar nubes privadas y públicas. También se puede definir como una plataforma de cloud computing que proporciona infraestructura como servicio o IaaS (Infraestructure as a Service).
1.3. Componentes de OpenStack
Los componentes básicos de OpenStack con los que vamos a trabaja en este proyecto son los siguientes:
-
Nova: Gestiona la virtualización de los recursos de cómputo.
-
Neutron: Gestiona los virtualización de los recursos de red.
-
Glance: Se encarga de la gestión de las imágenes.
-
Cinder: Gestiona el almacenamiento a nivel de bloques.
-
Horizon: Nos permite interactuar con OpeStack a través de una interfaz web.
-
Keystone: Se encarga de la gestión de identidades y acceso.
-
Swift: Gestiona el almacenamiento a nivel de objetos.
Referencias:
1.4. Arquitectura lógica de OpenStack
Referencias:
2. Infraestructura del IES Celia Viñas
En este apartado se describen las características del entorno de desarrollo y producción donde se ha realizado la instalación de OpenStack.
2.1. Entorno de desarrollo (Departamento)
Las máquinas que hemos utilizado en el entorno de desarrollo son antiguos equipos que se utilizaban en las aulas del centro. Son equipos con modestas prestaciones que nos permiten realizar una prueba de concepto de OpenStack.
2.1.1. Hardware
2.1.1.1. Nodo bastión
-
Intel® Pentium® CPU G3220 @ 3.00GHz, 2 núcleos (1 Thread por core) = 2 CPUs
-
Memoria: 4 GB de RAM
-
Disco SSD 128 GB
2.1.1.2. Nodo de control
-
Intel® Core™ i7 CPU 920 @ 2.67GHz, 4 núcleos (2 Threads por core) = 8 CPUs
-
Memoria: 8 GB de RAM
-
Disco SSD 128 GB
El nodo de control debe tener al menos 100 GB de disco. |
2.1.1.3. Nodo de cómputo
-
Intel® Core™ i7 CPU 920 @ 2.67GHz, 4 núcleos (2 Threads por core) = 8 CPUs
-
Memoria: 8 GB de RAM
-
Disco SSD 128 GB
2.1.1.4. Nodo de almacenamiento
-
Intel® Pentium® CPU G3220 @ 3.00GHz, 2 núcleos (1 Thread por core) = 2 CPUs
-
Memoria: 4 GB de RAM
-
2 x Disco SSD 128 GB
2.1.1.5. Switch
-
Modelo: Cisco Catalyst 2960-48TT-L
-
Switch gestionable de Capa 2.
-
48 Puertos 10/100 BASE-T Ethernet.
-
Fecha de lanzamiento: 18/09/2005
-
Fecha de fin de soporte: 31/10/2019
Referencia:
2.1.2. Arquitectura de red
Observaciones
La red externa de OpenStack del entorno de desarrollo es la misma red que utilizan los equipos del departamento, es una red de clase B (192.168.0.0/24
) que nos permite direccionar 254 hosts. Hay que tener en cuenta que en este entorno sólo podremos disponer de un pool reducido de direciones IPs flotantes para las máquinas virtuales creadas en OpenStack.
2.1.3. Tabla resumen con las direcciones IP de la red externa
Nodo | IP red externa |
---|---|
Bastión |
192.168.0.56 |
Control |
192.168.0.57 |
Cómputo |
192.168.0.58 |
Almacenamiento |
192.168.0.59 |
Switch Cisco Catalyst 2960 |
192.168.0.55 |
2.2. Entorno de producción (Aula Ateca)
2.2.1. Hardware
2.2.1.1. Nodo bastión
-
Procesador: Intel® Pentium® CPU G3220 @ 3.00GHz, 2 núcleos (1 Thread por core) = 2 CPUs
-
Memoria: 4 GB de RAM
-
Disco SSD 128 GB
El nodo bastión es un antiguo equipo que se utilizaba en las aulas del centro. Este equipo solo se utiliza para realizar la instalación de OpenStack, así que no es necesario que sea un equipo con grandes prestaciones.
2.2.1.2. Nodo de control
-
Dell PowerEdge R240
-
Servidor Dell EMC PowerEdge de 14ª generación.
-
Intel Xeon E-2224, 3,4 GHz, 4 núcleos (1 Thread por core) = 4 CPUs
-
32 GB de RAM (4 x 8 GB DDR4 UDIMM 3200MHz ECC)
-
Sin controladora RAID
-
Disco duro 1 TB
Sería ideal contar con 64 GB de RAM en el nodo de control. |
Referencia:
2.2.1.3. Nodo de cómputo
-
Dell PowerEdge R440
-
Servidor Dell EMC PowerEdge de 14ª generación.
-
2 x Intel Xeon Silver 4214, 2,2 GHz, 12 núcleos (2 Threads por core) = 48 CPUs
-
256 GB de RAM (4 x RDIMM de 64 GB, 3200 MT/s)
-
Controladora RAID PERC H730P+
-
Disco duro conectable en caliente de 2,5" 512n, 1,2 TB a 10K rpm, SAS a 12 Gbps
Referencia:
2.2.1.4. Nodo de almacenamiento
-
Dell PowerEdge R640
-
Servidor Dell EMC PowerEdge de 14ª generación.
-
Intel Xeon Silver 4210R, 2,4 GHz 10 núcleos (2 Threads por core) = 20 CPUs
-
16 GB de RAM
-
Controladora RAID PERC H730P
-
Disco duro 480GB
-
4 x Discos duros 401-ABHQ 2.4TB 10K rpm SAS 12Gbps 512e
Referencia:
2.2.1.5. Switch
-
Modelo: D-Link DGS 1210-26.
-
Switch gestionable de Capa 2.
-
24 Puertos 10/100/1000 BASE-T Gigabit Ethernet.
Referencia:
2.2.2. Arquitectura de red
Observaciones
-
En la red externa de OpenStack hemos utilizado una red de clase B (
172.16.0.0/16
) ya que nos permite direccionar 65534 hosts, en lugar de utilizar una red de clase C que sólo nos permitiría 254 hosts. -
También hemos tenido que modificar la tabla de rutas del router del departamento para que los equipos de las aulas puedan acceder a la red de OpenStack.
-
En el router del aula Ateca (TP-Link TL-WR940N) hemos tenido que deshabilitar el filtrado de paquetes en el apartado de seguridad para permitir el tráfico entrante de las otras redes del centro.
2.2.3. Tabla resumen con las direcciones IP de la red externa
Nodo | IP red externa | IP iDRAC |
---|---|---|
Bastión |
172.16.0.10 |
|
Control |
172.16.0.11 |
|
Cómputo |
172.16.0.12 |
|
Almacenamiento |
172.16.0.13 |
|
Switch D-Link DGS 1210-26 |
172.16.0.5 |
3. Pasos previos a la instalación del Sistema Operativo en los servidores Dell del entorno de producción
Los pasos que se describen en este apartado solo se realizan en los nodos de Control, Cómputo y Almacenamiento del entorno de producción.
Antes de realizar la instalación del Sistema Operativo en los servidores Dell hemos realizado algunas operaciones desde la utilidad Lifecycle Controller. Para acceder a la utilidad Lifecycle Controller hay que pulsar la tecla F10 durante el proceso POST (Power On Self Test) al iniciar el servidor.
Las operaciones que hemos realizado desde la utiliad Lifecycle Controller son las siguientes:
-
Configuración del idioma y tipo de teclado.
-
Configuración de la red.
-
Actualización del firmware.
-
Configuración de red para el acceso por iDRAC.
-
Configuración del usuario y contraseña para el acceso por iDRAC.
-
Configuración del RAID de discos a nivel hardware.
3.1. Configuración del idioma y tipo de teclado
Una vez que hemos iniciado la utilidad Lifecycle Controller la primera operación que vamos a realizar es la configuración del idioma y el tipo de teclado.
Esta operación se realiza seleccionando la opción Settings y Language and Keyboard.
3.2. Configuración de la red
El siguiente paso es la configuración de la red externa que tendrán los equipos. Esta configuración no tiene por qué ser la configuración definitiva que tendrán los servidores. En este paso podemos obtener una dirección IP por DHCP y modificarla más adelante cuando se realice la instalación del sistema operativo.
3.3. Actualización del firmware
Una vez que hemos configurado la red podemos realizar la actualización del firmware del servidor mediante el asistente. De todos los métodos que aparecen hemos seleccionado la actualización mediante el Sitio web de Dell.
3.4. Configuración de red para el acceso por iDRAC
El siguiente paso es la configuración de red del interfaz iDRAC. Desde iDRAC podemos conectarnos de forma remota al servidor para encenderlo/apagarlo, configurarlo, etc.
Las direcciones IP estáticas que les hemos asiganado a cada uno de los servidores para el acceso por iDRAC son las siguientes.
Nodo | IP iDRAC | Versión iDRAC |
---|---|---|
Control |
iDRAC 9 Express |
|
Cómputo |
iDRAC 9 Express |
|
Almacenamiento |
iDRAC 9 Enterprise |
3.5. Configuración del RAID de discos a nivel hardware.
El nodo de Cómputo y Almacenamiento disponen de una controladora RAID que tenemos que configurar antes de realizar la instalación del sistema operativo.
3.5.1. Nodo de cómputo
El nodo de cómputo cuenta con la controladora:
-
RAID PERC H730P+.
Y un solo disco:
-
Disco duro conectable en caliente de 2,5" 512n, 1,2 TB a 10K rpm, SAS a 12 Gbps.
Como solo disponemos de un disco lo hemos configurado como RAID 0 desde la utilidad LifeCycle Controller. Para crear el RAID 0, en primer lugar hay que crear un disco virtual y luego se le añade el disco físico. Las capturas de pantalla que se muestran a continuación se han realizado desde la interfaz web de iDRAC.
3.5.2. Nodo de almacenamiento
El nodo de almacenamiento cuenta con la controladora:
-
RAID PERC H730P.
Y los siguientes discos:
-
1 Disco duro 480GB.
-
4 x Discos duros 401-ABHQ 2.4TB 10K rpm SAS 12Gbps 512e.
El disco duro de 480 GB lo hemos configurado como RAID 0 y lo hemos utilizado para instalar el sistema operativo. Los 4 discos duros de 2.4 TB los hemos configurado como RAID 5 y los estamos utilizando almacenar los volúmenes del servicio Cinder de OpenStack.
El orden en el que se crean los RAID de discos es importante ya que el nombre con el que aparecerán en el sistema operativo dependerá del orden en el que se han creado. En primer lugar hemos creado el RAID 0 que aparecerá con el nombre /dev/sda
y en segundo lugar el RAID 5 que aparecerá como /dev/sdb
.
El procedimiento para crear el RAID de discos es igual que en el paso anterior, en primer lugar se crea el disco virtual y luego se añaden los discos físicos que estarán asociados a ese disco virtual.
La configuración del RAID se ha realizado desde la utilidad LifeCycle Controller aunque las capturas de pantalla que se muestran a continuación se han realizado desde la interfaz web de iDRAC.
4. Instalación y configuración del Sistema Operativo Ubuntu Server 20.04 LTS en los servidores Dell del entorno de producción
El sistema operativo que hemos instalado en los nodos ha sido Ubuntu Server 20.04 LTS (Focal Fossa), ya que era uno de los sistemas operativos recomendados por la versión de OpenStack Xena (24.0.0
), que es la que hemos utilizado en la implantación del cloud del centro.
4.1. Configuración de las tarjetas de red en modo bonding
Durante la instalación de Ubuntu Server 20.04 el asistente nos ofrece la posibilidad de configurar las tarjetas de red en modo bonding.
La configuración que vamos a utilizar para configurar las tarjetas en modo bonding es la siguiente:
-
Nombre:
bond0
-
Bond mode:
802.3ad
-
XMIT hash policy:
layer3+4
-
LACTP rate:
fast
El bonding de los nodos de Control y Cómputo estará formado por las interfaces de red |
Nodos | Interfaces de red |
---|---|
Control |
|
Cómputo |
|
Almacenamiento |
|
4.2. Creación de volúmenes LVM
El asistente de instalación de Ubuntu Server 20.04 también nos permite configurar el sistema de archivos como un grupo de volúmenes LVM (Logical Volume Manager).
La configuración que hemos seleccionado en este paso ha sido la de utilizar el disco completo y crear un volumen lógico para el directorio raíz del sistema. Hay que tener en cuenta que habrá que modificar el tamaño del volumen lógico que aparece por defecto, ya que el asistente no utiliza todo el espacio disponible del disco.
Las particiones que hemos configurado en cada uno de los nodos son las siguientes:
Partición | Descripción |
---|---|
|
Volumen lógico para el directorio raíz del sistema operativo. |
|
Partición para los archivos de arranque. |
|
Partición para los cargadores de arranque EFI, aplicaciones y controladores utilizados por el firmware UEFI. |
El nodo de Almacenamiento contará además con otro grupo de volúmenes LVM llamadao |
4.3. Notas sobre la partición Linux_OEMDRV
que aparece durante la instalación del sistema operativo
Al instalar el sistema operativo se crea automáticamente una partición de 300 MB (aprox.) con los controladores Dell para el sistema operativo seleccionado. Esta partición se elimina automáticamente al pasar un número determinado de horas o se puede eliminar iniciando el servidor en modo Lifecycle controller y reiniciando el servidor.
Referencia:
5. Configuración de red
5.1. Entorno de desarrollo (Departamento)
5.1.1. Configuración del switch Cisco Catalyst 2960
Para configurar el switch Cisco Catalyst 2960 seguimos los pasos de la guía oficial para resetear el switch y preparar su configuración.
En el apartado Ejecución de Express Setup de la guía oficial encontramos los primeros pasos que tenemos que realizar.
Referencia:
5.1.2. Datos de configuración del switch
-
IP estática:
192.168.0.55
5.1.3. Creación de las VLANs en el switch Cisco Catalyst 2960
En este paso vamos a crear las cuatro VLANs que necesitamos en OpenStack.
VLAN Id | Nombre |
---|---|
10 |
vlan10 |
20 |
vlan20 |
30 |
vlan30 |
40 |
vlan40 |
Es necesario habilitar el servicio de telnet para poder configurar el switch mediante la línea de comandos. Una vez que hemos habilitado el servicio de telnet podemos conectarnos con el siguiente comando.
Se recomienda habilitar el servicio de telnet durante la ejecución del Express Setup.
# telnet 192.168.0.55
Lo primero que haremos será activar el modo de configuración.
Switch>enable
Switch#configure terminal
Creamos las VLAN que necesitamos. En primer lugar creamos la VLAN 10
y le asignamos el nombre vlan10
.
Switch(config)#vlan 10
Switch(config-vlan)#name vlan10
Switch(config-vlan)#end
Creamos la VLAN 20
y le asignamos el nombre vlan20
.
Switch#configure terminal
Switch(config)#vlan 20
Switch(config-vlan)#name vlan20
Switch(config-vlan)#end
Creamos la VLAN 30
y le asignamos el nombre vlan30
.
Switch#configure terminal
Switch(config)#vlan 30
Switch(config-vlan)#name vlan30
Switch(config-vlan)#end
Creamos la VLAN 40
y le asignamos el nombre vlan40
.
Switch#configure terminal
Switch(config)#vlan 40
Switch(config-vlan)#name vlan40
Switch(config-vlan)#end
5.1.4. Configuración de los interfaces en modo trunk
Configuramos el interfaz del switch Fa0/37
en modo trunk para que pueda trabajar con las VLAN 10
, 20
, 30
y 40
. El interfaz Fa0/37
se corresponde con la boca 37
del switch.
Switch#configure terminal
Switch(config)#interface Fa0/37
Switch(config-if)#switchport mode trunk
Switch(config-if)#switchport access vlan 10
Switch(config-if)#switchport access vlan 20
Switch(config-if)#switchport access vlan 30
Switch(config-if)#switchport access vlan 40
Switch(config-if)#end
Configuramos el interfaz del switch Fa0/39
en modo trunk para que pueda trabajar con las VLAN 10
, 20
, 30
y 40
. El interfaz Fa0/39
se corresponde con la boca 39
del switch.
Switch#configure terminal
Switch(config)#interface Fa0/39
Switch(config-if)#switchport mode trunk
Switch(config-if)#switchport access vlan 10
Switch(config-if)#switchport access vlan 20
Switch(config-if)#switchport access vlan 30
Switch(config-if)#switchport access vlan 40
Switch(config-if)#exit
Configuramos el interfaz del switch Fa0/41
en modo trunk para que pueda trabajar con las VLAN 10
, 20
, 30
y 40
. El interfaz Fa0/41
se corresponde con la boca 37
del switch.
Switch(config)#interface Fa0/41
Switch(config-if)#switchport mode trunk
Switch(config-if)#switchport access vlan 10
Switch(config-if)#switchport access vlan 20
Switch(config-if)#switchport access vlan 30
Switch(config-if)#switchport access vlan 40
Switch(config-if)#exit
Configuramos el interfaz del switch Fa0/43
en modo trunk para que pueda trabajar con las VLAN 10
, 20
, 30
y 40
. El interfaz Fa0/43
se corresponde con la boca 37
del switch.
Switch(config)#interface Fa0/43
Switch(config-if)#switchport mode trunk
Switch(config-if)#switchport access vlan 10
Switch(config-if)#switchport access vlan 20
Switch(config-if)#switchport access vlan 30
Switch(config-if)#switchport access vlan 40
Switch(config-if)#exit
Guardamos los cambios.
Switch#wr
Referencia:
5.1.5. Configuración de red en los nodos (Netplan)
La configuración de red de los nodos del entorno de desarrollo va a tener algunas diferencias respecto a los nodos del entorno de producción, ya que los equipos del entorno de desarrollo sólo disponen de una tarjeta de red, mientras que los equipos del entorno de producción disponen de dos tarjetas de red que se configurarán en modo bonding.
5.1.5.1. Nodo bastión
network:
version: 2
renderer: networkd
ethernets:
enp2s0: (1)
dhcp4: false
vlans: (2)
enp2s0.10:
id: 10
link: enp2s0
enp2s0.20:
id: 20
link: enp2s0
enp2s0.30:
id: 30
link: enp2s0
enp2s0.40:
id: 40
link: enp2s0
bridges: (3)
br-mgmt:
interfaces: [enp2s0.10]
addresses: [10.0.236.140/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [enp2s0.20]
addresses: [10.0.244.140/22]
mtu: 1500
br-vxlan:
interfaces: [enp2s0.30]
addresses: [10.0.240.140/22]
mtu: 1500
br-vlan:
interfaces: [enp2s0.40]
mtu: 1500
br-ex:
interfaces: [enp2s0]
addresses: [192.168.0.56/24]
gateway4: 192.168.0.100
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
1 | enp2s0 es el nombre que tiene la interfaz de red en el nodo Bastión. Tenga en cuenta que el nombre de la interfaz de red puede cambiar en otras máquinas. |
2 | En esta sección definimos las VLANs que vamos a utilizar. |
3 | En esta sección definimos los bridges de red. |
5.1.5.2. Nodo de control
network:
version: 2
renderer: networkd
ethernets:
enp6s0:
dhcp4: false
vlans:
enp6s0.10:
id: 10
link: enp6s0
enp6s0.20:
id: 20
link: enp6s0
enp6s0.30:
id: 30
link: enp6s0
enp6s0.40:
id: 40
link: enp6s0
bridges:
br-mgmt:
interfaces: [enp6s0.10]
addresses: [10.0.236.141/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [enp6s0.20]
addresses: [10.0.244.141/22]
mtu: 1500
br-vxlan:
interfaces: [enp6s0.30]
addresses: [10.0.240.141/22]
mtu: 1500
br-vlan:
interfaces: [enp6s0.40]
mtu: 1500
br-ex:
interfaces: [enp6s0]
addresses: [192.168.0.57/24]
gateway4: 192.168.0.100
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
5.1.5.3. Nodo de cómputo
network:
version: 2
renderer: networkd
ethernets:
enp6s0:
dhcp4: false
vlans:
enp6s0.10:
id: 10
link: enp6s0
enp6s0.20:
id: 20
link: enp6s0
enp6s0.30:
id: 30
link: enp6s0
enp6s0.40:
id: 40
link: enp6s0
bridges:
br-mgmt:
interfaces: [enp6s0.10]
addresses: [10.0.236.142/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [enp6s0.20]
addresses: [10.0.244.142/22]
mtu: 1500
br-vxlan:
interfaces: [enp6s0.30]
addresses: [10.0.240.142/22]
mtu: 1500
br-vlan:
interfaces: [enp6s0.40]
mtu: 1500
br-ex:
interfaces: [enp6s0.40]
addresses: [192.168.0.58/24]
gateway4: 192.168.0.100
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
5.1.5.4. Nodo de almacenamiento
network:
version: 2
renderer: networkd
ethernets:
enp2s0:
dhcp4: false
vlans:
enp2s0.10:
id: 10
link: enp2s0
enp2s0.20:
id: 20
link: enp2s0
enp2s0.30:
id: 30
link: enp2s0
enp2s0.40:
id: 40
link: enp2s0
bridges:
br-mgmt:
interfaces: [enp2s0.10]
addresses: [10.0.236.143/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [enp2s0.20]
addresses: [10.0.244.143/22]
mtu: 1500
br-vxlan:
interfaces: [enp2s0.30]
addresses: [10.0.240.143/22]
mtu: 1500
br-vlan:
interfaces: [enp2s0.40]
mtu: 1500
br-ex:
interfaces: [enp2s0]
addresses: [192.168.0.59/24]
gateway4: 192.168.0.100
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
5.2. Entorno de producción (Aula Ateca)
5.2.1. Creación de las VLAN en el switch D-Link DGS 1210-26
En este paso vamos a crear las cuatro VLANs que necesitamos en OpenStack.
VLAN Id | Nombre |
---|---|
10 |
br-mgmt |
20 |
br-storage |
30 |
br-vxlan |
40 |
br-vlan |
En este caso la creación de las VLANS la vamos a realizar desde la interfaz web del switch. Para acceder al panel de administración del switch abrimos la URL https://172.16.0.5
desde un navegador web.
Una vez que hemos accedido al panel de administración seleccionamos la opción VLAN → 802.1Q VLAN en el panel de la izquierda para crear las VLANS.
A continuación se muestra una captura de pantalla de todo el proceso de creación de las VLANs desde la interfaz web del switch.
Después de configurar las VLANs tenemos que guardar la configuración para que los cambios realizados sean persistentes, en otro caso, las VLANs que hemos creado se perderían al reiniciar el switch.
Para guardar los cambios accedemos a la opción Save Config del panel de la izquierda. La ruta completa es la siguiente: Save → Save Configuration → Save Config.
Referencia:
5.2.2. Configuración de las tarjetas de red en los nodos (Netplan)
La configuración de red de los nodos del entorno de producción van a tener algunas diferencias respecto a los nodos del entorno de desarrollo, ya que los equipos del entorno de producción disponen de dos tarjetas de red que se configurarán en modo bonding, mientras que los equipos del entorno de desarrollo sólo disponen de una tarjeta de red.
La configuración que vamos a utilizar para configurar las tarjetas en modo bonding es la siguiente:
-
Nombre:
bond0
-
Bond mode:
802.3ad
-
XMIT hash policy:
layer3+4
-
LACTP rate:
fast
Tenemos pediente la configuración del MTU a 9000 bytes (Jumbo Frames) para mejorar el rendimiento de la red y hacer que las transmisiones de datos sean más eficientes. |
Referencias:
5.2.2.1. Nodo bastión
network:
version: 2
renderer: networkd
ethernets:
enp2s0:
dhcp4: false
vlans:
enp2s0.10:
id: 10
link: enp2s0
enp2s0.20:
id: 20
link: enp2s0
enp2s0.30:
id: 30
link: enp2s0
enp2s0.40:
id: 40
link: enp2s0
bridges:
br-mgmt:
interfaces: [enp2s0.10]
addresses: [10.0.236.140/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [enp2s0.20]
addresses: [10.0.244.140/22]
mtu: 1500
br-vxlan:
interfaces: [enp2s0.30]
addresses: [10.0.240.140/22]
mtu: 1500
br-ex:
interfaces: [enp2s0]
addresses: [172.16.0.10/16]
gateway4: 172.16.0.1
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
br-vlan:
interfaces: [enp2s0.40]
mtu: 1500
5.2.2.2. Nodo de control
network:
version: 2
renderer: networkd
ethernets:
eno1: {}
eno2: {}
bonds:
bond0:
dhcp4: false
interfaces:
- eno1
- eno2
parameters:
lacp-rate: fast
mode: 802.3ad
transmit-hash-policy: layer3+4
vlans:
bond0.10:
id: 10
link: bond0
bond0.20:
id: 20
link: bond0
bond0.30:
id: 30
link: bond0
bond0.40:
id: 40
link: bond0
bridges:
br-mgmt:
interfaces: [bond0.10]
addresses: [10.0.236.141/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [bond0.20]
addresses: [10.0.244.141/22]
mtu: 1500
br-vxlan:
interfaces: [bond0.30]
addresses: [10.0.240.141/22]
mtu: 1500
br-vlan:
interfaces: [bond0.40]
mtu: 1500
br-ex:
interfaces: [bond0]
addresses: [172.16.0.11/16]
gateway4: 172.16.0.1
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
5.2.2.3. Nodo de cómputo
network:
version: 2
renderer: networkd
ethernets:
eno1: {}
eno2: {}
bonds:
bond0:
dhcp4: false
interfaces:
- eno1
- eno2
parameters:
lacp-rate: fast
mode: 802.3ad
transmit-hash-policy: layer3+4
vlans:
bond0.10:
id: 10
link: bond0
bond0.20:
id: 20
link: bond0
bond0.30:
id: 30
link: bond0
bond0.40:
id: 40
link: bond0
bridges:
br-mgmt:
interfaces: [bond0.10]
addresses: [10.0.236.142/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [bond0.20]
addresses: [10.0.244.142/22]
mtu: 1500
br-vxlan:
interfaces: [bond0.30]
addresses: [10.0.240.142/22]
mtu: 1500
br-vlan:
interfaces: [bond0.40]
mtu: 1500
br-ex:
interfaces: [bond0]
addresses: [172.16.0.12/16]
gateway4: 172.16.0.1
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
5.2.2.4. Nodo de almacenamiento
network:
version: 2
renderer: networkd
ethernets:
eno3: {}
eno4: {}
bonds:
bond0:
dhcp4: false
interfaces:
- eno3
- eno4
parameters:
lacp-rate: fast
mode: 802.3ad
transmit-hash-policy: layer3+4
vlans:
bond0.10:
id: 10
link: bond0
bond0.20:
id: 20
link: bond0
bond0.30:
id: 30
link: bond0
bond0.40:
id: 40
link: bond0
bridges:
br-mgmt:
interfaces: [bond0.10]
addresses: [10.0.236.143/22]
nameservers:
addresses: [8.8.8.8]
mtu: 1500
br-storage:
interfaces: [bond0.20]
addresses: [10.0.244.143/22]
mtu: 1500
br-vxlan:
interfaces: [bond0.30]
addresses: [10.0.240.143/22]
mtu: 1500
br-vlan:
interfaces: [bond0.40]
mtu: 1500
br-ex:
interfaces: [bond0]
addresses: [172.16.0.13/16]
gateway4: 172.16.0.1
nameservers:
addresses: [8.8.8.8]
mtu: 1500
parameters:
stp: true
forward-delay: 4
5.2.3. Configuración de la agregación de enlaces en el switch D-Link DGS 1210-26
Para completar la configuración de las tarjetas de red en modo bonding es necesario configurar la agregación de enlaces o port trunking en el switch.
La función de port trunking del switch permite crear un grupo o enlace lógico que estará formado por dos o más puertos físicos para incrementar el ancho de banda de un host y proporcionar redundancia en la conexión.
Es posible crear dos tipos de agregaciones: Estática y LACP (Link Aggregation Control Protocol), que es la que utilizaremos en nuestro caso.
En primer lugar, accederemos desde un navegador web al panel de administración
del switch a través de la URL https://172.16.0.5
y buscaremos la siguiente ruta:
L2 Functions > Link Aggregation > Port Trunking
Ahora vamos a crear los grupos donde se identifican los puertos del switch a los que están conectados cada una de las tarjetas de red que hemos configurado en modo bonding.
Los grupos que vamos a crear se muestran en la siguiente tabla.
Grupo | Puertos | Nodo |
---|---|---|
1 |
11, 12 |
Control |
2 |
13, 14 |
Cómputo |
3 |
15, 16 |
Almacenamiento |
Una vez que configurados los grupos, guardamos los cambios accediendo a la opción Save Config del panel de la izquierda. La ruta completa es la siguiente: Save → Save Configuration → Save Config.
Para comprobar que las tarjetas de red y el switch se han configurado de forma
correcta nos conectamos por SSH a cada uno de los hosts (control, cómputo y
almacenamiento) y ejecutamos el comando ethtool
para comprobar cuál es el
ancho de banda configurado para la intefaz de bonding (bond0
) y las
intefaces físicas (eno1
y eno2
).
Comprobamos la interfaz de bonding (bond0
).
# ethtool bond0
Settings for bond0:
...
Speed: 2000Mb/s
...
El valor del parámetro Speed para la interfaz bond0
indica que la interfaz
(que es un enlace de bonding) está configurada para trabajar con un ancho de
banda de 2000 Mbps (2 Gbps).
Ahora comprobamos una de las interfaces físicas (eno1
).
# ethtool eno1
Settings for eno1:
...
Speed: 1000Mb/s
...
En este caso vemos que la interfaz física eno1
está configurada para trabajar
con un ancho de banda de 1000 Mbps (1 Gbps).
6. Instalación de OpenStack Ansible
6.1. Preparación del host Bastión
El host Bastión es el host desde el que vamos a realizar la ejecución de los playbooks de OpenStack Ansible. En este equipo tenemos que realizar las siguientes operaciones:
-
Instalar las dependencias.
-
Comprobar que el servicio NTP está activado.
-
Crear un par de claves SSH par el usuario
root
y copiar la clave pública en cada uno de los nodos.
6.1.1. Instalación de las dependencias
-
Conectamos por SSH con la instancia.
-
Ejecutamos los siguientes comandos para instalar los paquetes necesarios.
# apt update
# apt dist-upgrade -y
# apt install build-essential git chrony openssh-server python3-dev sudo -y
# reboot
6.1.2. Comprobación del servicio NTP
Comprobamos que el servicio NTP está activado. Podemos comprobarlo ejecutando el comando: timedatectl
.
6.1.3. Creación de un par de claves SSH para el usuario root
En el host Bastión ejecutamos el comando ssh-keygen
para crear una clave pública y privada para el usuario root
.
Una vez que hemos creado la clave pública y privada del usuario root
, consultamos el valor de la clave pública para copiarla en el resto de nodos. Desde el host Bastión ejectuamos los siguientes comandos:
sudo su
ssh-keygen
cat /root/.ssh/id_rsa.pub
(Copiamos la clave pública)
Conectamos por SSH con cada una de las máquinas (Control, Cómputo y Almacenamiento) y copiamos la clave pública del host Bastión en el archivo /root/.ssh/authorized_keys
.
sudo su
nano /root/.ssh/authorized_keys
(Copiamos la clave pública del host Bastión)
Hay que copiar el contenido del archivo |
Para comprobar que podemos conectar con todos los nodos podemos ejecutar los siguientes comandos desde el host Bastión.
ssh root@IP-CONTROL
ssh root@IP-COMPUTO
ssh root@IP-ALMACENAMIENTO
6.2. Preparación de los equipos destino
En los nodos de Control, Cómputo y Almacenamiento realizamos los siguientes pasos.
-
Instalar las dependencias.
-
Comprobar que el servicio NTP está activado.
6.2.1. Instalación de las dependencias en los equipos destino
-
Conectamos por SSH con la instancia.
-
Ejecutamos los siguientes comandos para instalar los paquetes necesarios.
# apt update
# apt dist-upgrade -y
# apt install bridge-utils debootstrap openssh-server tcpdump vlan python3 -y
# apt install linux-modules-extra-$(uname -r) -y
# reboot
Recuerde que estos pasos se tienen que realizar en los nodos: Control, Cómputo y Almacenamiento. |
6.2.2. Comprobación del servicio NTP
Comprobamos que el servicio NTP está activado. Podemos comprobarlo ejecutando el comando: timedatectl
.
6.3. Creación de un servicio para crear el par veth en el nodo de control
En la documentación oficial de OpenStack Ansible encontramos la siguiente información sobre la creación del par de interfaces veth
en el nodo de control.
Netplan todavía no tiene soporte para veth
, por lo tanto podemos crear un script que ejecute los comandos necesarios y gestionarlo como un servicio.
Creamos un archivo en la siguiente ruta.
# nano /usr/local/bin/br-ex-veth.sh
Añadimos los comandos de creación del para la pareja de interfaces virtuales veth.
#!/bin/bash
ip link add br-ex-veth type veth peer name eth12
ip link set br-ex-veth up
ip link set eth12 up
brctl addif br-ex br-ex-veth
Hemos utilizado el nombre de eth12
para el interfaz que utiliza el agente de neutron, para no tener que modificar el parámetro host_bind_override: "eth12"
del archivo openstack_user_config.yml
.
Actualizamos los permisos del archivo
# chmod 744 /usr/local/bin/br-ex-veth.sh
Creamos un archivo para definir el servicio.
# nano /etc/systemd/system/br-ex-veth.service
Definimos el servicio en el archivo que acabamos de crear.
[Unit]
After=network.service
[Service]
ExecStart=/usr/local/bin/br-ex-veth.sh
[Install]
WantedBy=default.target
Actualizamos los permisos del archivo
# chmod 644 /etc/systemd/system/br-ex-veth.service
Configuramos el servicio para se inicie de forma automática al iniciar la máquina
# systemctl daemon-reload
# systemctl enable br-ex-veth.service
# systemctl start br-ex-veth.service
Podemos comprobar el estado de los bridges de red con el comando:
brctl show
6.4. Configuramos un volumen de almacenamiento para el nodo de almacenamiento
En este paso vamos a configurar un volumen LVM para almacenar los volúmenes del servicio Cinder.
Para consultar la lista de volúmenes que existen en el sistema podemos utilizar el comando:
lsblk
Entorno de desarrollo
En el entorno de desarrollo del departamento estamos utilizando un segundo disco SSD en /dev/sdb.
sudo pvcreate --metadatasize 2048 /dev/sdb
sudo vgcreate cinder-volumes /dev/sdb
Comprobamos que el volumen se ha creado de forma correcta.
vgdisplay
Entorno de producción
En el entorno de producción del aula Ateca estamos utilizando un RAID 5 formado por cuatro discos físicos en /dev/sdb.
sudo pvcreate --metadatasize 2048 /dev/sdb
sudo vgcreate cinder-volumes /dev/sdb
Comprobamos que el volumen se ha creado de forma correcta.
vgdisplay
El resultado del comando nos muestra que existen dos volúmenes LVM uno para el sistema operativo (ubuntu-vg
) y el que acabamos de crear para el servicio Cinder (cinder-volumes
).
root@almacenamiento:/home/usuario# vgdisplay
--- Volume group ---
VG Name cinder-volumes
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <6,55 TiB
PE Size 4,00 MiB
Total PE 1715967
Alloc PE / Size 0 / 0
Free PE / Size 1715967 / <6,55 TiB
VG UUID QHIOA2-DXc1-NfSG-0Vu4-h22Q-o3tN-sZ1N6D
--- Volume group ---
VG Name ubuntu-vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 444,07 GiB
PE Size 4,00 MiB
Total PE 113682
Alloc PE / Size 113682 / 444,07 GiB
Free PE / Size 0 / 0
VG UUID 3hMt0M-BdhG-J570-eLCE-c1oB-3yrt-Cvozvl
Comandos útiles para trabajar con LVM
pvcreate # Crea un volumen físico (physical volume). Destruye todos los datos.
vgcreate # Crea un grupo de volúmenes (volume group)
lvcreate # Crea un volumen lógico (logical volume)
pvs # Muestra los atributos de los volúmenes físicos
vgs # Muestra los atributos de los grupos de volúmenes
mkfs -t ext4 ... # Formatea el volumen lógico que hemos creado
pvdisplay # Muestra información de los physical volumes
vgdisplay # Muestra información de todos los volúmenes creados
vgdisplay cinder-volumes # Muestra información de un volumen en concreto
vgremove # Elimina un volumen
Referencias:
6.5. Creamos un archivo de swap en el nodo de Control
En el entorno de desarrollo es necesario crear un archivo de swap en el nodo de Control, para hacerlo tenemos que ejecutar los siguientes comandos como root
:
Reservamos espacio de disco para crear un archivo de swap llamado /swapfile
. En este caso vamos a crear un archivo de 16 GB, pero dependiendo de la instalación será necesario ampliar el tamaño del archivo a 32 o 64 GB.
# fallocate -l 16G /swapfile
Modificamos los permisos del archivo de swap para que solo el usuario root
pueda escribir en el.
# chmod 600 /swapfile
Convertimos el archivo en un área de swap para Linux.
# mkswap /swapfile
Activamos el archivo de swap.
# swapon /swapfile
Editamos el archivo /etc/fstab
y añadimos la siguiente línea para el archivo de swap sea permanente después de cada reinicio de la máquina.
/swapfile swap swap defaults 0 0
Comprobamos que la swap está activa.
# sudo swapon --show
Si la swap está activa debe aparecer un resultado similar a este:
NAME TYPE SIZE USED PRIO
/swapfile file 16G 1.5G -2
6.6. Configuramos el valor de swappiness
que determina el uso de la memoria virtual
El swappiness es una propiedad del kernel de Linux que permite configurar cuando se utilizará la memoria virtual swap en función del espacio libre que haya de memoria física RAM.
La propiedad de swappiness se puede configurar con un valor entre 0 y 100. Un valor igual a 0 quiere decir que el sistema nunca hará uso de la memoria virtual, y un valor igual a 100, quiere decir que se estará haciendo uso de la memoria virtual todo momento. Esta configuración puede provocar una degradación del rendimiento del sistema.
El valor que suele tener una instalación Linux por defecto es 60, que quiere decir que se empezará a utilizar la memoria virtual swap cuando quede un 40% libre de memoria RAM del sistema.
Para comprobar el valor del swapiness del sistema podemos ejecutar este comando.
# cat /proc/sys/vm/swappiness
Podemos modificar el valor del swapiness en tiempo de ejecucion, con el comando:
# sysctl vm.swappiness=10
El valor que se haya configurado con este comando se perderá después de reiniciar el sistema. Si queremos que los cambios sean permanentes podemos hacerlo configurando el parámetro vm.swappiness
del archivo /etc/sysctl.conf
.
vm.swappiness=10
6.7. Instalamos el código fuente y las dependencias en el host bastión
Seleccionamos el branch que queremos instalar. En este caso se está seleccionando la stable/xena, que se corresponde con la versión 24.0.0, pero la última en desarrollo es 24.0.1.
# git clone -b stable/xena https://opendev.org/openstack/openstack-ansible /opt/openstack-ansible
# cd /opt/openstack-ansible
# scripts/bootstrap-ansible.sh
Referencia:
6.8. Configuramos el deployment en el host bastion
# cp -R /opt/openstack-ansible/etc/openstack_deploy/ /etc/
# cd /etc/openstack_deploy
# cp openstack_user_config.yml.example openstack_user_config.yml
Referencia:
6.9. Configuramos el archivo openstack_user_config.yml
Copiamos el archivo openstack_user_config.yml
de nuestro repositorio al directorio /etc/openstack_deploy
.
Referencia:
6.9.1. openstack_user_config.yml
---
cidr_networks:
container: 10.0.236.0/22
tunnel: 10.0.240.0/22
storage: 10.0.244.0/22
exit: 172.16.0.0/16
used_ips:
- "10.0.236.1,10.0.236.254"
- "10.0.240.1,10.0.240.254"
- "10.0.244.11,10.0.244.254"
- "172.16.0.1,172.16.0.20"
global_overrides:
internal_lb_vip_address: 10.0.236.141 # Nodo de Control. VIP Interna
external_lb_vip_address: 172.16.0.11 # Nodo de Control. VIP Externa
management_bridge: "br-mgmt"
provider_networks:
- network:
container_bridge: "br-mgmt"
container_type: "veth"
container_interface: "eth1"
ip_from_q: "container"
type: "raw"
group_binds:
- all_containers
- hosts
is_container_address: true
- network:
container_bridge: "br-vxlan"
container_type: "veth"
container_interface: "eth10"
ip_from_q: "tunnel"
type: "vxlan"
range: "1:1000"
net_name: "vxlan"
group_binds:
- neutron_linuxbridge_agent
- network:
container_bridge: "br-ex" # Valor original: br-vlan
container_type: "veth"
container_interface: "eth12"
host_bind_override: "eth12" # Valor original: eth12. Nombre de la interfaz del par veth
ip_from_q: "exit"
type: "flat"
net_name: "exit"
group_binds:
- neutron_linuxbridge_agent
- network:
container_bridge: "br-vlan"
container_type: "veth"
container_interface: "eth11"
type: "vlan"
range: "101:200,301:400"
net_name: "vlan"
group_binds:
- neutron_linuxbridge_agent
- network:
container_bridge: "br-storage"
container_type: "veth"
container_interface: "eth2"
ip_from_q: "storage"
type: "raw"
group_binds:
- glance_api
- cinder_api
- cinder_volume
- nova_compute
###
### Infrastructure
###
# galera, memcache, rabbitmq, utility
shared-infra_hosts:
infra1:
ip: 10.0.236.141
# repository (apt cache, python packages, etc)
repo-infra_hosts:
infra1:
ip: 10.0.236.141
###
### OpenStack
###
# List of target hosts on which to deploy the glance API, nova API, heat API,
# and horizon. Recommend three minimum target hosts for these services.
# Typically contains the same target hosts as 'shared-infra_hosts' level.
os-infra_hosts:
infra1:
ip: 10.0.236.141
# Define three OpenStack identity hosts:
#
identity_hosts:
infra1:
ip: 10.0.236.141
# Define three OpenStack storage infrastructure hosts:
# cinder api services
storage-infra_hosts:
infra1:
ip: 10.0.236.141
# glance
image_hosts:
infra1:
ip: 10.0.236.141
# placement
placement-infra_hosts:
infra1:
ip: 10.0.236.141
# nova api, conductor, etc services
compute-infra_hosts:
infra1:
ip: 10.0.236.141
# heat
orchestration_hosts:
infra1:
ip: 10.0.236.141
# horizon
dashboard_hosts:
infra1:
ip: 10.0.236.141
# Define three OpenStack network hosts:
# neutron server, agents (L3, etc)
network_hosts:
infra1:
ip: 10.0.236.141
# Define an OpenStack compute host:
# nova hypervisors
compute_hosts:
compute1:
ip: 10.0.236.142
# Define an OpenStack storage host:
# cinder storage host
storage_hosts:
storage1:
ip: 10.0.236.143
container_vars:
cinder_backends:
limit_container_types: cinder_volume
lvm:
volume_group: cinder-volumes
volume_driver: cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name: LVM_iSCSI
iscsi_ip_address: "10.0.244.143"
6.10. Configuramos el archivo user_variables.yml
-
Configuramos el método de instalación como
source
.
install_method: source
En la documentación oficial hay una tabla donde aparece la compatibilidad entre los sistemas operativos y los dos métodos de instalación source
y distro
.
En nuestro caso vamos a utilizar el método de instalación source
que es compatible con la versión Xena
para el sistema operativo Ubuntu 20.04
.
Incrementamos el valor del parámetro: lxc_cache_prep_timeout
.
lxc_cache_prep_timeout: 2700
En la documentación ofcial describen el parámetro lxc_cache_prep_timeout
como:
The maximum amount of time (in seconds) to wait until failing the cache
preparation process. This is necessary to mitigate the issue that can
arise where the cache prep hangs and never fails.
The value is specified in seconds, with the default being 20 minutes.
6.10.1. user_variables.yml
## Debug and Verbose options.
debug: false
# The maximum amount of time (in seconds) to wait until failing the cache
# preparation process. This is necessary to mitigate the issue that can
# arise where the cache prep hangs and never fails.
# The value is specified in seconds, with the default being 20 minutes.
lxc_cache_prep_timeout: 2700
## Installation method for OpenStack services
install_method: source
6.11. Configuramos las credenciales
Configuramos las contraseñas del archivo /etc/openstack_deploy/user_secrets.yml
.
# cd /opt/openstack-ansible
# ./scripts/pw-token-gen.py --file /etc/openstack_deploy/user_secrets.yml
6.12. Comprobamos la integridad de los archivos de instalación
# cd /opt/openstack-ansible/playbooks
# openstack-ansible setup-infrastructure.yml --syntax-check
6.13. Ejecutamos los playbooks
Ejecutamos el playbook encargado de configurar los nodos y crear los contenedores para cada uno de los servicios de OpenStack.
# cd /opt/openstack-ansible/playbooks
# openstack-ansible setup-hosts.yml
Ejecutamos el playbook que se encarga de configurar la infraestructura de OpenStack.
# openstack-ansible setup-infrastructure.yml
Ahora podríamos comprobar que el cluster Galera de base de datos se ha creado de forma correcta. En nuestro caso el cluster sólo estará formado por un nodo.
# ansible galera_container -m shell \
-a "mysql -h localhost -e 'show status like \"%wsrep_cluster_%\";'"
Para finalizar la instalación de OpenStack ejecutamos el playbook setup-openstack.yml
.
# openstack-ansible setup-openstack.yml
Referencia:
6.14. Verificación de la instalación
Desde el nodo de Control con el usuario root
, nos conectamos al contenedor de utilidades.
# lxc-attach -n `lxc-ls -1 | grep utility | head -n 1`
Una vez que estamos dentro dentro del contenedor, ejectuamos el script con las credenciales del usuario admin
.
. ~/openrc
Una vez hecho esto ya podemos utilizar la utilidad openstack
para la línea de comandos CLI.
Seguir los pasos que aparecen en la documentación oficial:
6.15. Comprobamos la configuración de los agentes de red para verificar que el par veth está funcionando de forma correcta
En el nodo de control
En la etiqueta exit
(que es la que hemos definido en OpenStack como red externa) del archivo en el archivo: /etc/neutron/plugins/ml2/linuxbridge_agent.ini
, configuramos la interfaz eth12
.
[linux_bridge]
physical_interface_mappings = vlan:br-vlan,exit:eth12
Reiniciamos los servicios de neutron:
systemctl restart neut*
Podemos comprobar el estado de los bridges de red con el comando:
brctl show
En el nodo de cómputo
En el nodo de cómputo no es necesario tener la etiqueta exit
en el archivo: /etc/neutron/plugins/ml2/linuxbridge_agent.ini
.
[linux_bridge]
physical_interface_mappings = vlan:br-vlan
Reiniciamos los servicios de neutron:
systemctl restart neut*
Referencia:
7. Configuración de OpenStack
7.1. Obtener la contraseña del usuario admin
Para obtener la contraseña del usuario admin
podemos ejecutar el siguiente comando desde el nodo Bastión:
# cat /etc/openstack_deploy/user_secrets.yml | grep keystone_auth_admin_password
7.2. Imágenes disponibles para OpenStack
En la documentación oficial de OpenStack podemos encontrar un listado muy completo de imágenes preparadas para crear instancias en un cloud como el de OpenStack. Podemos encontrar imágenes de Debian, Ubuntu, Fedora, OpenSuse, Windows Server 2012 R, entre otras.
La mayoría de estas imágenes incluyen el paquete cloud-init
que permite realizar una configuración inicial sobre las instancias que se crean en el cloud. Una de las principales tareas de cloud-init
es que permite inyectar una clave pública SSH a la instancia para que podamos conectarnos a ella con una clave privada, ya que la mayoría de las imágenes tiene deshabilitado el mecanismo de autenticación por contraseña.
Referencias:
7.3. Publicar imágenes en OpenStack
Podemos publicar imágenes en OpenStack desde:
-
el panel de control web de Horizon,
-
o desde la línea de comandos con la utilidad OpenStackClient (OSC).
En nuestro caso hemos utilizado la utilidad de línea de comandos. A continuación se describen los pasos que hemos realizado.
En primer lugar, nos conectamos al contenedor de utilidades que está en el nodo de Control.
lxc-attach -n `lxc-ls -1 | grep utility | head -n 1`
Una vez que estamos dentro dentro del contenedor, ejectuamos el script con las credenciales del usuario admin
.
. ~/openrc
Una vez hecho esto ya podemos utilizar la utilidad openstack
para la línea de comandos CLI.
7.3.1. Cirros
# cd /tmp
# wget http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file cirros-0.5.1-x86_64-disk.img \
--progress \
cirros
# openstack image set \
--public \
--protected \
cirros
Los datos de acceso predefinidos son los siguientes:
|
Referencias:
7.3.2. Ubuntu 18.04
# cd /tmp
# wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file bionic-server-cloudimg-amd64.img \
--progress \
ubuntu-bionic
# openstack image set \
--public \
--protected \
ubuntu-bionic
Al crear la instancia podemos definir cuál será el password del usuario ubuntu
.
Launch Instance → Configuracion → Customisation Script
#cloud-config
password: mypasswd
chpasswd: { expire: False }
ssh_pwauth: True
Referencias:
7.3.3. Ubuntu 20.04.4 LTS
# cd /tmp
# wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file /tmp/focal-server-cloudimg-amd64.img \
--progress \
ubuntu-20.04
# openstack image set \
--public \
--protected \
ubuntu-20.04
El usuario predefinido es |
Referencias:
7.3.4. Debian 10
# cd /tmp
# wget http://cdimage.debian.org/cdimage/openstack/current-10/debian-10-openstack-amd64.qcow2
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file debian-10-openstack-amd64.qcow2 \
--progress \
debian-10
# openstack image set \
--public \
--protected \
debian-10
El usuario predefinido es |
Referencias:
7.3.5. Fedora 35
# cd /tmp
# wget https://download.fedoraproject.org/pub/fedora/linux/releases/35/Cloud/x86_64/images/Fedora-Cloud-Base-35-1.2.x86_64.qcow2
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file Fedora-Cloud-Base-35-1.2.x86_64.qcow2 \
--progress \
fedora-35
# openstack image set \
--public \
--protected \
fedora-35
El usuario predefinido es |
Referencias:
7.3.6. Free BSD 13.0
# cd /tmp
# wget https://object-storage.public.mtl1.vexxhost.net/swift/v1/1dbafeefbd4f4c80864414a441e72dd2/bsd-cloud-image.org/images/freebsd/13.0/freebsd-13.0-zfs.qcow2
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file freebsd-13.0-zfs.qcow2 \
--progress \
freebsd-13
# openstack image set \
--public \
--protected \
freebsd-13
El usuario predefinido es |
Referencias:
7.3.7. Windows Server 2012 R2
Descargamos la imagen de Windows Server 2012 R de la web oficial de Windows Cloud Images.
Seleccionamos la imagen para KVM con formato QCOW2 y la descargamos en nuestro equipo.
Una vez que hemos descargado la imagen la copiamos por scp
al nodo de Control y desde ahí la copiamos al contenedor de utilidades infra1_utility_container
.
Desde el nodo de Control podemos acceder al sistema de archivos del contenedor de utilidades a través de la siguiente ruta:
/var/lib/lxc/infra1_utility_container-ID/rootfs/
Donde ID
será el identificador del contenedor.
# cd /tmp
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file windows_server_2012_r2_standard_eval_kvm_20170321.qcow2 \
--progress \
--property os_type=windows \
windows-server-2012
# openstack image set \
--public \
--protected \
windows-server-2012
Referencias:
7.3.8. OpenSuse 15.2
# cd /tmp
# wget https://download.opensuse.org/repositories/Cloud:/Images:/Leap_15.2/images/openSUSE-Leap-15.2-OpenStack.x86_64.qcow2
# openstack image create \
--container-format bare \
--disk-format qcow2 \
--file openSUSE-Leap-15.2-OpenStack.x86_64.qcow2 \
--progress \
opensuse-15-2
# openstack image set \
--public \
--protected \
opensuse-15-2
El usuario predefinido es |
Referencias:
7.4. Obtener un listado de las imágenes
openstack image list
Referencia:
7.5. Eliminar una imagen
openstack image set --unprotected <ID>
openstack image delete <ID>
Donde <ID> puede ser el identificador o el nombre de la imagen.
Referencias:
7.6. Crear imágenes para OpenStack
Referencias:
7.7. Creación de los flavors
openstack flavor create m1.nano \
--ram 128 \
--disk 10 \
--vcpus 1 \
--id 1
openstack flavor create m1.micro \
--ram 256 \
--disk 10 \
--vcpus 1 \
--id 2
openstack flavor create m1.mini \
--ram 512 \
--disk 10 \
--vcpus 1 \
--id 3
openstack flavor create m1.normal \
--ram 1024 \
--disk 10 \
--vcpus 2 \
--id 4
openstack flavor create m1.medium \
--ram 2048 \
--disk 10 \
--vcpus 2 \
--id 5
openstack flavor create m1.large \
--ram 4096 \
--disk 20 \
--vcpus 4 \
--id 6
openstack flavor create m1.xlarge \
--ram 8192 \
--disk 20 \
--vcpus 4 \
--id 7
Tabla resumen con la lista de flavors disponibles.
+----+-----------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+------+------+-----------+-------+-----------+
| 1 | m1.nano | 128 | 10 | 0 | 1 | True |
| 2 | m1.micro | 256 | 10 | 0 | 1 | True |
| 3 | m1.mini | 512 | 10 | 0 | 1 | True |
| 4 | m1.normal | 1024 | 10 | 0 | 2 | True |
| 5 | m1.medium | 2048 | 10 | 0 | 2 | True |
| 6 | m1.large | 4096 | 20 | 0 | 4 | True |
| 7 | m1.xlarge | 8192 | 20 | 0 | 4 | True |
+----+-----------+------+------+-----------+-------+-----------+
Referencias:
7.8. Creación de una red externa
openstack network create \
--external \
--provider-physical-network exit \
--provider-network-type flat \
--enable \
--description "Red Externa" \
red-externa
Entorno de desarrollo
En el entorno de desarrollo vamos a utilizar una red de clase C y el pool de direcciones IPs flotantes que vamos a asignar en el entorno de desarrollo está entre comprendido entre las direcciones 192.168.0.200
y 192.168.0.254
, por lo tanto, en este entorno solo dispondremos de 55`
direcciones IPs flotantes.
openstack subnet create \
--network red-externa \
--allocation-pool start=192.168.0.200,end=192.168.0.254 \
--dns-nameserver 192.168.0.100 \
--gateway 192.168.0.100 \
--subnet-range 192.168.0.0/24 \
--description "Subred Externa" \
subred-externa
Entorno de producción
En el entorno de producción vamos a utilizar una red de clase B y el pool de direcciones IPs flotantes que vamos a asignar está comprendido entre las direcciones 172.16.10.1
y 172.16.14.254
, por lo tanto, en este entorno dispondremos de 1270
direcciones IPs flotantes.
openstack subnet create \
--network red-externa \
--allocation-pool start=172.16.10.1,end=172.16.14.254 \
--dns-nameserver 172.16.0.13 \
--gateway 172.16.0.1 \
--subnet-range 172.16.0.0/16 \
--description "Subred Externa" \
subred-externa
Referencias:
7.9. Crear una red y un router
openstack network create \
--enable \
--description "Red Celia Cloud" \
celia-net
openstack subnet create \
--network celia-net \
--subnet-range 10.0.0.0/24 \
--dns-nameserver 172.16.0.13 \
celia-subnet
En el entorno de desarrollo habrá que modificar el valor del parámetro
|
openstack router create \
--project admin \
celia-router
openstack router add subnet \
celia-router \
celia-subnet
openstack router set \
--external-gateway red-externa \
celia-router
7.10. Añadimos nuevas reglas al grupo de seguridad
Permitimos el tráfico SSH.
openstack security group rule create \
--protocol tcp \
--remote-ip 0.0.0.0/0 \
--dst-port 22 \
default
Permitimos el tráfico ICMP.
openstack security group rule create \
--protocol icmp \
default
Referencias:
7.11. Creación de proyectos y usuarios
Referencias:
8. Operaciones de mantenimiento
8.2. Destruir y volver a crear todos los contenedores
Desde el nodo Bastión:
# cd /opt/openstack-ansible/playbooks
# openstack-ansible lxc-containers-destroy.yml
# openstack-ansible lxc-containers-create.yml
Referencia:
8.3. Cómo comprobar el estado de los servicios
Para comprobar el estado de los servicios podemos ejecutar el comando:
systemctl
o
systemctl status
sobre los nodos de Control, Cómputo, Almacenamiento y sobre los contenedores LXC que se ejecutan en el nodo de Control.
8.4. Cómo reiniciar los servicios
8.4.1. Image service
Desde el contenedor infra1_glance_container
que está en el nodo de Control.
lxc-attach -n `lxc-ls -1 | grep glance_container | head -n 1`
# systemctl restart glance-api
8.4.2. Compute service (Nodo de control)
Desde el contenedor infra1_nova_api_container
que está en el nodo de Control.
lxc-attach -n `lxc-ls -1 | grep nova_api_container | head -n 1`
# systemctl restart nova-api-os-compute
# systemctl restart nova-scheduler
# systemctl restart nova-conductor
# systemctl restart nova-api-metadata
8.4.3. Compute service (Nodo de cómputo)
Desde el nodo de Cómputo.
# systemctl restart nova-compute
8.4.4. Networking service (Nodo de control)
Desde el contenedor infra1_neutron_server_container
que está en el nodo de Control.
lxc-attach -n `lxc-ls -1 | grep infra1_neutron_server_container | head -n 1`
# systemctl restart neutron-server
Los siguientes servicios se están ejecutando directamente sobre el nodo de Control.
# systemctl restart neutron-dhcp-agent
# systemctl restart neutron-l3-agent
# systemctl restart neutron-metadata-agent
# systemctl restart neutron-linuxbridge-agent
8.4.5. Networking service (Nodo de cómputo)
Desde el nodo de Control.
# systemctl restart neutron-linuxbridge-agent
8.4.6. Block Storage service (Nodo de control)
Desde el contenedor infra1_cinder_api_container
que está en el nodo de Control.
lxc-attach -n `lxc-ls -1 | grep infra1_cinder_api_container | head -n 1`
# systemctl restart cinder-api
# systemctl restart cinder-scheduler
9. Errores en los servidores Dell
9.1. Lifecycle Controller not available
El error Lifecycle Controller not available ocurre cuando existe otro proceso que está haciendo uso de iDRAC.
Solución
La documentación oficial de Dell dice que debemos esperar 30
minutos para que finalice el proceso que está haciendo uso de iDRAC. Una vez pasado este tiempo se puede volver a reiniciar el servidor e intentar acceder la utilidad de Lifecycle Controller.
Es posible conocer la lista de procesos que están en cola y consultar cuál es su estado desde la interfaz web de iDRAC.
Si pasado un tiempo el problema no se soluciona y no aparece ningún proceso en la cola, podemos conectarnos por SSH al interfaz iDRAC del servidor y resetear el iDRAC (Integrated Dell Remote Access Controller).
Ejemplo
Paso 1. Nos conectamos por SSH al interfaz iDRAC del servidor.
# ssh root@192.168.1.2
Paso 2. Ejecutamos el comando racreset
para resetear el iDRAC.
racadm>> racreset soft
A continuación se muetra la ayuda del comando racreset
.
racadm>>help racreset
racreset -- perform a RAC reset operation
Usage:
racadm racreset <type>
racadm racreset <type> -f
-------------------------------------------------------------------------------
Valid Options:
<type> : What type of reset to perform (soft or hard). Must be one of:
soft : perform a soft reset
hard : perform a hard reset
-f : force racreset
-------------------------------------------------------------------------------
Usage Examples:
- Perform a soft reset of the idrac
racadm racreset soft
- Perform a hard reset of the idrac
racadm racreset hard
- Force a soft reset of the idrac
racadm racreset soft -f
- Force a hard reset of the idrac
racadm racreset hard -f
-------------------------------------------------------------------------------
10. Errores durante la instalación de OpenStack
A continuación se describen algunos de los errores que han aparecido durante la instalación de OpenStack.
10.1. Error al ejecutar: openstack-ansible setup-openstack.yml
Al ejecutar el playbook openstack-ansible setup-openstack.yml
obtenemos un error. La instalación se queda detenida en este paso.
[18336.924339] Out of memory: Killed process 148504 (mariadbd) total-vm:10194672kB, anon-rss:316400kB, file-rss:0kB, shmem-rss:0kB, UID:106 pgtables:1372kB oom_score_adj:0
[20643.129225] Out of memory: Killed process 153371 (beam.smp) total-vm:3342996kB, anon-rss:192340kB, file-rss:0kB, shmem-rss:57388kB, UID:998 pgtables:884kB oom_score_adj:0
Solución: Aumentar la RAM del equipo o ampliar la swap.
10.2. Error al ejecutar: openstack-ansible setup-hosts.yml
Durante la ejecución del playbook openstack-ansible setup-hosts.yml
se puede producir un error al reiniciar el servicio nginx del contenedor infra1_repo_container porque no es posible iniciarlo en la dirección IP y puerto que se ha configurado.
Cuando ocurre este error podemos conectarnos al contenedor infra1_repo_container y revisar si el archivo de configuración de nginx es correcto ejecutando el comando:
nginx -t
Si el comando se ejecuta sin mostrar ningún mensaje de error, entonces la configuración es correcta, sin embargo si hay algún error con la dirección IP y el puerto nos aparcerá un mensaje similar a éste:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] bind() to 172.29.238.113:9191 failed (99: Cannot assign requested address)
nginx: configuration file /etc/nginx/nginx.conf test failed
Solución: Revisar la configuración del archivo openstack_user_config.yml
porque puede ser que la dirección IP que se haya configurado en el parámetro external_lb_vip_address
sea incorrecta. Esta dirección tiene que tener la dirección IP pública del nodo de control
10.3. Error al subir una imagen a OpenStack desde el panel web de Horizon
La opción de subir imágenes a OpenStack desde el panel web de Horizon está desactivada por defecto, sin embargo, sí se pueden subir desde la utilidad de línea de comandos del contenedor de utilidades del nodo de Control.
En la documentación oficial explican que hay que configurar la variable HORIZON_IMAGES_UPLOAD_MODE
con el valor direct
, en el servicio de Horizon para permitir subir imágenes directamente al servicio Glance desde el panel web de Horizon.
Referencia:
10.4. Error al crear un volumen LVM
Si el servicio de cinder se ha configurado para trabajar con volúmenes LVM y iSCSI hay que conectarse al nodo de almacenamiento y comprobar que el volumen de cinder está creado.
vgdisplay
Si no aparece en el listado habrá que crearlo.
En nuestro caso nos aparecía el siguiente mensaje de error en el entorno de desarrollo.
Device /dev/sdb excluded by a filter.
Para solucionarlo, editamos el archivo de configuración de LVM.
# nano /etc/lvm/lvm.conf
Revisamos los filtros activos.
devices {
...
filter = [ "a/.*/" ]
...
Reiniciamos el servicio de LVM.
# systemctl restart lvm
Referencia:
10.5. Cómo reiniciar el servicio libvirtd
en el nodo de Cómputo
En primer lugar detenemos el servicio libvirtd
:
systemctl stop libvirtd
Reiniciamos los siguientes servicios:
systemctl restart libvirtd-ro.socket
systemctl restart libvirtd-tls.socket
systemctl restart libvirtd.socket
systemctl restart libvirtd-admin.socket
Volvemos a iniciar el servicio libvirtd
:
systemctl start libvirtd
Podemos comprobar el estado del servicio para verificar que todo está funcionando correctamente.
systemctl status libvirtd
11. Referencias
Guía oficial de instalación
Anexos:
Ejemplos de instalación de Openstack con Ansible
Libros
-
Production Ready OpenStack - Recipes for Successful Environments.
Redes
Operaciones:
Administración:
OpenStackClient:
Recursos imprescindibles del IES Gonzalo Nazareno:
Recursos de interés de la Universidad de Almería:
12. Licencia
Este contenido está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.