Come distribuire applicazioni in Kubernetes
Pubblicato: 2022-11-09Kubernetes è una delle piattaforme di automazione più popolari per la distribuzione, il ridimensionamento e il funzionamento di contenitori di applicazioni su un cluster di host o nodi.
Questo articolo discuterà uno degli oggetti centrali in Kubernetes: la distribuzione. L'obiettivo è capire il suo comportamento e come crearlo, aggiornarlo ed eliminarlo.
Che cos'è una distribuzione?
Una distribuzione è uno degli oggetti utilizzati per avviare i Pod. Le best practice di Kubernetes incoraggiano l'uso di implementazioni per applicazioni stateless. Senza una distribuzione, dovresti creare, aggiornare ed eliminare manualmente più pod, il che sarebbe noioso e irrealizzabile per molti pod.
Una distribuzione dichiara un singolo oggetto in YAML che non solo crea i Pod, ma garantisce anche che siano aggiornati e in esecuzione. Puoi anche ridimensionare automaticamente le tue applicazioni utilizzando una distribuzione su Kubernetes. Pertanto, una distribuzione viene utilizzata per ridimensionare, distribuire e ripristinare le versioni delle applicazioni nei pod.
Una distribuzione dice anche a Kubernetes quante copie di un Pod vogliamo eseguire e Kubernetes si occupa del resto. Il controller associato creerà un ReplicaSet dalla configurazione durante la creazione di una distribuzione. Il controller associato al ReplicaSet creerà una serie di Pod dalla configurazione ReplicaSet.
I vantaggi dell'utilizzo di una distribuzione invece di creare direttamente un ReplicaSet sono:
- Storicizzazione dell'oggetto: ogni modifica dell'oggetto (tramite un "applica" o un "modifica") creerà un backup della versione precedente.
- Gestione rollout e rollback: è possibile tornare su una configurazione in connessione con il punto precedente.
Creazione di una distribuzione
Esistono due metodi che possiamo utilizzare per creare una distribuzione Kubernetes:
Metodo imperativo
Le API Kubernetes consentono un approccio più diretto e imperativo senza richiedere file di configurazione o manifest in formato YAML. In questo approccio, tutto ciò che dobbiamo fare è dire ciò che vogliamo che sia fatto e Kubernetes si assumerà la responsabilità di definire ciò che deve essere fatto per ottenere il risultato atteso.
Per usare il metodo imperativo, basta usare il comando seguente:
kubectl create deployment nginx-deployment --image nginx --port=80
Metodo dichiarativo
In questo metodo, devi dichiarare tutto e quando usi questo codice, Kubernetes legge semplicemente le tue definizioni e crea esattamente come presentato o dichiarato.
Per utilizzare la distribuzione dichiarativa dovrai creare un file YAML.
File YAML per la distribuzione con il nome new_deployment.yaml
:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: #Specifies the number of Pod Copies replicas: 3 #Selects the Pod to be managed by the deployment selector: #Matches the defined labels matchLabels: deploy: example template: metadata: #Specifies the labels on the Pod. labels: deploy: example spec: containers: - name: nginx image: nginx:1.20.2
In questo file YAML, dopo aver definito la versione dell'API Kubernetes, il tipo di oggetto che stai creando e il nome della distribuzione, c'è la sezione delle specifiche. In questa sezione, definisci prima la chiave delle repliche, che indica il numero di istanze Pod che la distribuzione deve mantenere attive.
Utilizzare un'etichetta di selezione per identificare i pod nella distribuzione. A tale scopo, puoi utilizzare l'etichetta di distribuzione, che indica che tutti i pod che corrispondono a queste etichette sono raggruppati nella distribuzione.
Successivamente, hai l'oggetto modello in cui hai un modello Pod all'interno della specifica di distribuzione. Quando la distribuzione crea pod, li crea utilizzando questo modello. La specifica di un pod normale può essere trovata sotto la chiave del modello.
Con questa distribuzione, le immagini Nginx con etichette verranno distribuite nei pod. Inoltre, devi anche stare attento su questo punto, e il Pod è l'unità di scalabilità in Kubernetes, quindi devi pensare al modello che vuoi usare se metti più contenitori nello stesso Pod.
Quindi, applica il file new_deployment.yaml
new_deployment.yaml, usa il comando seguente:
kubectl apply -f new_deployment.yaml
Dopo alcuni secondi, puoi ottenere lo stato della distribuzione utilizzando quanto segue:
kubectl get all

