Vamos a ver como instalar y configurar LBaaSv2 en OpenStack Newton. Está montado sobre Ubuntu 16.04
Instalación
Toda la operación se desarrolla en el nodo controlador de OpenStack o donde esté configurada la red de Neutron
Puede parecer obvio, pero la documentación oficial no te dice que hay que instalar primero el plugin, para esto hacemos:
apt-get install neutron-lbaasv2-agent
Dependiendo de tu entorno instalará estas dependencias
python-pyasn1-modules:amd64 (0.0.7-0.1, automatic), haproxy:amd64 (1.6.3-1ubuntu0.1, automatic), liblua5.3-0:amd64 (5.3.1-1ubuntu2, automatic), python-neutron-lbaas:amd64 (2:9.0.0-0ubuntu1~cloud0, automatic), neutron-lbaasv2-agent:amd64 (2:9.0.0-0ubuntu1~cloud0), neutron-lbaas-common:amd64
Configuración
Vamos a editar los archivos de configuración:
En /etc/neutron/neutron.conf añadimos el plugin a la lista de plugins que haya.
service_plugins = [existing service plugins],neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2
En /etc/neutron/neutron_lbaas.conf añadimos una linea en la sección [service_providers]. Si ya tenemos otros proveedores de servicios como FWaaS o VPNaaS añadimos una linea nueva, Esta directiva de configuración permite repetición.
service_provider = LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
En /etc/neutron/lbaas_agent.ini añadimos el driver que maneja la interfaces virtuales:
interface_driver = INTERFACE_DRIVER
Yo uso linuxbridge, luego la línea quedaría así:
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
Finalizamos con el migrate de la base de datos.
neutron-db-manage --subproject neutron-lbaas upgrade head
Reiniciamos neutron
systemctl neutron-server restart
Reiniciamos el agente
systemctl restart Neutron-lbaasv2-agent
Y con esto termina la configuración.
Crear un LoadBalancer
Tenemos dos servidores web corriendo en nuestro Tenant y queremos balancear la carga. Los dos servidores son:
webserver-1 172.31.1.25 webserver-2 172.31.1.16
Deben estar incluidos en alguna regla que permita el trafico HTTP hacia ellos, en caso contrario podemos crearlo:
# Cargar en openrc . openrc # Crear el security group neutron security-group-create http # Crear la regla neutron security-group-rule-create --direction ingress --protocol tcp --port-range-min 80 --port-range-max 80 --remote-ip-prefix 0.0.0.0/0 http
Vamos a crear el balanceador
neutron lbaas-loadbalancer-create --name test-lb private-subnet
private-subnet es una subred privada. Podemos consultar las redes disponibles haciendo:
openstack network list
El balanceador se crea en unos segundos, podemos verlo así:
neutron lbaas-loadbalancer-show test-lb
Que mostrará algo como esto:
+---------------------+------------------------------------------------+ | Field | Value | +---------------------+------------------------------------------------+ | admin_state_up | True | | description | | | id | 12826d46-9854-4123-9193-37b8c2511729 | | listeners | {"id": "75d5218b-948e-482b-b7a9-d831d0feb476"} | | name | test-lb | | operating_status | ONLINE | | pools | {"id": "860726ba-1997-453f-9e32-7879254e3306"} | | provider | haproxy | | provisioning_status | ACTIVE | | tenant_id | d245f207e6fc4e56b5a1d23e0716ad70 | | vip_address | 172.31.1.23 | | vip_port_id | 1e090071-2800-4468-8ab7-0493d0881e10 | | vip_subnet_id | a03252b6-e67e-48d9-89fc-edc3872d83ae | +---------------------+------------------------------------------------+
Apuntar el valor de vip_port_id porque lo necesitaremos más adelante.
Vamos a crear los grupos de seguridad necesarios para dirigir tráfico al balanceador:
$ neutron security-group-create lbaas $ neutron security-group-rule-create \ --direction ingress \ --protocol tcp \ --port-range-min 80 \ --port-range-max 80 \ --remote-ip-prefix 0.0.0.0/0 \ lbaas $ neutron security-group-rule-create \ --direction ingress \ --protocol tcp \ --port-range-min 443 \ --port-range-max 443 \ --remote-ip-prefix 0.0.0.0/0 \ lbaas $ neutron security-group-rule-create \ --direction ingress \ --protocol icmp \ lbaas
Hemos permitido trafico HTTP, HTTPS y el ping. Ahora aplicamos las reglas al puerto del balanceador. El vip_port_id que apuntamos antes.
$ neutron port-update \ --security-group lbaas \ 1e090071-2800-4468-8ab7-0493d0881e10
Podemos comprobar que está activo al hacer ping.
ping -c3 172.31.1.23 PING 172.31.1.23 (172.31.1.23) 56(84) bytes of data. 64 bytes from 172.31.1.23: icmp_seq=1 ttl=62 time=19.2 ms 64 bytes from 172.31.1.23: icmp_seq=2 ttl=62 time=0.491 ms 64 bytes from 172.31.1.23: icmp_seq=3 ttl=62 time=0.312 ms --- 172.31.1.23 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.312/6.678/19.232/8.877 ms
Creamos los listeners para el balanceador:
$ neutron lbaas-listener-create \ --name test-lb-http \ --loadbalancer test-lb \ --protocol HTTP \ --protocol-port 80
Y por último el pool de servidores a los que se balancea:
$ neutron lbaas-pool-create \ --name test-lb-pool-http \ --lb-algorithm ROUND_ROBIN \ --listener test-lb-http \ --protocol HTTP $ neutron lbaas-member-create \ --subnet private-subnet \ --address 172.31.1.16 \ --protocol-port 80 \ test-lb-pool-http $ neutron lbaas-member-create \ --subnet private-subnet \ --address 172.31.1.25 \ --protocol-port 80 \ test-lb-pool-http
Ya sólo nos queda comprobar que funciona:
$ for i in $(seq 1 4); do curl 172.31.1.23; done webserver-1 webserver-2 webserver-1 webserver-2