Uso de Openstack para crear un escenario de despliegue

Í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.

comments powered by Disqus

Relacionados

Enrutamiento dinámico con OSPF usando routers Cisco en GNS3

OSPF (Open Shortest Path First), “Abrir el camino más corto primero” en español, es un protocolo de red para enrutamiento dinámico que usa el algoritmo Dijkstra, para calcular la ruta más corta entre dos nodos.

Leer

Creación de política de grupo en Windows Active Directory

Una directiva de grupo es un conjunto de reglas que controlan el entorno de trabajo de cuentas de usuario y cuentas de equipo. La directiva de grupo permite gestionar y configurar de forma centralizada sistemas operativos, aplicaciones y configuración de los usuarios en un entorno de Directorio Activo.

Leer

Cómo simular un servidor PostgreSQL en GNS3

PostgreSQL es uno de los servidores de bases de datos más usados. Se trata de un software libre y portente que permite almacenar y gestionar grandes volúmenes de información. En este post se explica cómo simularlo en un escenario de GNS3.

Leer