Container di Google

Un modo migliore di sviluppare ed eseguire il deployment delle applicazioni

Fai una prova gratuita Visualizza la documentazione
L'approccio Google

Da Gmail a YouTube passando dalla Ricerca, tutti i prodotti e servizi Google vengono eseguiti in container. La containerizzazione consente ai nostri team di sviluppo di spostarsi velocemente, eseguire il deployment del software in modo efficiente e operare su una scala senza precedenti. Ogni settimana eseguiamo oltre due miliardi di container. Negli ultimi dieci anni abbiamo imparato molto sull'esecuzione dei carichi di lavoro containerizzati in fase di produzione e abbiamo condiviso queste conoscenze con la community: dai primi contributi di cgroups al kernel di Linux, alla pubblicazione open source delle progettazioni dei nostri strumenti interni, come il progetto Kubernetes. Ora abbiamo riversato tutta questa esperienza in Google Cloud Platform, in modo che gli sviluppatori e le aziende di qualsiasi dimensione possano facilmente sfruttare le ultime innovazioni nel campo dei container.

Nozioni di base sui container: cosa sono i container?

I container mettono a disposizione un meccanismo di pacchettizzazione logico grazie al quale le applicazioni possono essere astratte dall'ambiente in cui sono eseguite. Questo disaccoppiamento consente di eseguire facilmente e in modo coerente il deployment delle applicazioni basate su container, indipendentemente dal fatto che l'ambiente di destinazione sia un data center privato, la cloud pubblica o il computer portatile di uno sviluppatore. La containerizzazione consente una chiara separazione dei compiti, in quanto gli sviluppatori si concentrano sulla logica e le dipendenze dell'applicazione, mentre le squadre operative IT possono concentrarsi sul deployment e sulla gestione, senza preoccuparsi di dettagli relativi alle applicazioni, quali le versioni software e le configurazioni specifiche dell'applicazione.

Per coloro che provengono da ambienti virtualizzati, i container vengono spesso paragonati alle macchine virtuali (VM). Dovresti già avere una certa familiarità con le VM: un sistema operativo guest come Linux o Windows è in esecuzione su un sistema operativo host ed ha accesso virtualizzato all'hardware sottostante. Come le macchine virtuali, i container consentono di pacchettizzare le applicazioni insieme a librerie e altre dipendenze, garantendo ambienti isolati per l'esecuzione dei servizi software. Tuttavia, come vedrai, le somiglianze finiscono qui, in quanto i container sono unità molto più leggere e offrono una miriade di vantaggi agli sviluppatori e alle squadre operative IT.

Perché i container?

Invece di virtualizzare lo stack hardware, come nel caso delle macchine virtuali, i container eseguono la virtualizzazione a livello del sistema operativo. In tal modo, diversi container possono essere eseguiti direttamente sul kernel del sistema operativo. Ciò significa che i container sono molto più leggeri: condividono il kernel del sistema operativo, si avviano molto più velocemente e utilizzano una frazione della memoria rispetto a quanto richiede l'avvio di un intero sistema operativo.

Esistono molti formati di container. Docker è un formato open source molto popolare, supportato da Google Cloud Platform e Google Kubernetes Engine.

A cosa serve la sandbox?

I container isolano le applicazioni l'una dall'altra, a meno che non le si connetta esplicitamente. Ciò significa che non devi preoccuparti di conflitti di dipendenze o contese di risorse: i limiti delle risorse sono fissati in modo esplicito per ogni servizio. Inoltre si crea un ulteriore livello di sicurezza, dato che le applicazioni non vengono eseguite direttamente sul sistema operativo host.

Ambiente coerente

I container consentono agli sviluppatori di creare ambienti prevedibili isolati da altre applicazioni. I container possono anche includere le dipendenze software necessarie all'applicazione, ad esempio versioni specifiche dei runtime dei linguaggi di programmazione e altre librerie software. Dal punto di vista dello sviluppatore, tutto rimane coerente, indipendentemente da dove venga poi eseguito il deployment dell'applicazione. Questo si traduce in maggiore produttività: gli sviluppatori e i team operativi IT passano meno tempo a eseguire debug e diagnosticare le differenze tra gli ambienti e più tempo a distribuire nuove funzionalità per gli utenti. E significa anche meno bug, poiché gli sviluppatori possono elaborare ipotesi negli ambienti di sviluppo e di test con la certezza che poi rimarranno valide in produzione.

