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 «». 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?

(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à. 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 , e fare attenzione al nostro 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 . (Nota del traduttore.: Se stai utilizzando un'installazione autonoma di Kubernetes, ti consigliamo di dare un'occhiata alla nostra soluzione Open Source — .) 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 . 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: , , , o altri database gestiti. (Nota del traduttore.: Leggi anche il nostro articolo «».)
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 e . 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 . (Nota del traduttore.: Per questi scopi utilizziamo uno strumento Open Source .)

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 in Kubernetes. Se è necessario modificare i sysctl, Kubernetes ha per questo. In generale, cerca di utilizzare il più possibile 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 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 .
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 è — un sistema che rileva automaticamente i pod e i servizi che necessitano di monitoraggio. (Nota del traduttore.: Vedi anche il nostro sul monitoraggio con Prometheus e Kubernetes.) è in grado di monitorare i cluster Kubernetes e include una propria versione di Prometheus per il monitoraggio delle applicazioni.

Il cruscotto Kubernetes in Stackdriver
Prometheus si aspetta che l'applicazione esponga le metriche su un endpoint HTTP. A tal fine, sono disponibili . Lo stesso formato è utilizzato da altri strumenti come e .
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: .
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: "».
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 . Se l'immagine applica un sistema vicino a , è 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:
- «»;
- «»;
- «»;
- «» (panoramica e video della presentazione);
- «» (panoramica e video della presentazione);
- «» (panoramica e video della presentazione);
- «» (panoramica e video della presentazione);
- «».
Fonte: habr.com
