Despliegue de OpenStack con Packstack y VirtualBox

Teoría de VirtualBox Bridged Networking:

Prerequisitos (Controller node)

  1. Parar servicios de firewalld y NetworkManager:
'#' systemctl stop firewalld NetworkManager
  1. Deshabilitar servicios de firewalld y NetworkManager:
'#' systemctl disable firewalld NetworkManager
  1. Habilitar e iniciar servicio network:
'#' systemctl enable network
'#' systemctl start network
  1. Deshabilitar SE Linux
'#' cat /etc/selinux/config

SELINUX=disabled
SELINUXTYPE=targeted
  1. Configuración de interfaz de red bridged:
'#' cat /etc/sysconfig/network-scripts/ifcfg-enp0s3

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s3"
UUID="18ff926b-73ef-4f82-bb10-8481724746e0"
DEVICE="enp0s3"
ONBOOT="yes"
IPADDR="192.168.1.100"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
  1. Configuración de interfaz de red aislada:
  • IPADDR: Dirección IP dentro de la red aislada
'#' cat /etc/sysconfig/network-scripts/ifcfg-enp0s8

DEVICE="enp0s8"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="10.10.10.100"
NETMASK=255.255.255.0
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
DNS1="8.8.8.8"
ONBOOT="yes"
  1. Configuración del hostname:
'#' cat /etc/sysconfig/network

HOSTNAME=controllernode1.localdomain

'#' cat /etc/hostname

controllernode1.localdomain

'#' hostname controllernode1.localdomain

'#' cat /etc/hosts

127.0.0.1   controllernode1 controllernode1.localdomain localhost4 localhost4.localdomain4
::1         controllernode1 controllernode1.localdomain localhost6 localhost6.localdomain6
  1. Reiniciar el servicio de network y reiniciar el sistema:
'#' systemctl restart network
'#' reboot
  1. Comprobar que SE Linux está desactivado:
'#' getenforce

Disabled
  1. Clonar la VM Controller Node desde VirtualBox 2 veces. Una VM será el Compute Node 1 y la otra será el Compute Node 2. Luego, en VirtualBox para cada VM:
  • Reconfigurar la memoria RAM y CPUs
  • Randomizar las direcciones MAC de los 2 adaptadores

Configuración de Compute Node 1

  1. Configuración de interfaz de red bridged:
'#' cat /etc/sysconfig/network-scripts/ifcfg-enp0s3

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s3"
UUID="02b06617-95a0-4dfa-9293-16e756b2eccc"
DEVICE="enp0s3"
ONBOOT="yes"
IPADDR="192.168.1.101"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
  1. Configuración de interfaz de red aislada:
'#' cat /etc/sysconfig/network-scripts/ifcfg-enp0s8

DEVICE="enp0s8"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="10.10.10.101"
NETMASK=255.255.255.0
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
DNS1="8.8.8.8"
ONBOOT="yes"
  1. Configuración del hostname:
'#' hostname computenode1.localdomain

'#' cat /etc/sysconfig/network

HOSTNAME=computenode1.localdomain

'#' cat /etc/hostname

computenode1.localdomain

'#' cat /etc/hosts

127.0.0.1   computenode1 computenode1.localdomain localhost4 localhost4.localdomain4
::1         computenode1 computenode1.localdomain localhost6 localhost6.localdomain6
  1. Reiniciar el servicio de network y reiniciar el sistema:
'#' systemctl restart network
'#' reboot

Configuración de Compute Node 2

  1. Configuración de interfaz de red bridged:
'#' cat /etc/sysconfig/network-scripts/ifcfg-enp0s3

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s3"
UUID="12b06617-95a0-4dfa-9293-16e756b2eccd"
DEVICE="enp0s3"
ONBOOT="yes"
IPADDR="192.168.1.102"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
  1. Configuración de interfaz de red aislada:
'#' cat /etc/sysconfig/network-scripts/ifcfg-enp0s8

DEVICE="enp0s8"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="10.10.10.102"
NETMASK=255.255.255.0
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
DNS1="8.8.8.8"
ONBOOT="yes"
  1. Configuración del hostname:
'#' hostname computenode2.localdomain

'#' cat /etc/sysconfig/network

HOSTNAME=computenode2.localdomain

'#' cat /etc/hostname

computenode2.localdomain

'#' cat /etc/hosts

127.0.0.1   computenode2 computenode2.localdomain localhost4 localhost4.localdomain4
::1         computenode2 computenode2.localdomain localhost6 localhost6.localdomain6
  1. Reiniciar el servicio de network y reiniciar el sistema:
'#' systemctl restart network
'#' reboot

Descarga de paquetes (Controller node)

  1. Descargar OpenStack:
  • Para versiones de OpenStack nuevas (queens,rocky,stein):
'#' yum install -y centos-release-openstack-queens
  • Para versiones de OpenStack antiguas (pike,ocata,newton,…):
