LBaaS: Balanceadores para todos

openstack-logoUna de las ventajas de OpenStack reside en el control que tendremos de todos los componentes que conforman nuestra infraestructura desplegada sobre la nube. Contando con esto sabemos que podemos desplegar instancias y redes, sin embargo existen otra serie de componentes que nos van a permitir aumentar la complejidad de la arquitectura de la solución desplegada. Estos componentes son routers, redes privadas virtuales (VPNs), y balanceadores de carga. Sobre estos últimos vamos a profundizar un poco más.

Un balanceador de carga es un dispositivo que nos permite repartir las conexiones entrantes hacia un servicio entre dos o más servidores para lo cual tendremos que tener en cuenta que la IP a la que apunte el servicio será la IP del balanceador y este además tendrá una IP en la red privada en la que los servidores se encuentran en funcionamiento. Partiendo de esta base para crear un balanceador necesitaremos proporcionar los siguientes elementos:

  • Pool: Que corresponde con el grupo de servidores que ejecutarán la misma carga de trabajo, x ej un grupo de servidores Web. Además aqui definiremos el algoritmo o metodo de balanceo ( ROUND_ROBIN,LEAST_CONNECTIONS,SOURCE_IP )
  • Members: Son las instancias y estarán marcadas como miembros del Pool.
  • VIP: Virtual IP, es la IP que representará al Pool y contra la que se realizarán las conexiones. Es una IP en la red interna de las instancias que formarán parte del grupo de balanceo.
  • HealthMonitor: comprobará si los miembros del pool están funcionando correctamente, si uno de ellos no se enncuentra disponible o bien su IP o el puerto que se monitoriza se encuentra en estado Down, el monitor enviará un mensaje al Pool indicando que no se envie carga a ese miembro.

Para generar un Balanceador en linea de comandos, en primer lugar lo que tendremos que realizar será la cración del Pool:

[openstack@opencloud openstack]$ neutron lb-pool-create --lb-method ROUND_ROBIN --name LBPool --protocol HTTP --subnet-id e5a90ab2-918e-412b-9723-0d822804f022
Created a new pool:
+------------------------+--------------------------------------+
| Field                  | Value                                |
+------------------------+--------------------------------------+
| admin_state_up         | True                                 |
| description            |                                      |
| health_monitors        |                                      |
| health_monitors_status |                                      |
| id                     | 3eb0d41c-3df5-4beb-9758-ebfef56909df |
| lb_method              | ROUND_ROBIN                          |
| members                |                                      |
| name                   | LBPool                               |
| protocol               | HTTP                                 |
| provider               | haproxy                              |
| status                 | PENDING_CREATE                       |
| status_description     |                                      |
| subnet_id              | e5a90ab2-918e-412b-9723-0d822804f022 |
| tenant_id              | b1aaddea9f694e60aea5f1c0d1dd7c24     |
| vip_id                 |                                      |
+------------------------+--------------------------------------+

Una vez creado el Pool tendremos que añadir las instancias que van a formar parte del grupo de balanceo como miembros del Pool; estás deben estar encendidas y en correcto funcionamiento:

[openstack@opencloud openstack]$ neutron lb-member-create --address 16.0.5.31 --protocol-port 80 LBPool
Created a new member:
+--------------------+--------------------------------------+
| Field              | Value                                |
+--------------------+--------------------------------------+
| address            | 16.0.5.31                            |
| admin_state_up     | True                                 |
| id                 | a6de6bf0-3191-4721-aa01-5781ff05876e |
| pool_id            | 3eb0d41c-3df5-4beb-9758-ebfef56909df |
| protocol_port      | 80                                   |
| status             | PENDING_CREATE                       |
| status_description |                                      |
| tenant_id          | b1aaddea9f694e60aea5f1c0d1dd7c24     |
| weight             | 1                                    |
+--------------------+--------------------------------------+

[openstack@opencloud openstack]$ neutron lb-member-create --address 16.0.5.32 --protocol-port 80 LoadBalancerPool
Created a new member:
+--------------------+--------------------------------------+
| Field              | Value                                |
+--------------------+--------------------------------------+
| address            | 16.0.5.32                            |
| admin_state_up     | True                                 |
| id                 | 9688a770-6494-4599-88fa-6afcd18c4dd1 |
| pool_id            | 3eb0d41c-3df5-4beb-9758-ebfef56909df |
| protocol_port      | 80                                   |
| status             | PENDING_CREATE                       |
| status_description |                                      |
| tenant_id          | b1aaddea9f694e60aea5f1c0d1dd7c24     |
| weight             | 1                                    |
+--------------------+--------------------------------------+

A partir de aqui lo que tendremos que hacer es generar el monitor que nos permita comprobar el estado de salud de los elementos que intervienen:

