use openstack to run java programs inside a docker container

Download Use OpenStack to run Java programs inside a Docker container

Post on 13-Apr-2017

232 views

Category:

Engineering

2 download

Embed Size (px)

TRANSCRIPT

Use OpenStack to run Java programs inside a Docker containerSEBASTIANO MIANOTESINA PROTOCOLLI E ARCHITETTURE DI ROUTING

1/2409/02/2015 16:19

1

OutlineProblem presentation and proposed solutionImplementation stepsPerformance AnalysisFinal Considerations2/2409/02/2015 16:19

Per prima cosa vediamo come ho deciso di impostare questa presentazione. Inizialmente parler del problema che si doveva cercare di risolvere e la soluzione proposta per risolverlo. Successivamente parler degli step implementativi che ho seguito per la realizzazione della soluzione finale e infine far una piccola analisi delle performance ottenute.2

OpenStackOpenStackis afree and open-sourcecloud computing software platform.Users primarily deploy it as aninfrastructure as service(IaaS) solution.

3/24

09/02/2015 16:19

OpenStack un progetto opensource realizzato dalla NASA e distribuito pubblicamente che consiste in una piattaforma software open-source per il cloud computing per realizzare soluzione IaaS (infrastructure as a service). E formato da una serie di progetti correlate che permettono di gestire principalmente tramite una dashboard o delle apposite API risorse di processing, storage e networking.3

VM migration: use case

4/24

09/02/2015 16:19

Una delle possibilit di applicazione di OpenStack rappresentata dal seguente caso duso. Supponiamo di avere una OpenStack Network di un ISP, e supponiamo di avere un router di casa (home router) che forniamo allutente e su cui vogliamo fare in modo da realizzare dei servizi aggiuntivi da fornire allutente o comunque realizzare qualche pre-processamento di dati. Questo vuol dire avere la possibilit di caricare a runtime delle VM dentro il router di casa dellutente (home router) che vanno ad eseguire questi servizi aggiuntivi. Questo significa scegliere uno tra i diversi tipi di hypervisor a disposizione che permettano di andare ad eseguire la VM dentro lhome router. Tra quelli a disposizione vi sono questi. Tuttavia abbiamo notato che nellambito di questo caso duso effettuare un trasferimento in una rete possibilmente con una velocit non alta sicuramente un aggravio importante data la notevole dimensione di queste VM che usando queste tecnologie si portano dietro un intero SO. Per cercare di mitigare questo problema si allora cercato di utilizzare un altro tipo di tecnologia4

Hypervisor VMs vs. LXC vs. Docker LXC5/24

09/02/2015 16:19

Come possiamo notare da questa figura per quanto riguarda i classici hypervisor, abbiamo la tipica configurazione delle bare machine (bare metal = macchine senza un SO) oppure un tipo due dove abbiamo sopra lhardware anche un SO, tuttavia notiamo che in questa configurazione la VM si porta dietro tutto un SO cosa che la rende sicuramente molto pesante da trasferire. Basandosi si questa considerazione stato sviluppato un nuovo tipo di virtualizzazione a livello di SO denominata Linux Containers che permette di eseguire molteplici sistemi linux isolati (containers) ma condividono il sistema operativo e dove c bisogno anche le librerie. Basandosi su questo sistema di virtualizzazione nato il progetto OpenSource denominato Docker in pratica un framework LXC che astrae i vari aspetti della realizzazione sottostante, esso porta una nuova serie di caratteristiche che rende i container pi produttivi, tra i quali la possibilit di fare dei build automatici di questi container (Dockerfiles), delle RESP API che ne permettono linterazione oltre ad una Command Line Interface. Utilizzare delle VM basate su questa nuova considerazione rende questultime sicuramente pi leggere e quindi il tempo di trasferimento molto pi basso rispetto al caso precedente, tuttavia5

VM migration: Docker6/24

also 400-500 MB09/02/2015 16:19

mentre abbiamo notato che le dimensioni sono sicuramente pi piccolo rispetto ad una VM full in realt si potuto constatare che le dimensioni raggiungono facilmente i 400-500 MB, sicuramente ancora troppi per pensare di non poter influire in maniera significativa sulle prestazioni. Per risolvere questo ulteriore problema si allora pensato di evitare questo trasferimento di immagini che comunque richiedono una dimensione significativa e trasferire programmi JAVA (file JAR) invece di queste.6

Migrate Java programs instead VM

7/2409/02/2015 16:19

