Deployment

In questa pagina vengono descritti gli oggetti del deployment Kubernetes e il loro utilizzo in Google Kubernetes Engine (GKE).

Che cos'è un deployment?

I deployment rappresentano un set di più pod identici e senza identità univoche. Un deployment esegue più repliche della tua applicazione e sostituisce automaticamente le istanze che non funzionano o non rispondono. In questo modo, i deployment aiutano a garantire che una o più istanze dell'applicazione siano disponibili per soddisfare le richieste degli utenti. I deployment vengono gestiti dal controller Deployment di Kubernetes.

I deployment utilizzano un modello di pod, che contiene una specifica per i pod. La specifica dei pod determina l'aspetto di ogni pod: le applicazioni da eseguire all'interno dei suoi container, i volumi che devono essere montati, le etichette e altro ancora.

Quando un modello di pod di Deployment viene modificato, i nuovi pod vengono creati automaticamente uno alla volta.

Pattern di utilizzo

I deployment sono ideali per applicazioni stateless che utilizzano volumi ReadOnlyMany o ReadWriteMany sono montati su più repliche, ma non adatti per carichi di lavoro che utilizzano volumi ReadWriteOnce. Per le applicazioni stateful che utilizzano i volumi ReadWriteOnce, utilizza gli StatefulSet. Gli StatefulSet sono progettati per eseguire il deployment di applicazioni stateful e applicazioni in cluster che salvano i dati nello spazio di archiviazione permanente, come i dischi permanenti di Compute Engine. Gli StatefulSet sono adatti per il deployment di Kafka, MySQL, Redis, ZooKeeper e di altre applicazioni che richiedono identità univoche e permanenti e nomi host stabili.

Crea i deployment

Puoi creare un deployment utilizzando i comandi kubectl apply o kubectl create.

Una volta creato, il deployment assicura che il numero desiderato di pod sia in esecuzione e disponibile in ogni momento. Il Deployment sostituisce automaticamente i pod che non riescono o vengono rimossi dai nodi.

Ecco un esempio di file manifest di deployment in formato YAML:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

In questo esempio:

  • Viene creato un deployment denominato nginx, indicato dal campo metadata: name.
  • Il Deployment crea tre pod replicati, indicati dal campo replicas.
  • Il modello di pod, o campo spec: template, indica che i suoi pod sono etichettati come app: nginx.
  • La specifica del modello di pod, o il campo template: spec, indica che i pod eseguono un container, nginx, che esegue l'immagine nginx Docker Hub alla versione 1.7.9.
  • Il Deployment apre la porta 80 per l'utilizzo da parte dei pod.

Per ulteriori informazioni sulle specifiche del deployment, consulta la documentazione dell'API Kubernetes.

In breve, il modello di pod contiene le seguenti istruzioni per i pod creati da questo deployment:

  • Ogni pod è etichettato con app: nginx.
  • Crea un contenitore e assegnagli il nome nginx.
  • Esegui l'immagine nginx alla versione 1.7.9.
  • Apri la porta 80 per inviare e ricevere traffico.

Per ulteriori informazioni sulla creazione dei deployment, consulta Creazione di un deployment.

Aggiornamento dei deployment

Puoi aggiornare un deployment apportando modifiche alla specifica del modello di pod di deployment. Apportare modifiche al campo della specifica attiva automaticamente un'implementazione di aggiornamento. In Google Cloud Console puoi utilizzare kubectl, l'API Kubernetes o il menu Carichi di lavoro GKE.

Per impostazione predefinita, quando un deployment attiva un aggiornamento, il deployment interrompe i pod, riduce gradualmente il numero di pod a zero, quindi svuota e termina i pod. Quindi, il deployment utilizza il modello di pod aggiornato per visualizzare nuovi pod.

I pod vecchi vengono rimossi solo quando è in esecuzione un numero sufficiente di nuovi pod e non vengono creati nuovi pod finché non viene rimosso un numero sufficiente di pod precedenti. Per vedere in quale ordine vengono avviati e rimossi i pod, puoi eseguire kubectl describe deployments.

I deployment possono garantire che almeno un numero di repliche in meno rispetto a quello desiderato sia in esecuzione, con massimo un pod non disponibile. Allo stesso modo, i deployment possono garantire che sia in esecuzione al massimo un numero in più rispetto al numero desiderato di repliche, con un massimo di un pod in più rispetto all'esecuzione desiderata.

Puoi eseguire il rollback di un aggiornamento utilizzando il comando kubectl rollout undo. Puoi anche utilizzare kubectl rollout pause per interrompere temporaneamente un deployment.

Gestione dei deployment

Di seguito è riportato un elenco delle attività di gestione comuni per i deployment:

Stato e ciclo di vita

I deployment possono essere in uno dei tre stati del loro ciclo di vita: in corso, completato o non riuscito.

Uno stato in corso indica che il deployment è in fase di esecuzione delle sue attività, come l'aumento o la scalabilità dei pod.

Lo stato Completata indica che il deployment ha completato correttamente le sue attività, tutti i pod sono in esecuzione con la specifica più recente e sono disponibili, mentre nessun pod precedente è ancora in esecuzione.

Lo stato Non riuscita indica che il deployment ha riscontrato uno o più problemi che ne impediscono il completamento. Alcune cause includono quote o autorizzazioni insufficienti, errori di pull delle immagini, intervalli di limite o errori di runtime. Per scoprire le cause della mancata riuscita di un deployment, puoi eseguire kubectl get deployment [DEPLOYMENT+NAME] -o yaml ed esaminare i messaggi nel campo status: conditions.

Puoi monitorare l'avanzamento di un deployment o verificarne lo stato utilizzando il comando kubectl rollout status.

Passaggi successivi