Azure Load Balancer

Torno a scrivere su questo blog dopo interminabili prove e avventure con il super stimato cloud della casa madre di Seattle, Azure.
Dopo aver abbracciato l'open source e dopo averne profondamente intrapreso le potenzialità, ho deciso di testare il mio deploy su una infrastruttura Azure.

L'idea di abbandonare Digital Ocean non mi faceva impazzire (primo amore e mai un down) ma ero curioso di affrontare una nuova sfida (e che sfida).

La mia passione per Docker, mi ha portato subito ad affacciarmi sul sistema operativo più vicino, CoreOS.

Core OS

Da Dicembre 2014 a ieri sera ho perseguito a fasi altalenanti il mio intento: eseguire il deploy di una applicazione MEAN.io dockerizzata su una infrastruttura cluster a tre nodi di CoreOS.

wow

Purtroppo la mia perseveranza non è stata abbastanza: innumerevoli problemi causati da CoreOS mi hanno costantemente messo alla prova.
I continui riavvii del sistema causavano alla mia applicazione inspiegabili down, dovuti al mancato startup di servizi base come fleet ed etcd, risolvibili manualmente solo eseguendo i comandi:

$ sudo systemctl restart fleet
$ sudo systemctl restart etcd

L'utilizzo del Cloud-Config, non mi ha permesso di risolvere problema, perchè purtroppo, ad ogni riavvio le impostazioni tornavano quelle di default.

L'ultimo tentativo disperato è stato infine di creare un ambiente per il deploy, utilizzando le api di Azure, tramite azure-cli e la buona vecchia riga di comando.

Seguendo questa guida ho tentato di crare un ambiente perfetto, ma aimè con nessun buon esito.

CentOS 7

Una mattina, andando a lavoro mi sono detto: ma perchè non utlizzare semplicemente i servizi bilanciati di Azure con macchine CentOS, deployando la mia applicazione in un container di docker? Bingo!, la soluzione era proprio ad una punta dal mio naso.

Cosa avrei perso abbandonando la strada di CoreOS? la possibilità di gestire il mio cluster direttamente dalla macchina di sviluppo? la possibilità di istanziare analoghe VM e gestire molto più agevolmente il deploy?

Ho deciso alla fine di provare questa nuova strada, affidando la mia applicazione nelle mani di CentOS.

Deploy on azure

Per configurare un ambiente bilanciato, occorre per prima cosa creare un nuovo Affinity Group, accedendo alla sezione Settings -> Affinity Groups.

New Affinity Group

Creare quindi un Cloud Service e associarlo al nuovo affinity group.

New Cloud Service

NB: la creazione dell'affinity group non è l'unica soluzione per configurare al meglio un ambiente bilanciato. Per affinity group si intende un approccio per il quale le vm create, sono inserite in uno stesso data center, con la stessa dimensione e posizionate fisicamente vicine.

Questo comporta però alcune limitazioni che possono essere bypassate tramite l'utilizzo di virtual network. Qui una dettagliata differenza tra questi due approcci.

A questo punto, dopo aver definito il servizio cloud per la nostra applicazione occorre creare i vari nodi del cluster: le nostre virtual machine.

New vm conf 1

Configurare la vm, settando il cloud service appena creato, specificando l'affinity group e un availability set name per riconoscere il nostro cluster.

New vm conf 2

Al termine, creare i nuovi endpoint necessari per il bilanciamento e per controllare le singole vm.
Probabilmente in fase di creazione sono stati già definiti endpoint per la connessione SSH, chiaramente usando per ogni macchina una porta differente.

new endpoint

Nella prima macchina però andiamo a creare un endpoint marchiandolo come endpoint bilanciato. Questa opzione permetterà in definizione dell'endpoint sulle altre vm, di sceglierne uno già definito.

new endpoint

Aggiungere un nome e salvare.

end point balanced

Configurare infine anche per gli altri nodi inserendo gli endpoint necessari.

Deploy Docker container

Configurato il nostro cluster su Azure, entriamo nel vivo del deploy caricando il container in CentOS.

Logghiamoci alla prima macchina in SSH, specificando la porta necessaria per identificarla.

NB: le porte SSH per le vm, saranno necessariamente tutte differenti in un ambiente bilanciato, al fine di identificarle univocamente.

Installiamo Docker eseguendo il comando:

$ sudo yum install docker

Facciamo partire il servizio Docker

$ sudo service docker start

Ci logghiamo al nostro repository Docker Hub

$ sudo docker login

Facciamo la pull della nostra immagine e eseguiamo il nostro container secondo le nostre esigenze.

Ripetiamo le operazioni su tutti i nodi del cluster e avremo come risultato un bellissimo ambiente bilanciato.

Per completezza aggiungo di seguito qualche referenza per capire meglio il funzionamento del load balancing di Azure.