• Inizia con container e Kubernetes dalle basi: non è richiesta alcuna esperienza particolare per apprendere l'argomento. • Esegui i tuoi cluster o scegli un servizio Kubernetes gestito da Amazon, Google, ecc. • Utilizza Kubernetes per gestire il ciclo di vita dei container e il consumo delle risorse. • Ottimizzare i cluster in base a costi, prestazioni, resilienza, potenza e scalabilità. • Scopri gli strumenti migliori per sviluppare, testare e distribuire le tue applicazioni. • Sfruttare le pratiche attuali del settore per garantire sicurezza e controllo. • Implementare i principi DevOps in tutta l'azienda in modo che i team di sviluppo possano agire in modo più flessibile, rapido ed efficiente.
A chi è rivolto il libro?
Il libro è particolarmente rilevante per i dipendenti dei dipartimenti amministrativi responsabili di server, applicazioni e servizi, nonché per gli sviluppatori coinvolti nella creazione di nuovi servizi cloud o nella migrazione di applicazioni esistenti su Kubernetes e sul cloud. Non preoccuparti, non è necessario sapere come lavorare con Kubernetes o i contenitori: ti insegneremo tutto.
Anche gli utenti esperti di Kubernetes troveranno molto valore, con una copertura approfondita di argomenti come RBAC, distribuzione continua, gestione dei dati sensibili e osservabilità. Ci auguriamo che le pagine del libro contengano sicuramente qualcosa di interessante per te, indipendentemente dalle tue capacità ed esperienza.
A quali domande risponde il libro?
Durante la pianificazione e la scrittura del libro, abbiamo discusso della tecnologia cloud e di Kubernetes con centinaia di persone, parlando con leader ed esperti del settore, nonché con principianti assoluti. Di seguito sono elencate le domande selezionate a cui vorrebbero vedere una risposta in questa pubblicazione.
- “Mi interessa sapere perché dovresti dedicare del tempo a questa tecnologia. Quali problemi aiuterà me e il mio team a risolvere?”
- “Kubernetes sembra interessante, ma presenta una barriera all’ingresso piuttosto elevata. Preparare un semplice esempio non è difficile, ma l'ulteriore amministrazione e il debugging sono scoraggianti. Ci piacerebbe ricevere consigli affidabili su come le persone gestiscono i cluster Kubernetes nel mondo reale e quali problemi potremmo incontrare."
- “Un consiglio soggettivo sarebbe utile. L'ecosistema Kubernetes offre ai nuovi team troppe opzioni tra cui scegliere. Quando ci sono diversi modi per fare la stessa cosa, come fai a sapere qual è il migliore? Come fare una scelta?
E forse la più importante di tutte le domande:
- "Come posso utilizzare Kubernetes senza interrompere la mia azienda?"
Estratto. Configurazione e oggetti segreti
Molto utile è la possibilità di separare la logica di un'applicazione Kubernetes dalla sua configurazione (cioè da eventuali valori o impostazioni che possono cambiare nel tempo). I valori di configurazione includono in genere impostazioni specifiche dell'ambiente, indirizzi DNS di servizi di terze parti e credenziali di autenticazione.
Naturalmente tutto ciò può essere inserito direttamente nel codice, ma questo approccio non è sufficientemente flessibile. Ad esempio, la modifica di un valore di configurazione richiederebbe quindi di creare e distribuire nuovamente il codice. Una soluzione molto migliore sarebbe separare la configurazione dal codice e leggerla da un file o da variabili di ambiente.
Kubernetes offre diversi modi per gestire la configurazione. Innanzitutto, puoi passare valori all'applicazione tramite variabili di ambiente specificate nella specifica del wrapper del pod (vedi “Variabili di ambiente” a pagina 192). In secondo luogo, i dati di configurazione possono essere archiviati direttamente in Kubernetes utilizzando gli oggetti ConfigMap e Secret.
In questo capitolo esploreremo questi oggetti in dettaglio e vedremo alcuni approcci pratici alla gestione della configurazione e dei dati sensibili utilizzando un'applicazione demo.
Aggiornamento delle shell dei pod quando la configurazione cambia
Immagina di avere una distribuzione nel tuo cluster e di voler modificare alcuni valori nella sua ConfigMap. Se utilizzi il grafico Helm (vedi “Helm: Package Manager per Kubernetes” a pagina 102), puoi rilevare automaticamente una modifica alla configurazione e ricaricare le shell dei pod con un semplice trucco. Aggiungi la seguente annotazione alla specifica di distribuzione:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
| sha256sum }}
Il modello di distribuzione ora contiene un checksum dei parametri di configurazione: se i parametri vengono modificati, la somma verrà aggiornata. Se esegui l'aggiornamento helm, Helm rileverà che le specifiche di distribuzione sono cambiate e riavvierà tutte le shell dei pod.
Dati sensibili in Kubernetes
Sappiamo già che l'oggetto ConfigMap fornisce un meccanismo flessibile per archiviare e accedere ai dati di configurazione in un cluster. Tuttavia, la maggior parte delle applicazioni contiene informazioni riservate e riservate, come password o chiavi API. Può anche essere memorizzato in ConfigMap, ma questa soluzione non è l'ideale.
Kubernetes offre invece un tipo speciale di oggetto progettato per archiviare dati sensibili: Secret. Successivamente, diamo un'occhiata a un esempio di come questo oggetto può essere utilizzato nella nostra applicazione demo.
Per iniziare, dai un'occhiata al manifest Kubernetes per l'oggetto Secret (vedi hello-secret-env/k8s/secret.yaml):
apiVersion: v1
kind: Secret
metadata:
name: demo-secret
stringData:
magicWord: xyzzy
In questo esempio, la chiave privata di magicWord è xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). La parola xyzzy è generalmente molto utile nel mondo dei computer. Similmente a ConfigMap, puoi memorizzare più chiavi e valori in un oggetto Secret. Qui, per semplicità, utilizziamo solo una coppia chiave-valore.
Utilizzo di oggetti segreti come variabili di ambiente
Come ConfigMap, l'oggetto Secret può essere reso disponibile nel contenitore come variabili di ambiente o come file sul suo disco. Nell'esempio seguente, assegneremo una variabile di ambiente al valore di Secret:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-env
ports:
- containerPort: 8888
env:
- name: GREETING
valueFrom:
secretKeyRef:
name: demo-secret
key: magicWord
Esegui il comando seguente nel repository demo per applicare i manifest:
kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created
Come prima, inoltra la porta locale alla distribuzione per vedere il risultato nel tuo browser:
kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888
Quando si apre un indirizzo
The magic word is "xyzzy"
Scrittura di oggetti segreti su file
In questo esempio, allegheremo l'oggetto Secret al contenitore come file. Il codice si trova nella cartella hello-secret-file del repository demo.
Per connettere Secret come file, utilizzeremo la seguente distribuzione:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-file
ports:
- containerPort: 8888
volumeMounts:
- name: demo-secret-volume
mountPath: "/secrets/"
readOnly: true
volumes:
- name: demo-secret-volume
secret:
secretName: demo-secret
Come nella sottosezione “Creazione di file di configurazione da oggetti ConfigMap” a pag. 240, creiamo un volume (in questo caso demo-secret-volume) e lo montiamo sul contenitore nella sezione volumeMounts delle specifiche. Il campo mountPath è /secrets, quindi Kubernetes creerà un file in questa cartella per ogni coppia chiave/valore definita nell'oggetto Secret.
Nel nostro esempio, abbiamo definito solo una coppia chiave-valore chiamata magicWord, quindi il manifest creerà un singolo file di sola lettura /secrets/magicWord con dati sensibili nel contenitore.
Se applichi questo manifest nello stesso modo dell'esempio precedente, dovresti ottenere lo stesso risultato:
The magic word is "xyzzy"
Lettura di oggetti segreti
Nella sezione precedente abbiamo utilizzato il comando kubectl description per visualizzare il contenuto di una ConfigMap. Si può fare lo stesso con Secret?
kubectl describe secret/demo-secret
Name: demo-secret
Namespace: default
Labels: <none>
Annotations:
Type: Opaque
Data
====
magicWord: 5 bytes
Tieni presente che i dati stessi non vengono visualizzati. Gli oggetti segreti in Kubernetes sono di tipo Opaque, il che significa che i loro contenuti non vengono mostrati nell'output di kubectl, nelle voci di registro o nel terminale, rendendo impossibile la rivelazione accidentale di informazioni sensibili.
Per visualizzare una versione YAML codificata dei dati sensibili, utilizza il comando kubectl get:
kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque
base64
Cos'è eHl6enk=, completamente diverso dal nostro valore originale? Questo è in realtà un oggetto segreto, rappresentato nella codifica base64. Base64 è uno schema per codificare dati binari arbitrari come una stringa di caratteri.
Poiché le informazioni sensibili possono essere binarie e non emesse (come nel caso di una chiave di crittografia TLS), gli oggetti segreti vengono sempre archiviati in formato base64.
Il testo beHl6enk= è la versione codificata base64 della nostra parola segreta xyzzy. Puoi verificarlo eseguendo il comando base64 —decode nel terminale:
echo "eHl6enk=" | base64 --decode
xyzzy
Pertanto, mentre Kubernetes ti protegge dall'invio accidentale di dati sensibili nel terminale o nei file di registro, se disponi di autorizzazioni di lettura sugli oggetti segreti in uno spazio dei nomi specifico, tali dati possono essere base64 e successivamente decodificati.
Se hai bisogno di codificare in base64 del testo (ad esempio, per inserirlo in un Segreto), utilizza il comando base64 senza argomenti:
echo xyzzy | base64
eHl6enkK
Accesso agli oggetti segreti
Chi può leggere e modificare gli oggetti segreti? Ciò è determinato da RBAC, un meccanismo di controllo degli accessi (ne parleremo in dettaglio nella sottosezione “Introduzione al controllo degli accessi basato sui ruoli” a pagina 258). Se stai eseguendo un cluster che non dispone di RBAC o non è abilitato, tutti i tuoi oggetti segreti sono disponibili per qualsiasi utente e contenitore (spiegheremo in seguito che non dovresti avere alcun cluster di produzione senza RBAC).
Crittografia passiva dei dati
Che dire di coloro che hanno accesso al database etcd in cui Kubernetes memorizza tutte le sue informazioni? Possono leggere dati sensibili senza avere l'autorizzazione per leggere oggetti segreti tramite l'API?
Dalla versione 1.7, Kubernetes supporta la crittografia passiva dei dati. Ciò significa che le informazioni sensibili all'interno di etcd vengono archiviate crittografate su disco e non possono essere lette nemmeno da chi ha accesso diretto al database. Per decrittografarlo, è necessaria una chiave di cui dispone solo il server API Kubernetes. In un cluster configurato correttamente, la crittografia passiva deve essere abilitata.
Puoi verificare se la crittografia passiva funziona nel tuo cluster in questo modo:
kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
--experimental-encryption-provider-config=...
Se non vedi il flag sperimentale-encryption-provider-config, la crittografia passiva non è abilitata. Quando utilizzi Google Kubernetes Engine o altri servizi di gestione Kubernetes, i tuoi dati vengono crittografati utilizzando un meccanismo diverso, quindi il flag non sarà presente. Rivolgiti al tuo fornitore Kubernetes per verificare se il contenuto etcd è crittografato.
Memorizzazione di dati riservati
Esistono alcune risorse Kubernetes che non dovrebbero mai essere rimosse dal cluster, come gli oggetti Secret altamente sensibili. Puoi proteggere una risorsa dall'eliminazione utilizzando un'annotazione fornita dal gestore Helm:
kind: Secret
metadata:
annotations:
"helm.sh/resource-policy": keep
Strategie di gestione degli oggetti segreti
Nell'esempio della sezione precedente, i dati sensibili sono stati protetti da accessi non autorizzati immediatamente dopo essere stati archiviati nel cluster. Ma nei file manifest venivano archiviati come testo semplice.
Non dovresti mai inserire informazioni riservate in file che sono sotto controllo di versione. Come puoi gestire e archiviare in modo sicuro queste informazioni prima di applicarle al tuo cluster Kubernetes?
Puoi scegliere qualsiasi strumento o strategia per gestire i dati sensibili nelle tue applicazioni, ma dovrai comunque rispondere almeno alle seguenti domande.
- Dove dovrebbero essere archiviati i dati sensibili in modo che siano altamente accessibili?
- Come rendere i dati sensibili accessibili alle tue applicazioni attive?
- Cosa dovrebbe succedere alle tue applicazioni quando sostituisci o modifichi dati sensibili?
A proposito di autori
Giovanni Arundel è un consulente con 30 anni di esperienza nel settore informatico. Ha scritto diversi libri e lavora con molte aziende di diversi paesi, consigliandole su infrastrutture cloud-native e Kubernetes. Nel tempo libero gli piace il surf, è un buon tiratore di pistola e suona il pianoforte da dilettante. Vive in un cottage da favola in Cornovaglia, in Inghilterra.
Giustino Domingus — ingegnere amministrativo di sistema che lavora in un ambiente DevOps con Kubernetes e tecnologie cloud. Gli piace passare il tempo all'aria aperta, bere caffè, chiacchierare e sedersi al computer. Vive a Seattle, Washington, con un gatto meraviglioso e una moglie e migliore amica ancora più meravigliosa, Adrienne.
» Per ulteriori informazioni sul libro, visitare il sito
»
»
Per Khabrozhiteli sconto del 25% sul coupon - kubernetes
Dopo il pagamento della versione cartacea del libro, viene inviato un e-book all'indirizzo di posta elettronica.
Fonte: habr.com