Recupera e aggiorna la distribuzione
Nota che hai creato i Pod, la distribuzione e anche un Replicaset. Quindi una distribuzione crea e gestisce sempre un Replicaset. Ora puoi usare il comando seguente per descrivere la distribuzione:

kubectl describe deployment nginx-deployment

Ora hai una descrizione completa della distribuzione. Evidenzia la strategia utilizzata per creare/ricostruire i pod quando un aggiornamento è stato definito come RollingUpdate.
La strategia RollingUpdate consente una migrazione ordinata di una versione di un'applicazione a una versione più recente. È la strategia predefinita utilizzata in Kubernetes.
Oltre a questo, abbiamo anche le seguenti strategie:
- Ricrea: termina le istanze Pod attualmente in esecuzione e le "ricrea" con la nuova versione;
- Blu/Verde: questa strategia crea due ambienti separati ma identici. Nell'ambiente blu, l'applicazione è in esecuzione così com'è, mentre nell'ambiente verde l'applicazione è in esecuzione come sarà in futuro;
- Canary: una strategia di distribuzione in cui un sottoinsieme di utenti è coinvolto nel rilascio incrementale di un'applicazione o di un servizio.
Se si opta per "aggiornamento in sequenza", è possibile configurarne il comportamento in base al numero di repliche desiderate.
-
maxSurge
permette di indicare (in percentuale o in termini assoluti) quanti Pod può creare oltre al numero di repliche attualmente configurate. -
maxUnavailable
permette di indicare (in percentuale o in termini assoluti) quanti Pod possono essere “non disponibili” durante l'aggiornamento, a seconda del numero di repliche configurate.
A seconda della tua applicazione e del tuo scalabilità automatica, queste configurazioni ti consentiranno di garantire QoS o velocizzare le tue distribuzioni.
Successivamente, devi ridimensionare i Pod su 10 e modificare il tag dell'immagine Nginx all'ultimo.
kubectl scale deployment nginx-deployment --replicas=10

Tieni presente che abbiamo 5 contenitori in fase di creazione e su 10 pod ne abbiamo 5 disponibili.
Dopo alcuni secondi, utilizzare il seguente comando:
kubectl get all
Qui puoi vedere che tutti i Pod sono stati creati e i contenitori sono in esecuzione.

Eliminazione della distribuzione
Per eliminare una distribuzione Kubernetes, puoi utilizzare i seguenti comandi:
kubectl delete deploy nginx-deployment kubectl delete deploy new_deployment.yaml
Timone: semplifica le implementazioni
Quando si desidera distribuire un'applicazione complessa che utilizza decine o addirittura centinaia di risorse Kubernetes, lo strumento kubectl diventa inadatto, motivo per cui è stato sviluppato lo strumento Helm. Helm è un gestore di pacchetti per Kubernetes che si basa su kubectl e semplifica le distribuzioni delle applicazioni.
Nel vocabolario di Helm, un'applicazione è chiamata release. È associato a un grafico, cioè una raccolta di file di configurazione in formato YAML contenente variabili globali e modelli che descrivono le risorse Kubernetes.
Conclusione
La distribuzione è un oggetto Kubernetes essenziale. Poiché un grande potere implica una grande responsabilità, bisogna stare attenti quando lo si configura o rischiare di avere comportamenti imprevisti. Per andare oltre con le configurazioni di distribuzione, puoi fare riferimento alla documentazione di Kubernetes.
Puoi anche esplorare alcuni dei migliori tutorial di Kubernetes per imparare da zero e diventare un esperto.