Macchine virtuali e contenitori in Azure

Nota

Azure offre due modelli di distribuzione per creare e usare le risorse: Gestione risorse e la distribuzione classica. In questo articolo viene illustrato l'utilizzo di entrambi i modelli, ma Microsoft indica che le distribuzioni più nuove utilizzano il modello di gestione delle risorse.

Le soluzioni del cloud di Azure si basano sulle macchine virtuali (emulazione di componenti hardware del computer fisico) e consentono così la creazione agile di pacchetti di distribuzioni software e un migliore consolidamento delle risorse rispetto all'hardware fisico. I contenitori Docker e l'ecosistema Docker hanno espanso significativamente le modalità a disposizione per sviluppare, fornire e gestire il software distribuito. Il codice applicativo presente in un contenitore è isolato dalla VM host e da altri contenitori nella stessa VM. Questo isolamento offre maggiore flessibilità di sviluppo e distribuzione.

Azure offre i valori Docker seguenti:

  • Molti modi diversi di creare host Docker per i contenitori in base alle proprie esigenze
  • Il servizio contenitore di Azure crea cluster di host contenitori usando agenti di orchestrazione come marathon e swarm.
  • Azure Resource Manager e i modelli di gruppi di risorse per semplificare la distribuzione e l'aggiornamento di applicazioni distribuite complesse
  • integrazione con un'ampia gamma di strumenti di gestione della configurazione sia proprietari che open source

E poiché è possibile creare a livello di programmazione le VM e i contenitori Linux in Azure, è inoltre possibile usare strumenti di orchestrazione per VM e contenitori per creare gruppi di Macchine virtuali (VM) e distribuire le applicazioni sia all'interno di contenitori Linux che, ora, all'interno di contenitori Windows.

In questo articolo non solo vengono discussi questi concetti a livello generale, ma vengono anche forniti numerosi link per accedere a maggiori informazioni, esercitazioni e prodotti correlati all’utilizzo di contenitori e cluster in Azure. Se si è già in possesso di queste informazioni, i collegamenti sono disponibili negli strumenti per l'uso dei contenitori.

La differenza tra le macchine virtuali e i contenitori

Le macchine virtuali vengono eseguite all'interno di un ambiente di virtualizzazione hardware isolato fornito da un hypervisor. In Azure il servizio Macchine virtuali gestisce tali attività per conto dell'utente. Per creare macchine virtuali è sufficiente scegliere il sistema operativo e configurarlo e/o caricare un'immagine di macchina virtuale personalizzata. Il servizio Macchine virtuali è una tecnologia collaudata e consolidata nel tempo e sono disponibili diversi strumenti per la gestione dei sistemi operativi e delle app in esso contenuti. Le app in una macchina virtuale vengono nascoste al sistema operativo. Dal punto di vista di un'applicazione o un utente in una macchina virtuale, quest'ultima appare come un computer fisico autonomo.

I contenitori Linux e quelli creati e ospitati con gli strumenti Docker non usano un hypervisor per garantire l'isolamento. L'host del contenitore usa le funzionalità di isolamento dei processi e del file system del kernel Linux per esporre al contenitore le relative app, alcune funzionalità kernel e il relativo file system isolato. Dal punto di vista di un'app in esecuzione all'interno di un contenitore, quest'ultimo appare come un'istanza univoca del sistema operativo. Un'app indipendente non può vedere processi o altre risorse all'esterno del relativo contenitore.

In un contenitore Docker vengono usate molte meno risorse rispetto a quelle usate in una macchina virtuale. I contenitori Docker fanno uso di un modello di esecuzione e isolamento dell'applicazione che non condivide il kernel dell'host Docker. Il contenitore ha una superficie molto inferiore, perché non include l'intero sistema operativo. I tempi di avvio e lo spazio su disco necessario sono notevolmente inferiori rispetto a quelli di una macchina virtuale. I contenitori Windows offrono gli stessi vantaggi dei contenitori Linux per le app eseguite in Windows. I contenitori Windows supportano il formato di immagine Docker e l'API Docker, tuttavia possono essere gestiti anche tramite PowerShell. Due runtime contenitore sono disponibili con i contenitori Windows, i contenitori Windows Server e i contenitori Hyper-V. I contenitori Hyper-V offrono un ulteriore livello di isolamento, perché ogni contenitore è ospitato in una macchina virtuale altamente ottimizzata. Per ulteriori informazioni sui contenitori Windows, vedere Informazioni sui contenitori Windows. Per iniziare a usare i contenitori di Windows in Azure, vedere come distribuire un cluster del servizio contenitore di Azure.

