LBaaS met een HA IP en automatische failover

In dit voorbeeld leggen we uit hoe u zelf een Loadbalancer met automatische failover aan kunt maken. We gaan uit van meerdere webservers waarover we verkeer gaan verdelen, zodat ook de webservers nooit meer een single point of failure vormen. Daarnaast maakt het uw website(s) schaalbaar. U kunt eenvoudig servers toevoegen en verwijderen. Dit is bijvoorbeeld om het extra verkeer van een online campangne op te vangen of in de lucht te blijven bij onverwachte media aandacht.

Wat heb je nodig voor LBaaS?

Om LBaaS te kunnen gebruiken heb je nodig:

  • De commandline client moet geïnstalleerd zijn.
  • Een intern netwerk met een subnet
  • Webservers in het interne netwerk

We maken in dit artikel uitsluitend gebruik van de commandline client.
Sommige stappen kunnen ook in de interface uitgevoerd worden, maar nog niet allemaal.

Stappenplan

Wanneer er aan bovenstaande voorwaarden is voldaan kunt u de volgende stappen doorlopen:

Meer documentatie over het beheer van lbaas is te vinden in de openstack documentatie:
https://docs.openstack.org/mitaka/networking-guide/config-lbaas.html#lbaas-v2-operations

 

Een loadbalancer aanmaken

 

Maak de loadbalancer aan met het volgende commando
neutron lbaas-loadbalancer-create --name LOADBALANCER_NAME SUBNET_NAME

In dit voorbeeld maken we een loadbalancer aan welke we koppelen aan het subnet "private-subnet".
We noemen de loadbalancer LB01. Noteer hierbij het VIP_PORT_ID
Als alles goed gaat ziet dat er als volgt uit

 neutron lbaas-loadbalancer-create --name LB01 private-subnet
 
 Created a new loadbalancer:
 +---------------------+--------------------------------------+
 | Field               | Value                                |
 +---------------------+--------------------------------------+
 | admin_state_up      | True                                 |
 | description         |                                      |
 | id                  | 7d52fd3c-f617-4116-81bd-241d2f7c8d2c |
 | listeners           |                                      |
 | name                | LB01                                 |
 | operating_status    | ONLINE                               |
 | provisioning_status | ACTIVE                               |
 | tenant_id           | 8fdc053da26b47ef9b679e49fe447830     |
 | vip_address         | 10.0.0.3                             |
 | vip_port_id         | 24da5be8-84b1-4b1c-aa5f-d80ee3a74465 |
 | vip_subnet_id       | 830b5598-b311-4a31-a99e-dee5b7c49f13 |
 +---------------------+--------------------------------------+

Eventueel kunt u later deze informatie nog opvragen

neutron lbaas-loadbalancer-list
neutron lbaas-loadbalancer-show LOADBALANCER_NAME_OR_ID

 

Een security group aanmaken

 

Maak de security group aan met het volgende commando
neutron security-group-create SECURITY_GROUP_NAME

In dit voorbeeld maken we een security group aan met de naam lbaas.
Als alles goed gaat ziet dat er als volgt uit.

 neutron security-group-create lbaas

 Created a new security_group:
 +----------------------+--------------------------------------+
 | Field                | Value                                |
 +----------------------+--------------------------------------+
 | contrail:fq_name     | default-domain                       |
 |                      | admin                                |
 |                      | lbaas                                |
 | description          |                                      |
 | id                   | 94000aea-8893-477a-b988-032d496135a3 |
 | name                 | lbaas                                |
 | security_group_rules |                                      |
 | tenant_id            | 8fdc053da26b47ef9b679e49fe447830     |
 +----------------------+--------------------------------------+

 

Regels aanmaken voor de security group

 

Maak de regels aan met het volgende commando
neutron security-group-rule-create --direction DIRECTION --protocol PROTOCOL --port-range-min PORT --port-range-max PORT --remote-ip-prefix REMOTE_IP_CIDR SECURITY_GROUP_NAME

