7 migliori pratiche per la gestione dei container secondo Google

Nota del traduttore.: L'autore dell'articolo originale è Théo Chamley, architetto di soluzioni cloud di Google. In questo post del blog di Google Cloud ha presentato un breve riassunto di una guida più dettagliata della sua azienda, intitolata «Best Practices for Operating Containers». In essa gli esperti di Google hanno raccolto le migliori pratiche per l'operatività dei container nel contesto dell'uso di Google Kubernetes Engine e non solo, affrontando un'ampia gamma di argomenti: dalla sicurezza al monitoraggio e alla registrazione. Quindi, quali pratiche riguardanti i container sono più importanti secondo Google?

7 migliori pratiche per la gestione dei container secondo Google

Kubernetes Engine (un servizio basato su Kubernetes per eseguire applicazioni containerizzate su Google Cloud — nota del traduttore.) — è uno dei migliori modi per eseguire carichi di lavoro che necessitano di scalabilità. Kubernetes garantirà il corretto funzionamento della maggior parte delle applicazioni, se sono containerizzate. Ma se si desidera che l'applicazione sia facilmente gestibile e si vogliono sfruttare tutti i vantaggi di Kubernetes, è necessario seguire le migliori pratiche. Queste semplificheranno l'operatività dell'applicazione, il suo monitoraggio e debug, e miglioreranno anche la sicurezza.

In questo articolo esamineremo l'elenco delle cose da sapere e fare per un funzionamento efficace dei container in Kubernetes. Chi desidera approfondire i dettagli dovrebbe leggere il materiale Best Practices for Operating Containers, e fare attenzione al nostro post precedente sulla creazione dei container.

1. Utilizza i meccanismi nativi dei container per il logging

Se l'applicazione è in esecuzione in un cluster Kubernetes, non è necessario molto per i log. È probabile che un sistema di logging centralizzato sia già integrato nel cluster utilizzato. Nel caso di utilizzo di Kubernetes Engine, questo è gestito da Stackdriver Logging. (Nota del traduttore.: Se stai utilizzando un'installazione autonoma di Kubernetes, ti consigliamo di dare un'occhiata alla nostra soluzione Open Source — loghouse.) Non complicarti la vita e utilizza i meccanismi nativi di logging dei container. Scrivi i log in stdout e stderr: verranno automaticamente acquisiti, salvati e indicizzati.

Se desideri, puoi anche scrivere i log in formato JSON. Questo approccio permette di aggiungere facilmente metadati. E insieme a questi, in Stackdriver Logging sarà disponibile la funzione di ricerca nei log utilizzando questi metadati.

2. Assicurati che i container siano stateless e immutabili

Per garantire il corretto funzionamento dei contenitori nel cluster Kubernetes, devono essere stateless e immutable. Quando queste condizioni sono soddisfatte, Kubernetes può svolgere il proprio lavoro creando e distruggendo le entità dell'applicazione quando e dove necessario.

Stateless significa che qualsiasi stato (dati persistenti di qualsiasi tipo) viene memorizzato al di fuori del contenitore. A questo scopo, a seconda delle esigenze, possono essere impiegati diversi tipi di archiviazione esterna: Cloud Storage, Persistent Disks, Redis, Cloud SQL o altri database gestiti. (Nota del traduttore.: Leggi anche il nostro articolo «Operatori per Kubernetes: come avviare applicazioni stateful».)

Immutable significa che il contenitore non sarà modificato durante la sua vita: nessun aggiornamento, patch o variazione nella configurazione. Se hai bisogno di aggiornare il codice dell'applicazione o applicare una patch, crea una nuova immagine e distribuiscila. È consigliabile esternalizzare la configurazione del contenitore (porta da ascoltare, opzioni dell'ambiente di esecuzione, ecc.) in Secrets e ConfigMaps. Possono essere aggiornati senza la necessità di ricompilare una nuova immagine del contenitore. Per creare pipeline di assemblaggio delle immagini in modo semplice, si può utilizzare Cloud Build. (Nota del traduttore.: Per questi scopi utilizziamo uno strumento Open Source dapp.)

7 migliori pratiche per la gestione dei container secondo Google
Esempio di aggiornamento della configurazione del Deployment in Kubernetes utilizzando ConfigMap, montato nei pod come configurazione

3. Evitare container con privilegi

