Esecuzione di aggiornamenti in sequenza

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa pagina spiega come eseguire aggiornamenti in sequenza per le applicazioni in Google Kubernetes Engine (GKE).

Panoramica

Puoi eseguire un aggiornamento in sequenza per aggiornare le immagini, la configurazione, le etichette, le annotazioni e i limiti/richieste di risorse dei carichi di lavoro nei cluster. Gli aggiornamenti in sequenza sostituiscono in modo incrementale i pod delle tue risorse con nuovi pod, che vengono quindi pianificati sui nodi con risorse disponibili. Gli aggiornamenti in sequenza sono progettati per aggiornare i carichi di lavoro senza tempi di inattività.

I seguenti oggetti rappresentano i carichi di lavoro Kubernetes. Puoi attivare un aggiornamento in sequenza su questi carichi di lavoro aggiornando il relativo modello di pod:

  • DaemonSet
  • Deployment
  • StatefulSet

Ciascuno di questi oggetti ha un modello di pod, rappresentato dal campo spec: template nel file manifest dell'oggetto. Il campo modello di pod contiene una specifica per i pod che il controller crea per realizzare lo stato o il comportamento desiderato. Puoi attivare un'implementazione di aggiornamento aggiornando l'oggetto's spec: template.

Il modello di pod include i seguenti campi:

Per scoprire di più sul modello di pod, consulta la documentazione di PodTemplateSpec.

La scalabilità di una risorsa o l'aggiornamento dei campi al di fuori del modello del pod non attiva un'implementazione.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e poi inizializza l'interfaccia a riga di comando gcloud.

Aggiornamento di un'applicazione

La seguente sezione spiega come aggiornare un'applicazione utilizzando Google Cloud Console o kubectl.

kubectl impostato

Puoi utilizzare kubectl set per apportare modifiche ai campi image, resources di Compute di un oggetto (ad esempio, CPU e memoria) o ai campi selector.

Ad esempio, per aggiornare un deployment dalla versione 1.7.9 alla 1.9.1 di nginx, esegui il comando seguente:

kubectl set image deployment nginx nginx=nginx:1.9.1

Il comando kubectl set image aggiorna l'immagine nginx dei pod del deployment uno alla volta.

Per fare un altro esempio, per impostare le richieste di risorse e i limiti del deployment:

kubectl set resources deployment nginx --limits cpu=200m,memory=512Mi --requests cpu=100m,memory=256Mi

Oppure, per rimuovere le richieste di risorse del deployment:

kubectl set resources deployment nginx --limits cpu=0,memory=0 --requests cpu=0,memory=0

kubectl apply

Puoi utilizzare kubectl apply per aggiornare una risorsa applicando una configurazione nuova o aggiornata.

Per applicare una configurazione nuova o aggiornata a una risorsa, esegui il comando seguente:

kubectl apply -f MANIFEST

Sostituisci MANIFEST con il nome del file manifest. Se il file non esiste, questo comando crea la risorsa e applica la configurazione; in caso contrario, viene applicata la configurazione aggiornata.

console

Per modificare la configurazione in tempo reale di un'applicazione, procedi come segue:

  1. Vai alla pagina Carichi di lavoro di Google Cloud Console.

    Vai a Carichi di lavoro

  2. Seleziona il carico di lavoro desiderato.

  3. Fai clic su Modifica.

  4. Utilizza l'editor per apportare le modifiche desiderate alle etichette dell'oggetto o al modello del pod.

  5. Fai clic su Salva.

Gestione di un'implementazione aggiornata

Puoi utilizzare kubectl rollout per esaminare un'implementazione nel momento in cui si verifica, per mettere in pausa e riprendere un'implementazione, eseguire il rollback di un aggiornamento e visualizzare la cronologia di implementazione di un oggetto.

Ispezione di un'implementazione con kubectl rollout status

Puoi controllare lo stato di un'implementazione utilizzando il comando kubectl rollout status.

Ad esempio, puoi esaminare l'implementazione di nginx Deployment eseguendo il comando seguente:

kubectl rollout status deployment nginx

L'output è simile al seguente:

Waiting for rollout to finish: 2 out of 3 newreplicas have been updated...
deployment "nginx" successfully rolled out