Om poort 80 inkomend (ingress) open te zetten vanaf de hele wereld (0.0.0.0/0) ziet dat er als volgt uit

 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
  
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | ab717f7a-b963-450e-9aed-1fdfa37b7dcd |
| port_range_max    | 80                                   |
| port_range_min    | 80                                   |
| protocol          | tcp                                  |
| remote_group_id   |                                      |
| remote_ip_prefix  | 0.0.0.0/0                            |
| security_group_id | 15d242f1-ff2f-47cf-bc70-160a486f0fdd |
| tenant_id         | 422f4838817741d58956e887b1e2e25c     |
+-------------------+--------------------------------------+

 

 

De security group toepassen op de VIP poort van de loadbalancer

 

Gebruik hier voor het VIP_PORT_ID welke u heeft genoteerd bij het aanmaken van de loadbalancer en de naam van de security group.
Koppel de security group aan het VIP met het volgende commando
neutron port-update --security-group SECURITY_GROUP_NAME VIP_PORT_ID

In dit voorbeeld koppelen we het eerder gemaakte security group aan het VIP_PORT_ID Als alles goed gaat ziet dat er als volgt uit

    neutron port-update --security-group lbaas 24da5be8-84b1-4b1c-aa5f-d80ee3a74465 
    Updated port: 24da5be8-84b1-4b1c-aa5f-d80ee3a74465 

 

Een HTTP listener aanmaken op het HA VIP

 

Om er voor te zorgen dat de loadbalancer luistert op poorten 80 moeten we een listener aanmaken. Vervolgens koppelen we een floating IP aan het HA VIP zodat de loadbalancer van buitenaf bereikbaar is.


Maak de listeners aan met het volgende commando
neutron lbaas-listener-create --name LISTENER_NAME --loadbalancer LOADBALANCER_NAME --protocol HTTP --protocol-port PORT

In dit voorbeeld maken we een listener aan met de naam LB01-http.
Als alles goed gaat ziet dat er als volgt uit

neutron lbaas-listener-create \
 --name LB01-http \
 --loadbalancer LB01 \
 --protocol HTTP \
 --protocol-port 80

Created a new listener:
+----------------+------------------------------------------------+
| Field          | Value                                          |
+----------------+------------------------------------------------+
| admin_state_up | True                                           |
| description    |                                                |
| id             | df73b48f-dce5-4f4c-bcda-e45c63d68708           |
| loadbalancers  | {"id": "c796729e-81c9-49c3-a2d0-ed238e917828"} |
| name           | LB01-http                                      |
| protocol       | HTTP                                           |
| protocol_port  | 80                                             |
| tenant_id      | 422f4838817741d58956e887b1e2e25c               |
+----------------+------------------------------------------------+

 

 

Een LBaaS pool aanmaken en de webservers toevoegen

 

De volgende stap is het aanmaken van een "lbaas pool".
De pool bevat members welke een ieder een ip en een poort hebben van de webservers. Let op, SSL offloading is niet mogelijk. Er moet op de webservers een webserver geconfigureerd zijn voor HTTPS.

Maak de LBaaS pool aan met het volgende commando
neutron lbaas-pool-create \ --name POOL_NAME \ --lb-algorithm ROUND_ROBIN \ --listener LISTENER_NAME \ --protocol PROTOCOL

In het volgende voorbeeld maken we een pool met de naam "LB01-pool-http"
Die pool verwijzen we vervolgens naar poort 80 op beiden webservers (10.0.0.4 en 10.0.0.5) door middel van listeners.
Als alles goed gaat ziet dat er als volgt uit

neutron lbaas-pool-create \
 --name LB01-pool-http \
 --lb-algorithm ROUND_ROBIN \
 --listener LB01-http \
 --protocol HTTP

Created a new pool:
+---------------------+------------------------------------------------+
| Field               | Value                                          |SSL offloading is niet mogelijk
+---------------------+------------------------------------------------+
| admin_state_up      | True                                           |
| custom_attributes   | []                                             |
| description         |                                                |
| id                  | 3116f9a5-5112-46b3-b855-894ea0f62ad7           |
| lb_algorithm        | ROUND_ROBIN                                    |
| listeners           | {"id": "df73b48f-dce5-4f4c-bcda-e45c63d68708"} |
| members             |                                                |
| name                | LB01-pool-http                                 |
| protocol            | HTTP                                           |
| session_persistence |                                                |
| tenant_id           | 422f4838817741d58956e887b1e2e25c               |
+---------------------+------------------------------------------------+

