Blogi
Written by
Jura Berg
Consultant

OpenStack ja kuormantasaus

Yksi toivotuimpia ominaisuuksia OpenStack-pilveemme on ollut kuormantasaaja, jota voidaan hyödyntää molemmilla saatavuusalueilla. 

Olemme vastanneet tähän toiveeseen ja tuomme saataville hallittavan Nebula Elastic Load Balancer-kuormantasaajan. NELB:llä on yksi pysyvä, saatavuusalueista riippumaton julkinen IP-osoite, johon asiakas voi ohjata kaiken julkisen liikenteen. NELB huolehtii liikenteen jakamisesta molemmille saatavuusalueille.

Tämä mahdollistaa skaalautuvan ja vikasietoisen arkkitehtuurin rakentamisen pilveen itsenäisesti. Alkuvaiheessa kuormantasaajaa voi käyttää vain REST-rajapinnan kautta, mutta tuomme käyttöliittymän myöhemmin osaksi my.nebula.fi-portaalia.

Minulla on ajossa yksinkertainen nginx:ää ajava instanssi julkisella Floating IP:llä 77.86.189.137 ja haluan ottaa sille käyttöön kuormantasauksen:  

$ curl http://77.86.189.137 | grep Nginx <title>Test Page for the Nginx HTTP Server on Fedora</title>

NELB:n hallintarajapinnan autentikointi tapahtuu keystonen kautta, jolloin voit käyttää kuormantasaajan hallintaan omaa tunnustasi tai jopa kokonaan erillistä tunnusta. Haetaan token:

$ curl -s -X POST -d '{"auth": {"tenantName": "<TENANT>","passwordCredentials": {"username": "<USERNAME>","password": "<PASSWORD>"}}}' -H "Content-Type: application/json" https://identity.fi-1.nebulacloud.fi:5000/v2.0/tokens | jq -r '.access.token.id' > token.txt

Luodaan kuormantasaaja ja määritetään sille yksittäinen instanssi liikennettä varten:

$ curl -s -H "X-Auth-Token: $(cat token.txt)" -XPOST https://nelb.fi-1.qa.nebulacloud.fi/v1/lb -d '{"name":"TestBalancer","listeners":[{"name":"http", "memberPort":80, "listenerPort":80}],"members":[{"name":"node1", "IPv4Address": "77.86.189.137"}]}' | jq .

{ "revision": 0, "owner": "7b1a52f4fc3f410181c3601c40488314", "adminStatus": true, "uuid": "93cfdc83-7ec8-4984-a9bd-f8a3d328a42f", "name": "TestBalancer", "externalIPv4Address": "188.117.27.44", "externalIPv6Address": "2001:1bc8:11:e::6", "internalIPv4Addresses": [ "188.117.27.45" ], "loadBalancerPolicy": { "loadBalancingMode": "tcp" }, "listeners": [ { "memberPort": 80, "listenerPort": 80, "name": "http" } ], "members": [ { "IPv4Address": "77.86.189.137", "name": "node1" } ] }

Instanssille voi nyt liikennöidä kuormantasaajan kautta. Liikenne instanssille tulee kuormantasaajan sisäisestä osoitteesta, joten SecurityGroupien tulee sallia liikenne lähdeosoitteesta 188.117.27.45.  Haetaan sama sivu kuormantasaajan kautta:

$ curl http://188.117.27.44 | grep Nginx <title>Test Page for the Nginx HTTP Server on Fedora</title>

Entäpä IPv6? Onnistuu:

$ curl -g -6 "http://[2001:1bc8:11:e::6]" | grep Nginx <title>Test Page for the Nginx HTTP Server on Fedora</title>

IP6to4 on siis mukana automaattisesti :) Instansseja voi poistaa ja lisätä kuormantasaajan taakse rajapinnan yli. Automaattisen skaalauksen voi integroida osaksi omaa sovellusta tai automaatiotyökaluja.

Uuden instanssin lisääminen kuormantasaajan taakse onnistuu helposti:

$ curl -s -H "X-Auth-Token: $(cat token.txt)" -XPOST https://nelb.fi-1.qa.nebulacloud.fi/v1/lb/93cfdc83-7ec8-4984-a9bd-f8a3d328a42f/member -d '{"name":"node2", "IPv4Address": "77.86.189.138"}' | jq .

{ "IPv4Address": "77.86.189.138", "name": "node2" }

Listaus kuormantasaajista tietoineen:

$ curl -s -H "X-Auth-Token: $(cat token.txt)" https://nelb.fi-1.qa.nebulacloud.fi/v1/lb | jq .

[ { "revision": 1, "owner": "7b1a52f4fc3f410181c3601c40488314", "adminStatus": true, "uuid": "93cfdc83-7ec8-4984-a9bd-f8a3d328a42f", "name": "TestBalancer", "externalIPv4Address": "188.117.27.44", "externalIPv6Address": "2001:1bc8:11:e::6", "internalIPv4Addresses": [ "188.117.27.45" ], "loadBalancerPolicy": { "loadBalancingMode": "tcp" }, "listeners": [ { "memberPort": 80, "listenerPort": 80, "name": "http" } ], "members": [ { "IPv4Address": "77.86.189.137", "name": "node1" }, { "IPv4Address": "77.86.189.138", "name": "node2" } ] } ]

Olen myös tehnyt yksikertaisen työkalun, jolla kuormantasaajia voi hallita vaikka osana omia skriptejä:

$ ./nelbtool.py --loadbalancer TestBalancer --show LoadBalancer: TestBalancer adminStatus: True internalIPv4Addresses: [u'188.117.27.45'] uuid: 93cfdc83-7ec8-4984-a9bd-f8a3d328a42f loadBalancerPolicy: {u'loadBalancingMode': u'tcp'} externalIPv4Address: 188.117.27.44 listeners: [{u'memberPort': 80, u'name': u'http', u'listenerPort': 80}] externalIPv6Address: 2001:1bc8:11:e::6 members: [{u'IPv4Address': u'77.86.189.137', u'name': u'node1'}, {u'IPv4Address': u'77.86.189.138', u'name': u'node2'}] owner: 7b1a52f4fc3f410181c3601c40488314 revision: 1 name: TestBalancer $ ./nelbtool.py --loadbalancer TestBalancer --member node2 --remove Member node2 removed

Kuormantasaaja tukee alkuvaiheessa protokollia TCP, HTTP sekä Proxy. Tuomme lisää ominaisuuksia tulevaisuudessa tarpeen mukaan saataville. Nyt kuormantasaajaa voi käyttää loppupisteenä saatavuusalueiden edessä esimerkiksi Kubernetes-klusterille, omille kuormantasaajille, tai web-palvelimien kuormantasaukseen.

Written by
Jura Berg
Consultant