'#' yum install -y https://repos.fedorapeople.org/repos/openstack/openstack-ocata/rdo-release-ocata-0.noarch.rpm
  1. Actualizar paquetes:
'#' yum update -y
  1. Descargar Packstack:
'#' yum install -y openstack-packstack

Instalación de OpenStack con PackStack (Controller node)

'#' packstack --allinone --provision-demo=n --os-neutron-ovs-bridge-mappings=extnet:br-ex --os-neutron-ml2-type-drivers=vxlan,flat

Cliente de Línea de comandos de Packstack:

  • --allinone: equivalente a --install-hosts=<local ipaddr> --novanetwork-pubif=<dev> --novacompute-privif=lo --novanetwork-privif=lo --os-swift-install=y. Esta opción puede usarse para instalar un nodo all-in-one OpenStack en este host.
  • --provision-demo=n: especificar y para aprovisionar el uso de demostración y pruebas [y , n]
  • --os-neutron-ovs-bridge-mappings=extnet:br-ex: Lista separada por comas de mapeos del bridge para el plugin OpenStack Networking Open vSwitch. Cada tupla en la lista debe estar en el formato <physical_network>:<ovs_bridge>.
  • --os-neutron-ovs-bridge-interfaces=br-ex:enp3s0: Lista separada por comas de pares Open vSwitch <bridge>:<interface>. La interfaz será añadida al bridge asociado.
  • --os-neutron-ml2-type-drivers=vxlan,flat: añade los tipos de red flat y vxlan a los tipos soportados por la instalación.

Configuración post-instalación (Controller node)

Interfaces/OVS-bridges creados luego de la instalación de Packstack:

  • ovs-system: interfaz creada al instalar OVS (no es un OVS bridge)
  • br-ex: External bridge. Usado para conectarse a la red física externa. Tiene agregado el puerto de la VM con salida a la red externa (enp0s3).
  • br-int: Integration bridge. Bridge del tráfico entre instancias, el túnel y bridges externos.
  • br-tun: Tunnel bridge. Para crear túneles VXLAN o GRE entre nodos.
  1. Configurar a la interfaz física enp0s3 como un puerto en el OVS br-ex. Haremos a la interfaz física enp3s0 solo un puerto capa 2 en el bridge y le daremos la IP al bridge mismo:
'#' cat /etc/sysconfig/network-scripts/ifcfg-enp0s3

TYPE=OVSPort
NAME=enp0s3
DEVICE=enp0s3
ONBOOT=yes
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
  1. Configurar el bridge externo br-ex:
'#' cat /etc/sysconfig/network-scripts/ifcfg-br-ex

DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
IPV4_FAILURE_FATAL=no
IPV6INIT=no
DNS1=8.8.8.8
ONBOOT=yes
  1. Reiniciar el servicio network para hacer efectivo los cambios:
'#' systemctl restart network
  1. Crear la red externa con Neutron:
  • Primero usar el archivo Keystone RC con las credenciales admin de OpenStack:
'#' pwd
/root

'#' ls
anaconda-ks.cfg  keystonerc_admin  packstack-answers-20190920-224100.   txt

'#' source keystonerc_admin
  • Crear la red externa ext-net con Neutron:
# Con Neutron (deprecated): neutron net-create external_network --provider:network_type flat --provider:physical_network extnet --router:external
'#' openstack network create external_network --provider-network-type flat --provider-physical-network extnet --external

+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2020-02-10T18:48:05Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | f5dad5c1-bba9-41c5-844f-bd19a6a124aa |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1500                                 |
| name                      | external_network                     |
| port_security_enabled     | True                                 |
| project_id                | 0c2bc29526f4465c95b8eaefcfae7b7c     |
| provider:network_type     | flat                                 |
| provider:physical_network | extnet                               |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 5                                    |
| router:external           | External                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2020-02-10T18:48:05Z                 |
+---------------------------+--------------------------------------+
  1. Crear una subred pública con un rango de asignación fuera del rango DHCP de nuestra red física y configurar el gateway de nuestra red como el gateway de la red externa:
# Con Neutron (deprecated): neutron subnet-create --name public_subnet --enable_dhcp=False --allocation-pool start=192.168.1.150,end=192.168.1.200 --gateway=192.168.1.1 external_network 192.168.1.0/24
'#' openstack subnet create --network external_network --allocation-pool start=192.168.1.150,end=192.168.1.200 --gateway=192.168.1.1 --subnet-range 192.168.1.0/24 --no-dhcp public_subnet