neutron lbaas-member-create \
 --subnet private-subnet \
 --address 10.0.0.4 \
 --protocol-port 80 \
 LB01-pool-http
 
Created a new member:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| address        | 10.0.0.4                             |
| admin_state_up | True                                 |
| id             | 5d47c0b8-138a-4d6a-bd78-9afc5a2c5a8e |
| name           | 5d47c0b8-138a-4d6a-bd78-9afc5a2c5a8e |
| protocol_port  | 80                                   |
| tenant_id      | 422f4838817741d58956e887b1e2e25c     |
| weight         | 1                                    |
+----------------+--------------------------------------+

neutron lbaas-member-create \
 --subnet private-subnet \
 --address 10.0.0.5 \
 --protocol-port 80 \
 LB01-pool-http
 
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| address        | 10.0.0.5                             |
| admin_state_up | True                                 |
| id             | 9f84203f-dd18-4cbc-b11c-10efc424b032 |
| name           | 9f84203f-dd18-4cbc-b11c-10efc424b032 |
| protocol_port  | 80                                   |
| tenant_id      | 422f4838817741d58956e887b1e2e25c     |
| weight         | 1                                    |
+----------------+--------------------------------------+


 

 

Een extern floating IP koppelen

 

We hebben nu een intern High Available Virtueel IP. We koppelen vervolgens een floating IP aan het HA VIP zodat de loadbalancer van buitenaf bereikbaar is.


Reserveer een floating ip met het volgende command
neutron floatingip-create FLOATING_NETWORK Noteer het id van het floating ip koppel deze vervolgens aan het VIP_PORT_ID
neutron floatingip-associate FLOATINGIP_ID VIP_PORT_ID

Als alles goed gaat ziet dat er als volgt uit

neutron floatingip-create floating

Created a new floatingip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    |                                      |
| floating_ip_address | 83.96.236.46                         |
| floating_network_id | f9c73cd5-9e7b-4bfd-89eb-c2f4f584c326 |
| id                  | cc77c82b-0948-49b8-86e8-a3b013467c75 |
| port_id             |                                      |
| router_id           |                                      |
| status              | ACTIVE                               |
| tenant_id           | 422f4838817741d58956e887b1e2e25c     |
+---------------------+--------------------------------------+

En koppel nu het nieuwe floating ip

neutron floatingip-associate cc77c82b-0948-49b8-86e8-a3b013467c75 24da5be8-84b1-4b1c-aa5f-d80ee3a74465
Associated floating IP cc77c82b-0948-49b8-86e8-a3b013467c75

Als alles goed is gegaan zou u nu de webpagina van de webservers moeten zien wanner u naar het floating IP gaat met een webbrowser. Test dit eerst voor dat u de healthmonitor toevoegd.
Als het nu niet werkt, controleer dan goed of er geen foutmeldingen waren.
Gebruik de show commando's om te controleren of alles juist is aangemaakt en gekoppeld: neutron lbaas-loadbalancer-list neutron lbaas-loadbalancer-show LOADBALANCER_NAME_OR_ID neutron security-group-list neutron security-group-rule-list neutron lbaas-listener-list neutron lbaas-pool-list neutron lbaas-member-listPOOL

 

Een Healthmonitor aanmaken voor de webservers

 

Op dit moment functioneert de loadbalancer al. Het inkomende verkeer op de listeners wordt als het goed is netjes verdeeld over de achterliggende pool members. We kunnen nu nog een Healthmonitor toevoegen.
Een healthmonitor controleert of de achterliggende servers beschikbaar zijn.
Als dit niet het geval is, zal verkeer volledig automatisch naar de overige servers geleid worden.

Maak de healthmonitor aan met het volgende commando
neutron lbaas-healthmonitor-create --delay DELAY --max-retries RETRIES --timeout TIMEOUT --type PROTOCOL --pool POOL_NAME