Esecuzione ovunque

I container sono in grado di funzionare praticamente ovunque, facilitando notevolmente lo sviluppo e il deployment: su sistemi operativi Linux, Windows e Mac, su macchine virtuali o fisiche, sulla macchina di uno sviluppatore o in un data center on-premise e, ovviamente, nella cloud pubblica. La grande popolarità del formato Docker per i container aiuta ulteriormente la portabilità. Ovunque tu voglia eseguire software, puoi utilizzare i container.

Isolamento

I container virtualizzano le risorse di CPU, memoria, archiviazione e rete a livello di sistema operativo, offrendo agli sviluppatori una visualizzazione in sandbox del sistema operativo logicamente isolata da altre applicazioni.

  Vantaggi del container Vantaggi della macchina virtuale
Ambiente di runtime coerente
Limitazione tramite sandbox dell'applicazione
Dimensione ridotta sul disco  
Overhead ridotto  
Dal codice alle applicazioni

I container permettono di pacchettizzare l'applicazione e le sue dipendenze in un file manifest di dimensioni ridotte che può essere controllato a livello di versione, consentendo una replica facile dell'applicazione per gli sviluppatori del team e le macchine del cluster.

Proprio come le librerie software pacchettizzano frammenti di codice, permettendo agli sviluppatori di astrarre dalla logica, come l'autenticazione degli utenti e la gestione delle sessioni, i container consentono la pacchettizzazione dell'intera applicazione, permettendo di astrarre dal sistema operativo, dalla macchina e persino dal codice stesso. Se uniti a un'architettura basata sui servizi, i container rendono l'intera unità che gli sviluppatori sono chiamati a progettare molto più piccola, garantendo di conseguenza maggiori livelli di agilità e produttività. Tutto ciò contribuisce a semplificare lo sviluppo, il test, il deployment e in generale la gestione delle applicazioni.

Dall'architettura monolitica a quella basata sui servizi

I container funzionano meglio nelle architetture basate sui servizi. Contrariamente alle architetture monolitiche, dove ogni parte dell'applicazione è intrecciata alle altre, dall'IO all'elaborazione dei dati e al rendering, le architetture basate sui servizi separano le parti in componenti distinti. La separazione e la suddivisione delle operazioni consentono ai servizi di rimanere in esecuzione anche se alcune operazioni si interrompono, aumentando l'affidabilità dell'applicazione nel suo complesso.

La divisione in componenti consente inoltre di sviluppare più velocemente e in modo più affidabile; i codebase più piccoli sono più facili da gestire e, poiché i servizi sono separati, è più semplice testare gli output di input specifici.

I container sono perfetti per le applicazioni basate sui servizi, poiché è possibile eseguire un controllo di integrità di ogni container, limitare ogni servizio a risorse specifiche e avviarli e arrestarli indipendentemente l'uno dall'altro.

E poiché i container astraggono dal codice, consentono di trattare i servizi separati come scatole nere, riducendo ulteriormente lo spazio che lo sviluppatore deve gestire. Quando gli sviluppatori lavorano su servizi che dipendono da altri servizi, possono facilmente avviare un container per quel servizio specifico, senza dover perdere tempo a configurare l'ambiente corretto e risolvere i problemi in anticipo.

Kubernetes: orchestrazione dei container per la produzione

Abbiamo avuto così tanto successo con il nostro sistema interno di gestione dei cluster Borg che abbiamo deciso di integrare ciò che abbiamo imparato nel progetto open source Kubernetes. Ora tutti possono trarre vantaggio dalla nostra esperienza più che decennale. Conosciuto anche come "k8s", Kubernetes provvede all'orchestrazione automatizzata dei container (gestione automatica delle macchine e dei servizi) migliorando l'affidabilità, riducendo il tempo e le risorse necessari per le operazioni di sviluppo ed eliminando le situazioni di stress normalmente associate a queste attività.

