Despliegue de OpenStack con Packstack y VirtualBox¶
Table of Contents
Teoría de VirtualBox Bridged Networking:
- Bridged Networking - VirtualBox documentation
- How does bridged networking work in Virtualbox
- Neutron with existing external network
Prerequisitos (Controller node)¶
- Parar servicios de
firewalld
yNetworkManager
:
'#' systemctl stop firewalld NetworkManager
- Deshabilitar servicios de
firewalld
yNetworkManager
:
'#' systemctl disable firewalld NetworkManager
- Habilitar e iniciar servicio
network
:
'#' systemctl enable network
'#' systemctl start network
- Deshabilitar SE Linux
'#' cat /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
- Configuración de interfaz de red bridged:
- INTERFACE CONFIGURATION FILES - Red Hat Documentation
- BOOTPROTO=”none” o BOOTPROTO=”static”: configuración de IP estática (Difference between setting BOOTPROTO=none and BOOTPROTO=static in an ethernet interface configuration script in RHEL)
- IPADDR: Dirección IP dentro de la red local
- Gateway: Dirección IP del equipo con salida a la red exterior (Internet)
'#' 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"
- 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"
- 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
- Reiniciar el servicio de
network
y reiniciar el sistema:
'#' systemctl restart network
'#' reboot
- Comprobar que SE Linux está desactivado:
'#' getenforce
Disabled
- 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¶
- 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"
- 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"
- 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
- Reiniciar el servicio de
network
y reiniciar el sistema:
'#' systemctl restart network
'#' reboot
Configuración de Compute Node 2¶
- 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"
- 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"
- 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
- Reiniciar el servicio de
network
y reiniciar el sistema:
'#' systemctl restart network
'#' reboot
Descarga de paquetes (Controller node)¶
- 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
- Actualizar paquetes:
'#' yum update -y
- 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.
- Configurar a la interfaz física
enp0s3
como un puerto en el OVSbr-ex
. Haremos a la interfaz físicaenp3s0
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
- 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
- Reiniciar el servicio
network
para hacer efectivo los cambios:
'#' systemctl restart network
- 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 |
+---------------------------+--------------------------------------+
- 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)¶
- 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
- 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
- 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
- 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
- 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
- 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
...
- Reiniciar servicio de
iptables
:
'#' systemctl restart network
'#' systemctl restart iptables
- Comenzar con la instalación de Packstack en los Compute Nodes usando el answer file editado:
'#' packstack --answer-file=packstack-answers-20200124-103757.txt
- 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 |
+----+-----------------------------+-----------------+---------------+-------+