OpenStack: LoadBalancer as a Service v2

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

Comments are closed.