7 best practice per l'utilizzo dei contenitori secondo Google

Nota. trad.: L'autore dell'articolo originale è Théo Chamley, Google Cloud Solutions Architect. In questo post per il blog di Google Cloud, fornisce un riepilogo della guida più dettagliata della sua azienda, chiamata "Migliori pratiche per il funzionamento dei container" In esso, gli esperti di Google hanno raccolto le migliori pratiche per il funzionamento dei container nel contesto dell'utilizzo di Google Kubernetes Engine e altro ancora, toccando una vasta gamma di argomenti: dalla sicurezza al monitoraggio e al logging. Quali sono quindi le pratiche container più importanti secondo Google?

7 best practice per l'utilizzo dei contenitori secondo Google

Motore Kubernetes (Servizio basato su Kubernetes per l'esecuzione di applicazioni containerizzate su Google Cloud - ca. traduzione) è uno dei modi migliori per eseguire carichi di lavoro che necessitano di scalabilità. kubernetes garantirà il corretto funzionamento della maggior parte delle applicazioni se sono containerizzate. Ma se vuoi che la tua applicazione sia facile da gestire e desideri sfruttare appieno Kubernetes, devi seguire le migliori pratiche. Semplificheranno il funzionamento dell'applicazione, il suo monitoraggio e debug e aumenteranno anche la sicurezza.

In questo articolo esamineremo un elenco di cose che dovresti sapere e fare per eseguire i contenitori in modo efficace su Kubernetes. Chi volesse approfondire i dettagli dovrebbe leggere il materiale Migliori pratiche per il funzionamento dei container, e prestare attenzione anche al nostro post precedente sull'assemblaggio dei contenitori.

1. Utilizzare meccanismi di registrazione del contenitore nativi

Se l'applicazione è in esecuzione su un cluster Kubernetes, non è necessario molto per i log. È probabile che un sistema di registrazione centralizzato sia già integrato nel cluster che stai utilizzando. In caso di utilizzo di Kubernetes Engine, questo è responsabile Registrazione Stackdriver. (Nota. trad.: E se utilizzi la tua installazione Kubernetes, ti consigliamo di dare un'occhiata più da vicino alla nostra soluzione Open Source - casa in legno.) Semplifica la tua vita e utilizza meccanismi di registrazione dei contenitori nativi. Scrivi i log su stdout e stderr: verranno automaticamente ricevuti, salvati e indicizzati.

Se lo desideri, puoi anche scrivere i log Formato JSON. Questo approccio semplificherà l'aggiunta di metadati. Inoltre, Stackdriver Logging avrà la possibilità di effettuare ricerche nei log utilizzando questi metadati.

2. Assicurati che i contenitori siano senza stato e immutabili

Affinché i contenitori funzionino correttamente in un cluster Kubernetes, devono essere apolidi e immutabili. Una volta soddisfatte queste condizioni, Kubernetes può svolgere il proprio lavoro, creando e distruggendo entità applicative quando e dove necessario.

apolide significa che qualsiasi stato (dati persistenti di qualsiasi tipo) viene archiviato all'esterno del contenitore. Per questo, a seconda delle esigenze, possono essere utilizzate diverse tipologie di storage esterno: Cloud Storage, Dischi persistenti, Redis, Cloud SQL o altri database gestiti. (Nota. trad.: Maggiori informazioni al riguardo nel nostro articolo “Operatori per Kubernetes: come eseguire applicazioni stateful".)

Immutabile significa che il contenitore non verrà modificato durante la sua vita: nessun aggiornamento, patch, modifica della configurazione. Se devi aggiornare il codice dell'applicazione o applicare una patch, crea una nuova immagine e distribuiscila. Si consiglia di spostare la configurazione del contenitore (porta di ascolto, opzioni dell'ambiente di runtime, ecc.) esternamente - a Segreti и ConfigMap. Possono essere aggiornati senza dover creare una nuova immagine del contenitore. Per creare facilmente pipeline con l'assemblaggio di immagini, è possibile utilizzare Costruzione cloud. (Nota. trad.: Utilizziamo uno strumento Open Source per questi scopi Dapp.)

7 best practice per l'utilizzo dei contenitori secondo Google
Un esempio di aggiornamento della configurazione di distribuzione in Kubernetes utilizzando ConfigMap montato nei pod come configurazione

3. Evitare contenitori privilegiati