Non stai eseguendo applicazioni come root sui tuoi server, giusto? Se un attaccante riesce a infiltrarsi nell'applicazione, avrà accesso con privilegi di root. Le stesse considerazioni si applicano anche per evitare di eseguire container privilegiati. Se è necessario modificare le impostazioni sull'host, è possibile fornire al container specifici capacità utilizzando l'opzione securityContext in Kubernetes. Se è necessario modificare i sysctl, Kubernetes ha un'annotazione separata per questo. In generale, cerca di utilizzare il più possibile init- e container sidecar per eseguire tali operazioni privilegiate. Non hanno bisogno di essere accessibili né per il traffico interno né per quello esterno.

Se gestisci un cluster, puoi utilizzare Pod Security Policy per le restrizioni sull'uso dei container privilegiate.

4. Evitare di eseguire come root

Si è già parlato dei contenitori privilegiati, ma sarebbe ancora meglio se, in aggiunta a ciò, non si eseguano applicazioni all'interno del contenitore come root. Se un attaccante trova una vulnerabilità remota nell'applicazione con diritti di root che consente l'esecuzione di codice, e poi riesce a uscire dai confini del contenitore tramite un'altra vulnerabilità ancora sconosciuta, otterrà l'accesso root all'host.

Il modo migliore per evitare ciò è innanzitutto non eseguire nulla come root. A tal fine, si può utilizzare la direttiva UTENTE in Dockerfile o runAsUser in Kubernetes. L'amministratore del cluster può anche configurare un comportamento forzato utilizzando Pod Security Policy.

5. Rendi l'applicazione facile da monitorare

Come la registrazione, il monitoraggio è una parte fondamentale della gestione dell'applicazione. Una soluzione popolare per il monitoraggio nella comunità Kubernetes è Prometheus — un sistema che rileva automaticamente i pod e i servizi che necessitano di monitoraggio. (Nota del traduttore.: Vedi anche il nostro rapporto dettagliato sul monitoraggio con Prometheus e Kubernetes.) Stackdriver è in grado di monitorare i cluster Kubernetes e include una propria versione di Prometheus per il monitoraggio delle applicazioni.

7 migliori pratiche per la gestione dei container secondo Google
Il cruscotto Kubernetes in Stackdriver

Prometheus si aspetta che l'applicazione esponga le metriche su un endpoint HTTP. A tal fine, sono disponibili librerie client di Prometheus. Lo stesso formato è utilizzato da altri strumenti come OpenCensus e Istio.

6. Rendi disponibile lo stato di salute dell'applicazione

La gestione di un'applicazione in produzione è facilitata dalla sua capacità di comunicare il proprio stato all'intero sistema. L'applicazione è in esecuzione? Va bene? È pronta a ricevere traffico? Come si comporta? Il modo più comune per affrontare questo problema è implementare controlli di salute (health checks). Kubernetes ne ha due tipi: probe di liveness e probe di readiness.

Per la liveness probe (controllo di vitalità) l'applicazione deve avere un endpoint HTTP che restituisca la risposta "200 OK" se funziona e se le sue principali dipendenze sono soddisfatte. Per la readiness probe (controllo di prontezza) L'applicazione deve avere un altro endpoint HTTP che restituisca una risposta "200 OK" se l'applicazione è in uno stato sano, i passi di inizializzazione sono stati completati e qualsiasi richiesta valida non provoca un errore. Kubernetes dirigerà il traffico al container solo se l'applicazione è pronta secondo queste verifiche. I due endpoint possono essere uniti se non c'è differenza tra gli stati di vivibilità (liveness) e prontezza (readiness).

Puoi leggere di più a riguardo nell'articolo corrispondente di Sandeep Dinesh, Developer Advocate di Google: "Kubernetes best practices: Impostare controlli di salute con probe di prontezza e vivibilità».

7. Scegli attentamente la versione dell'immagine

La maggior parte delle immagini pubbliche e private utilizza un sistema di tagging simile a quello descritto in Best Practices for Building Containers. Se l'immagine applica un sistema vicino a versionamento semantico, è necessario tenere conto delle specifiche di tagging. Ad esempio, il tag latest può muoversi frequentemente da un'immagine a un'altra — non puoi fare affidamento su di esso se hai bisogno di build e installazioni prevedibili e riproducibili.

Puoi utilizzare il tag X.Y.Z (sono quasi sempre invariati), ma in tal caso monitora tutte le patch e gli aggiornamenti per l'immagine. Se l'immagine che stai usando ha un tag X.Y, è una buona opzione di compromesso. Scegliendola, ricevi automaticamente le patch e allo stesso tempo fai affidamento su una versione stabile dell'applicazione.

P.S. dal traduttore

Leggete anche nel nostro blog:

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster