Uso de Openstack para crear un escenario de despliegue
- Francisco Javier Huete
- Servicios
- January 13, 2025
Índice
En este post se crea un escenario en OpenStack que consta de 4 máquinas: 2 instancias y dos contenedores LXC que se ejecutan en una de estas dos instancias. Este escenario está orientado a alojar diferentes servicios en cada una de las máquinas en el futuro.
Creación de la infraestructura de red
El primer paso en la creación de la infraestructura de red de este escenario es crear un nuevo router en el proyecto de OpenStack.
openstack router create RouterPractica
Este router está conectado a una red llamada Red Intra
.
openstack network create 'Red Intra'
openstack subnet create --network 'Red Intra' --subnet-range 10.0.200.0/24 --dns-nameserver 172.22.0.1 --gateway 10.0.200.1 --dhcp subred-intra
openstack router set RouterPractica --external-gateway ext-net
openstack router add subnet RouterPractica subred-intra
En el escenario hay una segunda red.
openstack network create 'Red DMZ de fhuemej702'
openstack subnet create --network 'Red DMZ' --subnet-range 172.16.0.0/16 --no-dhcp --gateway none subred-dmz
Para conectar esta nueva red al router se necesita un puerto que le configure la IP estática para que esta interfaz del router funcione como puerta de enlace de la red DMZ.
openstack port create --network 'Red DMZ' --fixed-ip ip-address=172.16.0.1 luffy
Creación de instancias
Las instancias del escenario se configuran usando un fichero cloud-init.
Luffy
El contenido del fichero cloud-init de Luffy
es el siguiente:
#cloud-config
# Actualiza los paquetes
package_update: true
package_upgrade: true
# Configura el hostname y el fqdn
fqdn: luffy.javi.gonzalonazareno.org
hostname: luffy
manage_etc_hosts: true
# Crear dos usuarios, configura el acceso por sudo y añade clave pública ssh
users:
- name: usuario
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: profesor
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Cambia las contraseña a los usuarios creados
chpasswd:
expire: False
users:
- name: root
password: root
type: text
- name: usuario
password: usuario
type: text
Tras escribir el fichero, se puede usar para crear una instancia. En su creación, esta instancia se asocia a un volumen y a dos interfaces de red.
openstack server create --flavor vol.medium --image "Debian 12 Bookworm" --security-group default --key-name ClaveSSH --boot-from-volume 15 --user-data cloud-config-luffy.yaml --network 'Red Intra' --port luffy luffy
Zoro
El fichero cloud-init de zoro
es el siguiente:
#cloud-config
# Actualiza los paquetes
package_update: true
package_upgrade: true
# Configura el hostname y el fqdn
fqdn: zoro.javi.gonzalonazareno.org
hostname: zoro
manage_etc_hosts: true
# Crear dos usuarios, configura el acceso por sudo y añade clave pública ssh
users:
- name: usuario
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: profesor
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Cambia las contraseña a los usuarios creados
chpasswd:
expire: False
users:
- name: root
password: root
type: text
- name: usuario
password: usuario
type: text
Para crear esta instancia se crea un volumen basado en la imagen de Rocky Linux 9.
openstack volume create --image 'Rocky Linux 9' --size 15 zoro
Y, a partir de este volumen, se crea la instancia.
openstack server create --flavor vol.medium --volume zoro --security-group default --key-name ClaveSSH --user-data cloud-config-zoro.yaml --network 'Red Intra' zoro
Note
Aunque esta instancia se debe conectar a la red DMZ, debe estar conectada a una red con un servidor DHCP para poder establecer una configuración en ella usando la herramienta cloud-init. Por eso, en su creación se conecta a la red Intra y, posteriormente, se desconecta de esa red y se conecta a la red DMZ.
Para conectar esta instancia a la Red DMZ
hay que usar un puerto que le permita mantener un direccionamiento IP estático.
openstack port create --network 'Red DMZ' --fixed-ip ip-address=172.16.0.200 zoro
A continuación, se debe desconectar la instancia de la Red Intra
y conectar al puerto recién creado en la Red DMZ
.
openstack server remove port zoro 8d6dd153-862c-4773-aaa8-74f04cade4b6
openstack server add port zoro zoro
Al llevar a cabo este cambio, es necesario configurar la interfaz de red de zoro
de forma manual. Esta instancia usa un sistema operativo Rocky Linux 9 y, por tanto, configura sus interfaces de red con Network Manager
.
nmcli con edit id 'Wired connection 1'
nmcli> set ipv4.addresses 172.16.0.200
nmcli> set ipv4.gateway 172.16.0.1
nmcli> set ipv4.dns 172.22.0.1
nmcli> save
nmcli con up id 'Wired connection 1'
Por último, para que zoro
pueda tener acceso a Internet hay que configurar el funcionamiento de luffy
como router.
apt install iptables iptables-persistent
iptables -t nat -A POSTROUTING -o ens3 -s 172.16.0.0/16 -j MASQUERADE
iptables-save > /etc/iptables/rules.v4
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
Además, hay que eliminar los grupos de seguridad de los puertos implicados para que la instancia pueda enrutar el tráfico.
openstack port set --no-security-group --disable-port-security luffy
openstack port set --no-security-group --disable-port-security 09edfc05-0ddf-47ba-8f24-d5a4752b424b
openstack port set --no-security-group --disable-port-security zoro
Tras configurar adecuadamente las instancias, se puede generar una instantánea de los volúmenes asociados para facilitar su recuperación en caso de que sea necesario.
openstack volume snapshot create --force --volume zoro zoro-backup
openstack volume snapshot create --force --volume 3fb035f6-74f4-4ecf-928a-98ce00b04978 luffy-backup
Creación de contenedores
Las dos máquinas restantes en el escenario son contenedores LXC en la instancia luffy
.
El primer paso para poder tener contenedores alojados en la instancia es crear un bridge al que se puedan conectar para tener acceso a Internet. La creación del bridge se puede hacer con varias herramientas. En este caso, se usa bridge-utils
.
sudo apt install bridge-utils
Para configurar el bridge se debe modificar el fichero de configuración de la instancia. Aunque luffy
usa un sistema operativo Debian 12, las instancias de cloud de Debian configuran sus interfaces de red usando netplan
por compatibilidad con cloud-init
. Así, para crear el bridge al que se van a conectar los contenedores desde un fichero de configuración se debe editar el fichero /etc/netplan/50-cloud-init.yaml
bridges:
br-intra:
addresses:
- 192.168.0.1
mtu: 1442
nameservers:
addresses:
- 172.22.0.1
Finalmente, se aplica la configuración añadida en el fichero:
sudo netplan apply
Una vez que la instancia ya cuenta con el bridge al que se tienen que conectar los contenedores, se pueden crear las dos nuevas máquinas. Para ello se instala LXC
.
sudo apt install lxc
Y se crean los contenedores para las nuevas máquinas: nami
y sanji
.
sudo lxc-create -n nami -t ubuntu -- -r jammy
sudo lxc-create -n sanji -t ubuntu -- -r jammy
Para conectar los contenedores al bridge hay que editar los ficheros de configuración de cada uno de ellos para añadir la siguiente línea. El de nami
es /var/lib/lxc/nami/config. En este fichero se puede configurar también el mtu para que se adapte al que usa la instalación de OpenStack en la que se está trabajando.
lxc.net.0.link = br-intra
lxc.net.0.mtu = 1442
Y el de sanji
es /var/lib/lxc/sanji/config.
lxc.net.0.link = br-intra
lxc.net.0.mtu = 1442
Para configurar el direccionamiento estático en cada uno de los contenedores, hay que acceder a ellos.
sudo lxc-start nami
sudo lxc-attach nami
Primero, nami
tendrá la dirección IP 192.168.0.2. Como el contenedor usa un sistema operativo Ubuntu, este direccionamiento se configura en el fichero /etc/netplan/10-lxc.yaml.
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.0.2/24
routes:
- to: default
via: 192.168.0.1
mtu: 1442
nameservers:
addresses:
- 172.22.0.1
Después, se aplica la nueva configuración
netplan apply
Para configurar sanji
se le asigna la IP 192.168.0.3 en el fichero /etc/netplan/10-lxc.yaml. Para acceder al contenedor:
sudo lxc-start sanji
sudo lxc-attach sanji
Se modifica el fichero de configuración de red:
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.0.3/24
routes:
- to: default
via: 192.168.0.1
mtu: 1442
nameservers:
addresses:
- 172.22.0.1
Y, por último, se aplica la nueva configuración:
netplan apply
Adicionalmente, se puede hacer que los contenedores se enciendan al iniciar luffy
añadiendo en su fichero de configuración la línea:
lxc.start.auto = 1
Los contenedores creados en luffy
están conectados al bridge br-intra
pero no tienen conexión a Internet. Para que puedan salir al exterior hay que añadir una regla de iptables
en luffy
para que haga SNAT.
sudo iptables -t nat -A POSTROUTING -o ens3 -s 192.168.0.0/24 -j MASQUERADE
iptables-save > /etc/iptables/rules.v4
En este caso práctico se pide que cada contenedor tenga los paquetes de la distribución actualizados, el FQDN y el hostname correctamente configurado y dos usuarios.
Para actualizar los paquetes:
sudo apt update && sudo apt upgrade
Para configurar el FQDN se modifica el fichero /etc/hosts, que debe contar con una línea como esta:
127.0.1.1 nami.javi.gonzalonazareno.org nami
Finalmente se crean los dos usuarios. Primero uno que se llama así, usuario
:
adduser usuario
Y se configura el acceso por SSH.
su - usuario
mkdir .ssh
cd .ssh
nano authorized_keys
En el fichero authorized_keys se añade la clave pública del usuario.
Para que el usuario pueda usar sudo sin contraseña se edita el fichero /etc/sudoers para añadir la siguiente línea:
usuario ALL=(ALL) NOPASSWD:ALL
El mismo proceso se repite en ambos contenedores y para la creación de los dos usuarios.