+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| allocation_pools  | 192.168.1.150-192.168.1.200          |
| cidr              | 192.168.1.0/24                       |
| created_at        | 2020-02-10T18:48:35Z                 |
| description       |                                      |
| dns_nameservers   |                                      |
| enable_dhcp       | False                                |
| gateway_ip        | 192.168.1.1                          |
| host_routes       |                                      |
| id                | a6ae14ab-2287-4d0d-b8eb-0f503792f32c |
| ip_version        | 4                                    |
| ipv6_address_mode | None                                 |
| ipv6_ra_mode      | None                                 |
| name              | public_subnet                        |
| network_id        | f5dad5c1-bba9-41c5-844f-bd19a6a124aa |
| prefix_length     | None                                 |
| project_id        | 0c2bc29526f4465c95b8eaefcfae7b7c     |
| revision_number   | 0                                    |
| segment_id        | None                                 |
| service_types     |                                      |
| subnetpool_id     | None                                 |
| tags              |                                      |
| updated_at        | 2020-02-10T18:48:35Z                 |
+-------------------+--------------------------------------+

Podemos asignar IPs públicas a nuestras intancias desde este rango de asignación.

Instalación de Compute Nodes (Controller Node)

  1. Realizar un backup del answer file generado automáticamente por Packstack cuando se realizó la instalación all-in-node de OpenStack:
'#' cp packstack-answers-20200124-103757.txt packstack-answers-20200124-103757.txt.backup
  1. Editar el archivo answer file para que los túnesles sean creados desde la segunda interfaz añadida a las VMs CentOS:
# Interface for the Open vSwitch tunnel. Packstack overrides the IP
# address used for tunnels on this hypervisor to the IP found on the
# specified interface (for example, eth1).
CONFIG_NEUTRON_OVS_TUNNEL_IF=enp0s8
  1. Seguir editando el archivo y escribir la subred de nuestra segunda NIC, de forma que Packstack haga las modificaciones para usar esta red para túneles.
# Comma-separated list of subnets (for example,
# 192.168.10.0/24,192.168.11.0/24) used for sending tunneling packets.
# This is used to configure IP filtering to accept tunneling packets
# from these subnets instead of specific IP addresses of peer nodes.
# This is useful when you add existing nodes to EXCLUDE_SERVERS
# because, in this case, packstack cannot modify the IP filtering of
# the existing nodes.
CONFIG_NEUTRON_OVS_TUNNEL_SUBNETS=10.10.10.0/24
  1. Configurar la direcciones IP de los nodos que tendrán el servicio de Compute. En este caso los 3 nodos (Controller Node, Compute Node 1 y 2):
# List the servers on which to install the Compute service.
CONFIG_COMPUTE_HOSTS=192.168.1.100,192.168.1.101,192.168.1.102
  1. Añadir la IP del Controller Node para que su configuración no sea alterada, es decir, excluir este nodo en el proceso de instalación:
# Comma-separated list of servers to be excluded from the
# installation. This is helpful if you are running Packstack a second
# time with the same answer file and do not want Packstack to
# overwrite these server's configurations. Leave empty if you do not
# need to exclude any servers.
EXCLUDE_SERVERS=192.168.1.100
  1. Editar las reglas de iptables para permitir que los Compute Nodes puedan acceder a los servicios de mensaje AMQP y base de datos MariaDB:
'#' vi /etc/sysconfig/iptables

...
-A INPUT -s 192.168.1.100/32 -p tcp -m multiport --dports 5671,5672 -m comment --comment "001 amqp incoming amqp_192.168.1.100" -j ACCEPT
-A INPUT -s 192.168.1.101/32 -p tcp -m multiport --dports 5671,5672 -m comment --comment "001 amqp incoming amqp_192.168.1.101" -j ACCEPT
-A INPUT -s 192.168.1.102/32 -p tcp -m multiport --dports 5671,5672 -m comment --comment "001 amqp incoming amqp_192.168.1.102" -j ACCEPT
...
-A INPUT -s 192.168.1.100/32 -p tcp -m multiport --dports 3306 -m comment --comment "001 mariadb incoming mariadb_192.168.1.100" -j ACCEPT
-A INPUT -s 192.168.1.101/32 -p tcp -m multiport --dports 3306 -m comment --comment "001 mariadb incoming mariadb_192.168.1.101" -j ACCEPT
-A INPUT -s 192.168.1.102/32 -p tcp -m multiport --dports 3306 -m comment --comment "001 mariadb incoming mariadb_192.168.1.102" -j ACCEPT
...
  1. Reiniciar servicio de iptables:
'#' systemctl restart network
'#' systemctl restart iptables
  1. Comenzar con la instalación de Packstack en los Compute Nodes usando el answer file editado:
'#' packstack --answer-file=packstack-answers-20200124-103757.txt
  1. Desde el Controller Node, listar los hypervisors:
'#' openstack hypervisor list

+----+-----------------------------+-----------------+---------------+-------+
| ID | Hypervisor Hostname         | Hypervisor Type | Host IP       | State |
+----+-----------------------------+-----------------+---------------+-------+
|  1 | controllernode1.localdomain | QEMU            | 192.168.1.100 | up    |
|  2 | computenode2.localdomain    | QEMU            | 192.168.1.102 | up    |
|  3 | computenode1.localdomain    | QEMU            | 192.168.1.101 | up    |
+----+-----------------------------+-----------------+---------------+-------+