Per quale scopo sono utili i contenitori?

I contenitori permettono di migliorare quanto segue:

  • Velocità dello sviluppo e della condivisione estesa del codice dell'applicazione.
  • Velocità e affidabilità del testing di un'applicazione.
  • Velocità e affidabilità della distribuzione di un'applicazione.

I contenitori vengono eseguiti in un host contenitore o un sistema operativo. In Azure si tratta di una macchina virtuale di Azure. Anche se si sta già apprezzando l'idea dei contenitori, sarà comunque necessario disporre di un'infrastruttura di VM che ospiti i contenitori, ma il vantaggio è che non occorre determinare su quale VM vengono eseguiti i contenitori (anche se, nel caso in cui il contenitore richieda un ambiente di esecuzione di Linux o Windows, sarà importante tenerlo presente, ad esempio).

Per quale scopo sono utili i contenitori?

I contenitori sono utili per molti scopi, ad esempio consentono—come Servizi Cloud di Azure e Azure Service Fabric—la creazione di applicazioni distribuite con singoli servizi e orientate ai microservizi, in cui il design dell'applicazione si basa su parti più piccole e componibili e non su componenti più grandi e ad accoppiamento avanzato.

Ciò vale soprattutto in ambienti di cloud pubblico come Azure, in cui in si possono affittare VM quando e dove si desidera. Non solo si ottengono un isolamento, una rapida distribuzione e gli strumenti di orchestrazione, ma è anche possibile prendere decisioni più efficienti sull’infrastruttura delle applicazioni.

Ad esempio, si potrebbe disporre attualmente di una distribuzione costituita da 9 VM di Azure di grandi dimensioni per un'applicazione distribuita a disponibilità elevata. Se i componenti di questa applicazione possono essere distribuiti in contenitori, sarà possibile utilizzare solo 4 VM e distribuire i componenti dell'applicazione all'interno di 20 contenitori per garantire la ridondanza e il bilanciamento del carico.

Questo è solo un esempio, naturalmente, ma se si riesce ad attuarlo nel proprio scenario, è possibile regolare i picchi di utilizzo con più contenitori anziché con più VM di Azure e utilizzare il carico complessivo della CPU rimanente con molta più efficienza di prima.

Inoltre, esistono molti scenari che non si prestano a un approccio di microservizi; sarà possibile capire meglio se i microservizi e i contenitori sono di aiuto.

Vantaggi dei contenitori per gli sviluppatori

In generale, è facile rendersi conto che la tecnologia dei contenitori è un passo in avanti, ma esistono anche vantaggi più specifici. Esaminiamo l'esempio dei contenitori Docker. Questo argomento non descrive approfonditamente Docker (a tale scopo vedere le informazioni su Docker o consultare Wikipedia), ma Docker e il relativo ecosistema offrono notevoli vantaggi agli sviluppatori e ai professionisti IT.

Gli sviluppatori familiarizzano velocemente con i contenitori di Docker, perché in particolare ciò rende semplice l'uso di contenitori Windows e Linux:

  • Gli sviluppatori possono usare comandi semplici e incrementali per creare un'immagine fissa facile da distribuire e possono automatizzare la creazione di tali immagini utilizzando un dockerfile
  • Gli sviluppatori possono condividere facilmente le immagini usando semplici comandi push e pull in stile git in registri Docker pubblici o privati
  • Possono considerare i componenti dell’applicazione isolata invece che i computer.
  • Possono utilizzare un numero elevato di strumenti che comprendono contenitori Docker e immagini di base diverse

