Libro “Kubernetes per DevOps”

Libro “Kubernetes per DevOps” Ciao, residenti di Khabro! Kubernetes è uno degli elementi chiave del moderno ecosistema cloud. Questa tecnologia fornisce affidabilità, scalabilità e resilienza alla virtualizzazione dei contenitori. John Arundel e Justin Domingus parlano dell'ecosistema Kubernetes e introducono soluzioni comprovate ai problemi quotidiani. Passo dopo passo, costruirai la tua applicazione nativa del cloud e creerai l'infrastruttura per supportarla, configurerai un ambiente di sviluppo e una pipeline di distribuzione continua che ti aiuterà mentre lavori sulle tue prossime applicazioni.

• 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 localhost:9999/ dovresti vedere quanto segue:

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 sito web dell'editore
» Sommario
» Estratto

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

Aggiungi un commento