Kubernetes rende più semplice il deployment e la gestione delle applicazioni. Kubernetes esegue automaticamente implementazioni e rollback, monitorando lo stato dei servizi per evitare errori di implementazione prima che sia troppo tardi. Esegue inoltre continuamente controlli di integrità dei servizi, riavviando i container che non si sono avviati o che sono bloccati e annunciando ai client solo i servizi che si sono avviati correttamente. Inoltre, Kubernetes scala automaticamente i servizi in base all'utilizzo, consentendoti di eseguire solo ciò di cui hai bisogno, quando ne hai bisogno. Come i container, Kubernetes permette di gestire in maniera dichiarativa il tuo cluster, consentendo una configurazione controllata a livello di versione e facilmente replicabile.

Funzionalità di Kubernetes
  • Implementazioni e rollback automatizzati
  • Monitoraggio dello stato dei servizi
  • Scalabilità automatica dei servizi
  • Gestione dichiarativa
  • Deployment senza restrizioni, anche ibridi

L'elemento forse più importante è che Kubernetes è costruito per essere utilizzato ovunque, permettendo l'orchestrazione di deployment di tutti i tipi, da quelli on-premise a quelli sulla cloud pubblica a quelli ibridi. Ciò consente alla tua infrastruttura di raggiungere gli utenti dove essi si trovano, alle applicazioni di garantire maggiore disponibilità e alle aziende di bilanciare requisiti di sicurezza e contenimento dei costi, adattandosi alle esigenze specifiche.

Il tuo cluster su Google

Naturalmente, Kubernetes funziona al meglio su Google Cloud Platform. Google Kubernetes Engine è la migliore soluzione Kubernetes gestita che ti consente di configurare rapidamente un ambiente pronto per la produzione.

Kubernetes Engine è completamente gestito dai reliability engineer (SRE) di Google, i migliori conoscitori dei container, che assicurano che il cluster sia sempre disponibile e aggiornato. Si integra perfettamente con tutti i servizi GCP, come Stackdriver Monitoring, Diagnostics e Logging; Identity and Access Management e l'avanzata infrastruttura di rete Google.

Funzionalità di Kubernetes Engine
  • Ambiente Kubernetes open source gestito
  • SLA (accordo sul livello del servizio) con disponibilità del 99,5% e alta disponibilità con deployment multizona integrati
  • Integrazione perfetta con gli altri servizi GCP
  • Rapporto prezzo-prestazioni leader di settore
  • Flessibile e interoperabile con cluster on-premise o altri provider di servizi cloud
  • Infrastruttura gestita secondo l'approccio Google

Pensiamo sia comunque importante offrire un ventaglio di opzioni. Google Cloud Platform mette a disposizione diverse soluzioni per l'esecuzione dei container. Dalla piattaforma Platform as a Service completamente gestita con l'ambiente flessibile Google App Engine alla gestione dei cluster con Kubernetes Engine fino a Google Compute Engine, l'infrastruttura che consente di occuparsi personalmente dell'implementazione con un rapporto prezzo/prestazioni imbattibile, tutti possono trovare la soluzione ideale per gestire i container su Google Cloud Platform.

La soluzione completa per i container

Non è finita qui. Google Cloud Platform fornisce gli strumenti necessari per utilizzare i container dallo sviluppo alla produzione. Cloud Build e Container Registry consentono l'archiviazione e la gestione di immagini Docker sfruttando gli alti standard di sicurezza e la rete leader di settore di Google. Container-Optimized OS di Google è un sistema operativo leggero e molto sicuro abbinato ai runtime preinstallati di Docker e Kubernetes. La gestione dei container può essere eseguita interamente all'interno di GCP.

"Un decennio di esperienza nella creazione di sistemi di gestione dei container ci ha insegnato molto e abbiamo cercato di riversare questa esperienza in Kubernetes, il sistema di gestione dei container più avanzato di Google. L'obiettivo di questo sistema è sfruttare le capacità dei container per garantire incrementi significativi della produttività della programmazione e una maggiore semplicità di gestione dei sistemi sia manuale che automatizzata."

Google, Inc