U kunt de healthmonitor volledig instellen naar wens:

  --expected-codes EXPECTED_CODES
                        The list of HTTP status codes expected in response
                        from the member to declare it healthy. This attribute
                        can contain one value, or a list of values separated
                        by comma, or a range of values (e.g. "200-299"). If
                        this attribute is not specified, it defaults to "200".
  --http-method HTTP_METHOD
                        The HTTP method used for requests by the monitor of
                        type HTTP.
  --url-path URL_PATH   The HTTP path used in the HTTP request used by the
                        monitor to test a member health. This must be a string
                        beginning with a / (forward slash).
  --delay DELAY         The time in seconds between sending probes to members.
  --max-retries MAX_RETRIES
                        Number of permissible connection failures before
                        changing the member status to INACTIVE. [1..10].
  --timeout TIMEOUT     Maximum number of seconds for a monitor to wait for a
                        connection to be established before it times out. The
                        value must be less than the delay value.
  --type {PING,TCP,HTTP,HTTPS}
                        One of the predefined health monitor types.

We gaan healthmonitors aanmaken voor HTTP en en TCP. Dit doen we omdat HTTPS offloading niet wordt ondersteund.
Als alles goed gaat ziet dat er als volgt uit

neutron lbaas-healthmonitor-create \
 --delay 5 \
 --max-retries 2 \
 --timeout 10 \
 --type HTTP \
 --pool LB01-pool-http
 
Created a new healthmonitor:
+----------------+-----------------------------------------------------+
| Field          | Value                                               |
+----------------+-----------------------------------------------------+
| admin_state_up | True                                                |
| delay          | 5                                                   |
| expected_codes | 200                                                 |
| http_method    | GET                                                 |
| id             | 549e47b9-4ea3-4653-8573-d7e14f758787                |
| max_retries    | 2                                                   |
| name           | 549e47b9-4ea3-4653-8573-d7e14f758787                |
| pools          | {"pool_id": "3116f9a5-5112-46b3-b855-894ea0f62ad7"} |
| tenant_id      | 422f4838817741d58956e887b1e2e25c                    |
| timeout        | 10                                                  |
| type           | HTTP                                                |
| url_path       | /                                                   |
+----------------+-----------------------------------------------------+

neutron lbaas-healthmonitor-create \
 --delay 5 \
 --max-retries 2 \
 --timeout 10 \
 --type TCP \
 --pool LB01-pool-tcp

Created a new healthmonitor:
+----------------+-----------------------------------------------------+
| Field          | Value                                               |
+----------------+-----------------------------------------------------+
| admin_state_up | True                                                |
| delay          | 5                                                   |
| expected_codes | 200                                                 |
| http_method    | GET                                                 |
| id             | d2893087-ae61-4199-a1ee-62a8577bd297                |
| max_retries    | 2                                                   |
| name           | d2893087-ae61-4199-a1ee-62a8577bd297                |
| pools          | {"pool_id": "3e5902f7-1508-48d9-931f-13d91a31552c"} |
| tenant_id      | 422f4838817741d58956e887b1e2e25c                    |
| timeout        | 10                                                  |
| type           | TCP                                               |
| url_path       | /                                                   |
+----------------+-----------------------------------------------------+
 

Tot slot

U kunt nu de loadbalancers testen door er verkeer naar toe te sturen, de webserver te stoppen en te kijken wat er gebeurt.
U zult zien dat er geen verkeer meer gestuurd wordt naar de webserver die uit staat en uw site in de lucht blijft!

Wat we hier mee hebben bereikt is;

  • Een schaalbare oplossing, er kunnen eenvoudig servers worden toegevoegd en verwijderd
  • Een beheersbare oplossing, servers kunnen eenvoudig in onderhoud worden genomen door de webserver te stoppen
  • Een robuuste oplossing, zodra een van de webservers weg valt nemen anderen dit automatisch over

Hiermee maakt u enterprise oplossingen binnen enkele stappen beschikbaar voor uw omgeving.