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 diversi 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.

Nave da carico con container all'interno di una nuvola. Una balena nuota sullo sfondo.
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, il cloud pubblico o il laptop 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 i team delle operazioni IT possono concentrarsi sul deployment e sulla gestione, senza preoccuparsi di dettagli relativi alle applicazioni, quali le versioni software e le configurazioni specifiche dell'app.

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 e 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 ai team delle operazioni IT.

Diagramma del confronto tra macchine virtuali e container.
Le macchine virtuali contengono le seguenti unità, impilate una sull'altra per la visualizzazione: app, file binari/librerie, sistema operativo guest, hypervisor, sistema operativo host, infrastruttura. I container contengono le seguenti unità, impilate una sull'altra per la visualizzazione: app, file binari/librerie, runtime del container, sistema operativo host, infrastruttura.
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 bare metal, sulla macchina di uno sviluppatore o in data center on-premise e, ovviamente, nel cloud pubblico. La grande popolarità del formato dell'immagine 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.

Scopri i 3 modi migliori per eseguire i container su Google Cloud.

Google Kubernetes Engine per una soluzione di orchestrazione dei container, Cloud Run per un approccio interamente serverless e Compute Engine per utilizzare semplicemente le macchine virtuali.

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 DevOps 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 dell'integrità dei servizi
  • Scalabilità automatica dei servizi
  • Gestione dichiarativa
  • Deployment ovunque, inclusi gli ambienti 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 sul cloud pubblico a quelli ibridi. Ciò consente alla tua infrastruttura di raggiungere gli utenti dove essi si trovano, alle applicazioni di garantire maggiore disponibilità e alla tua azienda di bilanciare requisiti di sicurezza e contenimento dei costi, grazie alla possibilità di adattarsi alle esigenze specifiche.

Cloud ibrido Kubernetes: la tua applicazione viene eseguita su Kubernetes, con la possibilità di deployment in altri cloud, in GCP, nel tuo data center.
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
  • 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 del settore
  • Flessibile e interoperabile con i tuoi cluster on-premise o altri cloud provider
  • Infrastruttura gestita di livello Google

Pensiamo sia comunque importante offrire un ventaglio di opzioni. Google Cloud Platform mette a disposizione diverse soluzioni per l'esecuzione dei container. Da un ambiente completamente gestito con Google Cloud Run alla gestione dei cluster con Kubernetes Engine fino alla creazione di una propria infrastruttura basata su Google Compute Engine con un rapporto prezzo/prestazioni di livello superiore, puoi trovare la soluzione ideale per eseguire 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.

Creazione: Container Builder, Archiviazione: Container Registry, Esecuzione: Container Optimized OS, Orchestrazione: Kubernetes Engine

"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."

“Borg, Omega, and Kubernetes: Lessons learned from three container management systems over a decade,” Google LLC, 2016