Diamo uno sguardo adesso dentro al nodo compute, che dovrebbe essere il router di casa. Come possiamo vedere allinterno di questo possiamo avere diverse istanze con diverse vNIC, ognuna di queste collegata ad openvswitch che un multilayer switch OpenSource che supporta la maggior parte di protocolli e standard utilizzati nel mondo delle reti. Questo permette alle istanze di comunicare tra di loro oltre a raggiungere lesterno attraverso questa interfaccia 2 che fa un tunnel GRE verso il network node. Quello che a noi interessa listanza che andiamo ad eseguire dentro questo nodo controller che come possiamo vedere in pratica un container Docker dotato di una JVM (Java Virtual Machine) che mi permette quindi di eseguire i programmi Java allinterno. In questo caso il container con la JVM per non viene pi trasferito utilizzando la rete ma si trova gi allinterno del nodo compute e funge soltanto da ambiente isolato per la JVM allinterno del quale ospitare programmi Java. 7

VM migration problem: solution

8/24

09/02/2015 16:19

Ritornando quindi alla figura di prima che rappresenta il caso duso possiamo notare che in questo caso non andiamo pi a trasferire la VM che quindi aveva dimensioni significative ma andiamo a trasferire un programma Java che sicuramente avr dimensioni pi ridotte.8

Implementation stepsModify OpenStack so that recognizes this object (JAR) and lunches this object inside a Docker container with a JVM.Create a bridge in C using libpcap library that forwards packets between 2 vNIC.Integrate the previous prototype in Java.

9/2409/02/2015 16:19

Vediamo gli step implementativi che ho seguito e che mi hanno permesso di raggiungere questo risultato finale.Per prima cosa naturalmente necessario apportare delle modifiche ad OpenStack affinch riconosca loggetto JAR come una istanza da lanciare in un determinato nodo compute che naturalmente supporta questa mia modifica allo stesso modo in cui Nova va a lanciare una generica VM dentro il nodo compute. Oltre a questo naturalmente necessaria anche modifica al tipo di hypervisor da utilizzare affinch una volta ricevuta la richiesta vada a lanciare il JAR dentro il container Docker.Laltra parte del progetto era sostanzialmente focalizzata sul creare una sorta di libreria in Java che svolga da wrapper alla libpcap utilizzando la JNI al fine ultimo di creare un bridge che andasse ad inoltrare i pacchetti ricevuti tra due vNIC.9

OpenStack and libvirt

In orderto interact with the virtualization capabilities of VM, OpenStack uses the libvirt and its corresponding API to deploy an instance on the compute node.10/2409/02/2015 16:19

Al fine di interagire con le capacit di virtualizzazione di una VM, OpenStack, ed in particolare il modulo predisposto alla gestione della parte di computing che nova, usa libvirt che una libreria usata proprio per gestire le capacit di virtualizzazione di un hypervisor. Allinterno del nodo compute deve infatti essere presente un driver specifico per un determinato tipo di hypervisor che permetta di ricevere questi comandi da nova e creare ed avviare listanza che mi interessa. Nel mio caso creare un docker ed andare a mettere il Jar al suo interno.10

OpenStack and NovaDocker

11/24

09/02/2015 16:19

Per fare questo ho iniziato basandomi su un driver gi esistente e denominato NovaDocker che appunto riceve le richieste tramite le API di nova (le Virt API) e le trasforma in effettive realizzazioni di istanze parlando con Docker tramite le sue REST API. Io ho sviluppato un driver chiamato NovaJar che in pratica utilizza gran parte delle funzionalit disponibili da NovaDocker con la differenza che oltre ad avviare il container in questo caso va anche ad iniettare il Jar al suo interno. In realt in questo modo possibile anche unaltra realizzazione ossia quella dove il container invece di partire ogni volta che viene lanciata unistanza sia gi in esecuzione dentro il nodo compute e quindi ogni volta che viene lanciato il JAR non viene creato un nuovo container ma viene semplicemente lanciato il JAR al suo interno.Come possiamo vedere da questa freccia il driver NovaJar ha la necessit di comunicare con un altro modulo di OpenStack denominato Glance.11

Transfer instance (JAR) from Glance

The Glance project provides a service where users can upload and discover data assets that are meant to be used with other services. This currently includes images and metadata definitions.

os_command_line12/24image_id09/02/2015 16:19

Il modulo Glance offre un servizio dove gli utenti possono caricare le virtual disk images, nel mio caso i JAR che in pratica rappresentano listanza da eseguire dentro il nodo compute. Come possiamo vedere dalla figura abbiamo il servizio di storing delle immagini di OpenStack che glance, questo dotato di API che permettono di svolgere diverse operazioni su queste immagini.Possibilit di aggiungere metadati: glance da la possibilit oltre ad immagazzinare delle immagini allinterno del suo db anche di associare a queste delle informazioni, cio dei metadati. Io ho introdotto una property che questa os_command_line che in pratica rappresenta dei parametri che possono essere dati in ingresso al jar quando questo viene avviato. Nel mio caso questa property mi permette di scegliere al volo, cio durante la fase di lancio dellinstanza quali sono le interfacce su cui attivare la funzionalit di bridge e quali invece lasciare con il normale stack TC