Una volta completata l'implementazione, esegui kubectl get deployment nginx per verificare che tutti i pod siano in esecuzione. L'output è simile al seguente:

NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx              3         3         3            3           36s

Mettere in pausa e riprendere un'implementazione

Puoi utilizzare kubectl rollout pause per mettere in pausa un'implementazione.

Ad esempio, per mettere in pausa l'implementazione di nginx Deployment, esegui il comando seguente:

kubectl rollout pause deployment nginx

Per riprendere, esegui il comando seguente:

kubectl rollout resume deployment nginx

Visualizzazione della cronologia dell'implementazione con kubectl rollout history

Puoi utilizzare kubectl rollout history per visualizzare la cronologia di implementazione di un oggetto.

Ad esempio, per visualizzare la cronologia di implementazione di nginx Deployment, esegui il comando seguente:

kubectl rollout history deployment nginx

Per visualizzare la cronologia della terza revisione, esegui il comando seguente:

kubectl rollout history deployment nginx --revision 3

Esegui il rollback di un aggiornamento con kubectl rollout undo

Puoi eseguire il rollback dell'implementazione di un oggetto utilizzando il comando kubectl rollout undo.

Ad esempio, per eseguire il rollback alla versione precedente del deployment nginx, esegui questo comando:

kubectl rollout undo deployments nginx

Oppure, come ulteriore esempio, per eseguire il rollback alla terza revisione del deployment, esegui questo comando:

kubectl rollout undo deployment nginx --to-revision 3

Considerazioni per gli oggetti StatefulSet e DaemonSet

Gli StatefulSet da Kubernetes 1.7 e DaemonSet da quando Kubernetes 1.6 utilizza una strategia di aggiornamento per configurare e disattivare gli aggiornamenti automatici in sequenza per container, etichette, richieste/limiti delle risorse e annotazioni per i relativi pod. La strategia di aggiornamento viene configurata utilizzando il campo spec.updateStrategy.

Il campo spec.updateStrategy.type accetta OnDelete o RollingUpdate come valori.

OnDelete è il comportamento predefinito quando spec.updateStrategy.type non è specificato. OnDelete impedisce al controller di aggiornare automaticamente i propri pod. Devi eliminare manualmente i pod per far sì che il controller crei nuovi pod che riflettano le modifiche. OnDelete è utile se preferisci aggiornare manualmente i pod.

RollingUpdate implementa aggiornamenti automatici in sequenza per i pod nello StatefulSet. RollingUpdate fa sì che il controller elimini e ricrei ognuno dei suoi pod e ogni pod uno alla volta. Attendi che un pod aggiornato sia in esecuzione e pronto prima di aggiornare il predecessore.

Il controller StatefulSet aggiorna tutti i pod in ordine ordinale inverso, rispettando le garanzie dello StatefulSet.

Utilizzare la strategia RollingUpdate

Puoi utilizzare la strategia RollingUpdate per aggiornare automaticamente tutti i pod in uno StatefulSet o DaemonSet.

Ad esempio, per applicare una patch allo StatefulSet web per applicare la strategia RollingUpdate, esegui questo comando:

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'

Successivamente, apporta una modifica alle spec.template dello StatefulSet. Ad esempio, puoi utilizzare kubectl set per modificare l'immagine container. Nell'esempio seguente, lo StatefulSet di web è impostato in modo che il container nginx esegua l'immagine nginx-slim:0.7:

kubectl set image statefulset web nginx=nginx-slim:0.7

Per verificare che i pod nello StatefulSet che eseguono il container nginx siano in fase di aggiornamento, esegui il comando seguente:

kubectl get pods -l app=nginx -w

L'output è simile al seguente:

NAME      READY     STATUS              RESTARTS  AGE
web-0     1/1       Running             0         7m
web-1     1/1       Running             0         7m
web-2     1/1       Running             0         8m
web-2     1/1       Terminating         0         8m
web-2     1/1       Terminating         0         8m
web-2     0/1       Terminating         0         8m
web-2     0/1       Terminating         0         8m
web-2     0/1       Terminating         0         8m
web-2     0/1       Terminating         0         8m
web-2     0/1       Pending             0         0s
web-2     0/1       Pending             0         0s
web-2     0/1       ContainerCreating   0         0s
web-2     1/1       Running             0         19s
web-1     1/1       Terminating         0         8m
web-1     0/1       Terminating         0         8m
web-1     0/1       Terminating         0         8m
web-1     0/1       Terminating         0         8m
web-1     0/1       Pending             0         0s
web-1     0/1       Pending             0         0s
web-1     0/1       ContainerCreating   0         0s
web-1     1/1       Running             0         6s
web-0     1/1       Terminating         0         7m
web-0     1/1       Terminating         0         7m
web-0     0/1       Terminating         0         7m
web-0     0/1       Terminating         0         7m
web-0     0/1       Terminating         0         7m
web-0     0/1       Terminating         0         7m
web-0     0/1       Pending             0         0s
web-0     0/1       Pending             0         0s
web-0     0/1       ContainerCreating   0         0s
web-0     1/1       Running             0         10s

I pod nello StatefulSet vengono aggiornati in ordine ordinale inverso. Il controller StatefulSet termina ciascun pod e attende che ne venga eseguita la transizione a Running e Ready prima di aggiornare il pod successivo.

Partizionamento di un RollingUpdate

Puoi specificare un parametro partition in un campo RollingUpdate di StatefulSet.

Se specifichi un partition, vengono aggiornati tutti i pod con un numero ordinale maggiore o uguale al valore di partition. Tutti i pod con un numero ordinale inferiore al valore partition non vengono aggiornati e, anche se vengono eliminati, vengono ricreati alla versione precedente.

Se il valore partition è superiore al numero di replicas, non vengono propagati gli aggiornamenti ai suoi pod. Il partizionamento è utile se vuoi organizzare gradualmente un aggiornamento, implementare una versione canary o eseguire un'implementazione graduale.

Ad esempio, per partizionare lo StatefulSet web, esegui il comando seguente:

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'

Di conseguenza, i pod con un numero ordinale maggiore o uguale a 3 vengono aggiornati.

Parametro maxUnavailable di DaemonSet

Il parametro facoltativo maxUnavailable di DaemonSet è un elemento secondario del suo campo rollingUpdate.

maxUnavailable determina il numero massimo di pod DaemonSet che possono essere non disponibili durante gli aggiornamenti. Il valore predefinito, se omesso, è 1. Il valore non può essere 0. Il valore può essere un numero assoluto o una percentuale.

Aggiornamento con la strategia OnDelete

Se preferisci aggiornare uno StatefulSet o un DaemonSet manualmente, puoi omettere il campo spec.updateStrategy, che indica al controller di utilizzare la strategia OnDelete.

Per aggiornare un controller che utilizza la strategia OnDelete, devi eliminare manualmente i relativi pod dopo aver apportato modifiche al modello del pod.

Ad esempio, puoi impostare lo StatefulSet web per utilizzare l'immagine nginx-slim:0.7:

kubectl set image statefulset web nginx=nginx-slim:0.7

Quindi, per eliminare il primo pod web, esegui il comando seguente:

kubectl delete pod web-0

Per osservare come il pod viene ricreato dallo StatefulSet e passa a in esecuzione e pronto, esegui il comando seguente:

kubectl get pod web-0 -w

L'output di questo comando è simile al seguente:

NAME      READY     STATUS               RESTARTS  AGE
web-0     1/1       Running              0         54s
web-0     1/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Pending              0         0s
web-0     0/1       Pending              0         0s
web-0     0/1       ContainerCreating    0         0s
web-0     1/1       Running              0         3s

Aggiornamento di un job

Quando aggiorni la configurazione di un job, il nuovo job e i relativi pod vengono eseguiti con la nuova configurazione. Dopo aver aggiornato un job, devi eliminare manualmente il job precedente e i relativi pod, se lo desideri.

Per eliminare un job e tutti i suoi pod, esegui questo comando:

kubectl delete job my-job

Per eliminare un job ma mantenerne i pod in esecuzione, specifica il flag --cascade=false:

kubectl delete job my-job --cascade=false

Puoi anche eseguire kubectl describe deployment nginx, che restituisce ulteriori informazioni sul deployment.

Passaggi successivi