Non esegui le applicazioni come root sui tuoi server, giusto? Se un utente malintenzionato entra nell'applicazione, otterrà l'accesso root. Le stesse considerazioni si applicano alla mancata esecuzione di contenitori privilegiati. Se è necessario modificare le impostazioni sull'host, è possibile specificare il contenitore funzionalità utilizzando l'opzione securityContext in Kubernetes. Se hai bisogno di cambiare sysctls, Kubernetes ha estratto separato per questo. In generale, cerca di sfruttare al massimo dentro- e contenitori sidecar per eseguire operazioni privilegiate simili. Non è necessario che siano accessibili al traffico interno o esterno.

Se amministri un cluster, puoi utilizzare Politica di sicurezza dei pod per le restrizioni sull'uso dei contenitori privilegiati.

4. Evitare di eseguire come root

Dei contenitori privilegiati abbiamo già parlato, ma sarebbe ancora meglio se, oltre a questo, non si eseguissero le applicazioni all'interno del contenitore come root. Se un utente malintenzionato trova in un'applicazione con diritti di root una vulnerabilità remota che consente l'esecuzione di codice e dopo di che riesce a lasciare il container attraverso una vulnerabilità ancora sconosciuta, ottiene il root sull'host.

Il modo migliore per evitarlo è innanzitutto non eseguire nulla come root. Per fare ciò, puoi usare la direttiva USER в Dockerfile o runAsUser in Kubernetes. L'amministratore del cluster può anche configurare il comportamento di applicazione utilizzando Politica di sicurezza dei pod.

5. Semplifica il monitoraggio dell'applicazione

Come la registrazione, il monitoraggio è parte integrante della gestione delle applicazioni. Una soluzione di monitoraggio popolare nella comunità Kubernetes è Prometeo - un sistema che rileva automaticamente pod e servizi che richiedono monitoraggio. (Nota. trad.: Vedi anche il nostro rapporto dettagliato sul tema del monitoraggio tramite Prometheus e Kubernetes.) Stackdriver è in grado di monitorare i cluster Kubernetes e include la propria versione di Prometheus per il monitoraggio delle applicazioni.

7 best practice per l'utilizzo dei contenitori secondo Google
Dashboard Kubernetes su Stackdriver

Prometheus prevede che l'applicazione inoltri le metriche all'endpoint HTTP. Disponibile per questo Librerie client Prometheus. Lo stesso formato è utilizzato da altri strumenti come Censimento aperto и Istio.

6. Rendi disponibile lo stato di integrità dell'app

La gestione delle applicazioni in produzione è aiutata dalla capacità di comunicare il proprio stato all'intero sistema. L'applicazione è in esecuzione? Va bene? Sei pronto a ricevere traffico? Come si sta comportando? Il modo più comune per risolvere questo problema è implementare controlli sanitari (controlli sanitari). Kubernetes ha due tipi: sonde di vitalità e prontezza.

Per la sonda di vitalità (controlli di vitalità) l'applicazione deve avere un endpoint HTTP che restituisce una risposta "200 OK" se è funzionante e le sue dipendenze di base sono soddisfatte. Per la sonda di disponibilità (verifiche di disponibilità del servizio) l'applicazione deve avere un altro endpoint HTTP che restituisce una risposta "200 OK" se l'applicazione è in uno stato integro, i passaggi di inizializzazione sono stati completati e qualsiasi richiesta valida non genera un errore. Kubernetes instraderà il traffico al contenitore solo se l'applicazione è pronta in base a questi controlli. È possibile unire due endpoint se non vi è alcuna differenza tra gli stati di attività e di disponibilità.

Puoi leggere ulteriori informazioni al riguardo nell'articolo correlato di Sandeep Dinesh, Developer Advocate di Google: "Best practice Kubernetes: configurazione di controlli di integrità con sonde di disponibilità e attività'.

7. Scegli attentamente la versione dell'immagine

La maggior parte delle immagini pubbliche e private utilizza un sistema di tag simile a quello descritto in Migliori pratiche per la costruzione di contenitori. Se l'immagine utilizza un sistema vicino a versione semantica, è necessario tenere conto delle specificità dell'etichettatura. Ad esempio, etichetta latest può spostarsi frequentemente da un'immagine all'altra: non è possibile fare affidamento su di esso se sono necessarie build e installazioni prevedibili e ripetibili.

Puoi usare l'etichetta X.Y.Z (sono quasi sempre invariati), ma in questo caso tieni traccia di tutte le patch e gli aggiornamenti dell'immagine. Se l'immagine che stai utilizzando ha un tag X.Y, questa è una buona opzione per la sezione aurea. Scegliendolo riceverai automaticamente le patch e allo stesso tempo ti affiderai alla versione stabile dell'applicazione.

PS da traduttore

Leggi anche sul nostro blog:

Fonte: habr.com

Aggiungi un commento