Vantaggi dei contenitori per professionisti IT e operazioni

Anche i professionisti IT e operazioni traggono benefici dalla combinazione di contenitori e macchine virtuali.

  • i servizi indipendenti sono isolati dall’ambiente di esecuzione host della VM
  • il codice indipendente è effettivamente identico
  • i servizi indipendenti possono essere avviati, arrestati e spostati rapidamente tra gli ambienti di sviluppo, test e produzione

Funzionalità come queste—e ve ne sono altre—suscitano l'interesse di organizzazioni IT professionali consolidate che hanno il compito di adattare le risorse—inclusa la pura potenza di elaborazione—alle attività necessarie non solo per continuare a operare sul mercato, ma anche per aumentare la soddisfazione dei clienti e offrire loro una migliore assistenza. Aziende di piccole dimensioni, ISV e -startup hanno esattamente la stessa necessità, ma potrebbero descriverla in maniera diversa.

Per quali scopi sono utili le macchine virtuali?

Le macchine virtuali forniscono la struttura portante del cloud computing, e questo non cambia. Se le macchine virtuali si avviano più lentamente, hanno un maggiore footprint su disco e non vengono mappati direttamente in un'architettura di microservizi, hanno dei vantaggi molto importanti:

  1. Per impostazione predefinita, dispongono protezioni di sicurezza predefinite molto più solide per il computer host
  2. Supportano qualsiasi sistema operativo tra i più diffusi e le configurazioni di applicazioni
  3. Dispongono di ecosistemi di strumenti consolidati per il comando e il controllo
  4. Forniscono l'ambiente di esecuzione ai contenitori host

Quest’ultimo elemento è importante, poiché un'applicazione indipendente richiede comunque un sistema operativo specifico e un tipo di CPU, a seconda delle chiamate che l’applicazione farà. È importante ricordare che si installano contenitori nelle VM perché questi contengono le applicazioni che si desidera distribuire. I contenitori non possono sostituire le VM o i sistemi operativi.

Confronto a livello generale delle funzionalità delle VM e dei contenitori

La tabella seguente descrive a un livello generale le differenze in termini di funzionalità presenti—senza particolari operazioni aggiuntive—tra le VM e i contenitori Linux. Si noti che alcune funzionalità potrebbero essere più o meno vantaggiose a seconda delle proprie necessità di applicazione, e che, come accade con tutti i software, ulteriori operazioni comportano un incremento del supporto alle funzionalità, in particolare nell’area della sicurezza.

Funzionalità VM Contenitori
Supporto alla sicurezza "predefinito" a un livello superiore a un livello leggermente inferiore
Memoria su disco richiesta Sistema operativo completo più app Solo requisiti app
Tempo richiesto per l'avvio Notevolmente più lungo: avvio del sistema operativo più caricamento app Notevolmente più breve: avviare solo le app perché il kernel è già in esecuzione
Portabilità Portabile con preparazione adeguata Portabile in formato di immagine; in genere più ridotto
Automazione dell’immagine Varia notevolmente a seconda del sistema operativo e delle app Registro di Docker; altri

Creazione e gestione di gruppi di VM e contenitori

A questo punto, qualsiasi architetto, sviluppatore o specialista in operazioni IT potrebbe pensare: "Posso automatizzare TUTTO questo; questo è davvero Data-Center-As-A-Service!".

È vero, può esserlo, e un numero infinito di sistemi, molti dei quali magari già in uso, possono gestire gruppi di macchine virtuali di Azure e inserire codice personalizzato usando script, spesso con CustomScriptingExtension per Windows o CustomScriptingExtension per Linux. È possibile—e probabilmente l'operazione è già stata eseguita—automatizzare le distribuzioni di Azure usando gli script di PowerShell o dell'interfaccia della riga di comando di Azure.

Queste funzionalità vengono poi spesso trasferite a strumenti come Puppet e Chef per automatizzare la creazione e la configurazione delle macchine virtuali su larga scala. Qui sono disponibili alcuni collegamenti relativi all'uso di questi strumenti con Azure.