[openstack@opencloud openstack]$ neutron lb-healthmonitor-create --timeout 3 --max-retries 3 --delay 60 --type HTTP
Created a new health_monitor:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| admin_state_up | True                                 |
| delay          | 60                                   |
| expected_codes | 200                                  |
| http_method    | GET                                  |
| id             | cb73f8fd-14ea-4937-aa10-019e3da8432f |
| max_retries    | 3                                    |
| pools          |                                      |
| tenant_id      | b1aaddea9f694e60aea5f1c0d1dd7c24     |
| timeout        | 3                                    |
| type           | HTTP                                 |
| url_path       | /                                    |
+----------------+--------------------------------------+
[stack@localhost devstack]$ neutron lb-healthmonitor-associate cb73f8fd-14ea-4937-aa10-019e3da8432f LBPool
Associated health monitor cb73f8fd-14ea-4937-aa10-019e3da8432f

Y le asignamos una VIP en el rango de las instancias:

[openstack@opencloud openstack]$ neutron lb-vip-create --name LBVIP --protocol-port 80 --protocol HTTP --subnet-id e5a90ab2-918e-412b-9723-0d822804f022 LBPool
Created a new vip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| address             | 16.0.5.30                            |
| admin_state_up      | True                                 |
| connection_limit    | -1                                   |
| description         |                                      |
| id                  | 4e3c2b84-a286-4999-a258-51c44965a81a |
| name                | LBVIP                                |
| pool_id             | 3eb0d41c-3df5-4beb-9758-ebfef56909df |
| port_id             | d4ed46ac-aabf-40b6-8f28-1a2013971391 |
| protocol            | HTTP                                 |
| protocol_port       | 80                                   |
| session_persistence |                                      |
| status              | PENDING_CREATE                       |
| status_description  |                                      |
| subnet_id           | e5a90ab2-918e-412b-9723-0d822804f022 |
| tenant_id           | b1aaddea9f694e60aea5f1c0d1dd7c24     |
+---------------------+--------------------------------------+

Ahora creamos una IP Publica que será la que proporcione servicio hacia los usuarios:

[openstack@opencloud openstack]$ neutron floatingip-create 23101147-e724-4574-82c7-a05ccb661d4d
Created a new floatingip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    |                                      |
| floating_ip_address | 82.24.4.3                            |
| floating_network_id | 23101147-e724-4574-82c7-a05ccb661d4d |
| id                  | 62fbf609-77db-4471-b6ae-9fe25a091a21 |
| port_id             |                                      |
| router_id           |                                      |
| status              | DOWN                                 |
| tenant_id           | b1aaddea9f694e60aea5f1c0d1dd7c24     |
+---------------------+--------------------------------------+

Y la asociamos a la VIP

[stack@localhost devstack]$ neutron floatingip-associate 62fbf609-77db-4471-b6ae-9fe25a091a21 d4ed46ac-aabf-40b6-8f28-1a2013971391
Associated floating IP 62fbf609-77db-4471-b6ae-9fe25a091a21

Generamos las reglas necesarias para permitir el tipo de tráfico necesario hacia nuestras instancias (HTTP, SSH e ICMP)

[openstack@opencloud openstack]$ neutron security-group-rule-create --protocol TCP --port-range-min 80 --port-range-max 80 be0b2264-744a-48b8-9a1e-033227d78f2b
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | 4635cbb6-d939-40b3-ac11-637c8b63b027 |
| port_range_max    | 80                                   |
| port_range_min    | 80                                   |
| protocol          | tcp                                  |
| remote_group_id   |                                      |
| remote_ip_prefix  |                                      |
| security_group_id | be0b2264-744a-48b8-9a1e-033227d78f2b |
| tenant_id         | b1aaddea9f694e60aea5f1c0d1dd7c24     |
+-------------------+--------------------------------------+

[openstack@opencloud openstack]$ neutron security-group-rule-create --protocol icmp be0b2264-744a-48b8-9a1e-033227d78f2b
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | 988329a1-d686-4541-8950-a22c721f847b |
| port_range_max    |                                      |
| port_range_min    |                                      |
| protocol          | icmp                                 |
| remote_group_id   |                                      |
| remote_ip_prefix  |                                      |
| security_group_id | be0b2264-744a-48b8-9a1e-033227d78f2b |
| tenant_id         | b1aaddea9f694e60aea5f1c0d1dd7c24     |
+-------------------+--------------------------------------+

[openstack@opencloud openstack]$ neutron security-group-rule-create --protocol TCP --port-range-min 22 --port-range-max 22 be0b2264-744a-48b8-9a1e-033227d78f2b
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | d18724dc-2eda-4031-be88-202a73c30c24 |
| port_range_max    | 22                                   |
| port_range_min    | 22                                   |
| protocol          | tcp                                  |
| remote_group_id   |                                      |
| remote_ip_pref                                           |
| security_group_id | d7412bb3-9824-4eb7-bc4b-cd80ab6a570d |
| tenant_id         | b1aaddea9f694e60aea5f1c0d1dd7c24     |
+-------------------+--------------------------------------+

 Una vez realizados estos pason tendremos creado el balanceador y aplicadas las politicas necesarias para disponer de un servicio WEB tras él.

Deja un comentario