13 - Verificar la instalación mínima de OpenStack
En este post realizamos una comprobación de extremo a extremo desde el nodo controlador (controller01). Primero verificamos los agentes de red, luego creamos la red y la subred internas, configuramos un router, preparamos la red externa, revisamos imagen y flavor, generamos un par de claves, lanzamos una instancia y validamos la conectividad (ICMP/SSH) mediante IP flotante. Mantenemos salidas reales para comparar.
Antes de comenzar cargamos nuestras credenciales (si no están ya en el entorno):
source ~/admin-openrc
Paso 1: Verificar agentes de red
Comprobamos que los agentes Neutron (linuxbridge, DHCP, L3, metadata) estén vivos y en estado UP:
vagrant@controller01:~$ openstack network agent list
Salida de ejemplo:
+------------------+------------------+--------------+-------------------+-------+-------+------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+------------------+------------------+--------------+-------------------+-------+-------+------------------+
| 94434668-d4b3- | Linux bridge | controller01 | None | :-) | UP | neutron- |
| 4960-8363- | agent | | | | | linuxbridge- |
| 54c1be53d0a5 | | | | | | agent |
| a2717b0e-fd22- | Linux bridge | compute01 | None | :-) | UP | neutron- |
| 4e52-910c- | agent | | | | | linuxbridge- |
| 556f3ad29a67 | | | | | | agent |
| ca0e8819-add4- | DHCP agent | controller01 | nova | :-) | UP | neutron-dhcp- |
| 4c03-991f- | | | | | | agent |
| 35d2f5bf112d | | | | | | |
| d121bb9a-d44d- | L3 agent | controller01 | nova | :-) | UP | neutron-l3-agent |
| 4ae0-829e- | | | | | | |
| 6623d17e8e13 | | | | | | |
| d6849ebc-86f2- | Metadata agent | controller01 | None | :-) | UP | neutron- |
| 4ed2-80fc- | | | | | | metadata-agent |
| cf3f9fce7d76 | | | | | | |
+------------------+------------------+--------------+-------------------+-------+-------+------------------+
Nota: si algún agente aparece como DOWN, revisa sus logs en /var/log/neutron/.
Paso 2: Crear red interna y subred
Creamos la red de proyecto test-net que usará la instancia:
vagrant@controller01:~$ openstack network create test-net
Salida de ejemplo (puede variar el id y provider:segmentation_id):
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2025-11-02T23:19:16Z |
| description | |
| dns_domain | None |
| id | f3b76e27-fe00-4ad1-88a1-fd3528c4e412 |
| mtu | 1450 |
| name | test-net |
| port_security_enabled | True |
| project_id | 69782314638942ef831e8754cda5e41d |
| provider:network_type | vxlan |
| provider:physical_network | None |
| provider:segmentation_id | 612 |
| router:external | Internal |
| shared | False |
| status | ACTIVE |
+---------------------------+--------------------------------------+
Creamos la subred test-subnet dentro de la red (definimos rango y gateway):
vagrant@controller01:~$ openstack subnet create --network test-net --subnet-range 192.168.50.0/24 test-subnet
Salida de ejemplo:
+----------------------+--------------------------------------+
| Field | Value |
+----------------------+--------------------------------------+
| allocation_pools | 192.168.50.2-192.168.50.254 |
| cidr | 192.168.50.0/24 |
| created_at | 2025-11-02T23:19:21Z |
| enable_dhcp | True |
| gateway_ip | 192.168.50.1 |
| id | 6f9e499d-6b04-4f92-b4fa-3f4c4df225f5 |
| ip_version | 4 |
| name | test-subnet |
| network_id | f3b76e27-fe00-4ad1-88a1-fd3528c4e412 |
| router:external | False |
| status | ACTIVE |
+----------------------+--------------------------------------+
Paso 3: Crear router y asociar la subred
Creamos el router test-router que conectará la red interna con la externa:
vagrant@controller01:~$ openstack router create test-router
Salida de ejemplo inicial (sin gateway externo todavía):
+-------------------------+--------------------------------------+
| Field | Value |
+-------------------------+--------------------------------------+
| admin_state_up | UP |
| created_at | 2025-11-02T23:19:25Z |
| distributed | False |
| external_gateway_info | null |
| ha | False |
| id | 954c7398-6e05-42d9-bd81-2a780835b832 |
| name | test-router |
| status | ACTIVE |
+-------------------------+--------------------------------------+
Le añadimos la subred interna como interfaz para que gestione 192.168.50.0/24:
vagrant@controller01:~$ openstack router add subnet test-router test-subnet
Paso 4: Crear red externa y establecer puerta de enlace
Creamos la red externa ext-net (tipo flat) que representará la salida al exterior:
vagrant@controller01:~$ openstack network create --external \
--provider-physical-network provider \
--provider-network-type flat ext-net
Creamos la subred externa ext-subnet con su pool de IP flotantes:
vagrant@controller01:~$ openstack subnet create --network ext-net \
--subnet-range 192.168.121.0/24 \
--gateway 192.168.121.1 \
--allocation-pool start=192.168.121.200,end=192.168.121.254 \
--dns-nameserver 8.8.8.8 ext-subnet
Asociamos la red externa al router para habilitar SNAT y tráfico saliente:
vagrant@controller01:~$ openstack router set test-router --external-gateway ext-net
Verificamos los datos del router (debe mostrar external_fixed_ips y enable_snat: true):
vagrant@controller01:~$ openstack router show test-router
Paso 5: Notas rápidas de diagnóstico
- Agente DOWN: revisar
/var/log/neutron/*y comprobar servicio systemd. - Error creando red externa: validar
bridge_mappingsy existencia del dispositivo físico / bridge. No Network found for provider: nombre mal escrito o falta definición en ML2.- MTU baja / conectividad errática: comparar
mtude la red con la interfaz física y ajustar si procede.
Paso 6: Imagen, flavor y par de claves
Verificamos que exista la imagen base (por ejemplo cirros):
vagrant@controller01:~$ openstack image list
Creamos un par de claves testkey y protegemos el fichero privado:
vagrant@controller01:~$ openstack keypair create testkey > testkey.pem
vagrant@controller01:~$ chmod 600 testkey.pem
Si no existe el flavor m1.tiny, lo creamos (RAM 512 MiB, disco 1 GiB, 1 vCPU):
openstack flavor create --id m1.tiny --ram 512 --disk 1 --vcpus 1 m1.tiny
Lanzamos la instancia test-vm en la red interna (el net-id corresponde a la red test-net; puede diferir en tu entorno):
vagrant@controller01:~$ openstack server create --flavor m1.tiny --image cirros --nic net-id=9d446c54-f58c-4301-a515-428598f460ca --security-group default --key-name testkey test-vm
Comprobamos que su estado pase de BUILD a ACTIVE:
openstack server list
openstack server show test-vm | grep -E "status|addresses|flavor|image"
Si se queda en BUILD/ERROR revisamos openstack console log show test-vm y los logs de Nova.
Si necesitamos acceso SSH/ICMP desde fuera, añadimos reglas al security group default (solo para laboratorio; en producción usar reglas mínimas necesarias):
openstack security group rule create --proto tcp --dst-port 22 default
openstack security group rule create --proto icmp default
Creamos una IP flotante y la asociamos (sustituye <FLOATING_IP> por la dirección asignada):
openstack floating ip create ext-net
openstack server add floating ip test-vm <FLOATING_IP>
Paso 7: Acceder a la instancia y validar red
Accedemos por SSH usando la IP flotante (si la clave fallara, la contraseña por defecto de CirrOS es gocubsgo):
vagrant@controller01:~$ ssh -i .ssh/testkey.pem cirros@192.168.121.212
Verificamos la interfaz y el hostname dentro de la instancia:
$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
inet 192.168.50.225/24 brd 192.168.50.255 scope global eth0
valid_lft forever preferred_lft forever
$ hostname
test-vm
Comprobamos la conectividad con la puerta de enlace interna del router y con Internet:
$ ping 192.168.50.1 -c 1
PING 192.168.50.1 (192.168.50.1): 56 data bytes
64 bytes from 192.168.50.1: seq=0 ttl=64 time=0.650 ms
--- 192.168.50.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.650/0.650/0.650 ms
$ ping 1.1.1.1 -c 1
PING 1.1.1.1 (1.1.1.1): 56 data bytes
64 bytes from 1.1.1.1: seq=0 ttl=54 time=9.840 ms
--- 1.1.1.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 9.840/9.840/9.840 ms
Paso 8: Validar conectividad desde el host
Desde el host físico validamos el ping a la IP flotante y confirmamos que la IP interna no es accesible (red aislada):
javiercruces@FJCD-PC:~/openstack-vagrant-ansible/manual-install (main) [prd-eu-west|]
$ ping -c 1 192.168.121.212
PING 192.168.121.212 (192.168.121.212) 56(84) bytes of data.
64 bytes from 192.168.121.212: icmp_seq=1 ttl=63 time=0.824 ms
--- 192.168.121.212 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.824/0.824/0.824/0.000 ms
javiercruces@FJCD-PC:~/openstack-vagrant-ansible/manual-install (main) [prd-eu-west|]
$ ping -c 1 192.168.50.225
PING 192.168.50.225 (192.168.50.225) 56(84) bytes of data.
^C
--- 192.168.50.225 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
Nota: la IP interna (192.168.50.x) está aislada por Neutron; solo la IP flotante es alcanzable desde fuera.
Con esto hemos comprobado que todos los componentes que hemos instalado funcionan perfectamente.