Modelli di gruppo di risorse di Azure

Più di recente, Azure ha rilasciato l'API REST di Azure Resource Manager e aggiornato gli strumenti di PowerShell e dell'interfaccia della riga di comando di Azure per semplificarne l'uso. È possibile distribuire, modificare o ridistribuire intere topologie di applicazioni usando i modelli di Gestione risorse di Azure con l'API di Gestione risorse di Azure usando:

Distribuzione e gestione di interi gruppi di VM di Azure e contenitori

Esistono diversi sistemi più diffusi che consentono di distribuire interi gruppi di VM e installare Docker (o altri sistemi host Linux per contenitori ) su di essi come gruppo automatizzabile. Per i link diretti, vedere la sezione contenitori e strumenti qui di seguito. Esistono diversi sistemi che eseguono questa operazione in misura maggiore o minore, e questo elenco non è esaustivo. A seconda delle proprie competenze e scenari, essi possono essere o meno utili.

Docker mette a disposizione un proprio set di strumenti per la creazione di VM (docker-machine) e uno strumento di gestione del cluster del contenitore Docker per il bilanciamento del carico (swarm). L'estensione della VM Docker di Azure mette anche a disposizione il supporto predefinito per docker-compose, che può distribuire contenitori configurati di applicazioni in più contenitori.

Inoltre, è possibile provare il Data Center Operating System (DCOS) di Mesosphere. DCOS si basa sul "kernel di sistemi distribuiti" open source mesos che consente di trattare il datacenter come un servizio indirizzabile. DCOS mette a disposizione pacchetti predefiniti per diversi importanti sistemi come Spark e Kafka (e altri), nonché servizi predefiniti come Marathon (un sistema di controllo dei contenitori) e Chronos (un'utilità di pianificazione distribuita). Mesos è nata attraverso le lezioni apprese con Twitter, AirBnb e altre aziende di scala web. È anche possibile usare swarm come motore di orchestrazione.

Inoltre, kubernetes è un sistema open source per la gestione di gruppi di VM e contenitori derivato dalle lezioni apprese con Google. È possibile utilizzare kubernetes con Weave per fornire supporto alla rete.

Deis è una "Platform-as-a-Service" (PaaS) open source che rende più semplice distribuire e gestire le applicazioni sui propri server. Deis è basato su Docker e CoreOS per fornire una PaaS semplificata con un flusso di lavoro ispirato a Heroku. È possibile creare un gruppo di VM di Azure a 3 nodi e installare Deis in Azure e quindi installare un'applicazione Hello World Go in modo semplice.

CoreOS, una distribuzione Linux con un footprint ottimizzato, supporto Docker e un proprio sistema contenitore denominato rkt, mette anche a disposizione uno strumento di gestione del gruppo di contenitori denominato fleet.

Ubuntu, un'altra distribuzione Linux molto diffuso, supporta Docker molto bene, ma supporta anche Linux clusters (in stile LXC).

Strumenti per lavorare con VM di Azure e contenitori

Per lavorare con i contenitori e le VM di Azure sono necessari degli strumenti. In questa sezione viene fornito un elenco di solo alcuni dei più utili o importanti concetti e strumenti sui contenitori, i gruppi e i grandi strumenti per la configurazione e l’orchestrazione che vengono usati con essi.

Nota

Quest'area si sta evolvendo davvero rapidamente e nonostante facciamo del nostro meglio per mantenere aggiornato questo argomento e i relativi link, potrebbe essere un compito difficile. Si consiglia di effettuare ricerche su argomenti di interesse per rimanere aggiornati.

Tecnologie per i contenitori e le VM

Alcune tecnologie per i contenitori di Linux:

Link ai contenitori Windows:

Link a Visual Studio Docker:

Strumenti di Docker:

Docker su Microsoft Azure:

Distribuzioni Linux ed esempi di Azure:

Configurazione, gestione del cluster e orchestrazione del contenitore:

Passaggi successivi

Vedere Docker e Contenitori Windows.