Esecuzione di aggiornamenti in sequenza

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 risorse con nuovi, che vengono quindi pianificati sui nodi con le 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 del pod:

  • DaemonSet
  • Deployment
  • StatefulSet

Ciascuno di questi oggetti ha un modello di pod, rappresentato dal campo spec: template nel manifest dell'oggetto. Il campo Modello pod contiene una specifica per i pod creati dal controller per realizzare lo stato o il comportamento desiderato. Puoi attivare un implementazione di aggiornamento aggiornando l'oggetto & 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 all'esterno del modello del pod non attiva un'implementazione.

Prima di iniziare

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

  • Assicurati di aver abilitato l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Assicurati di aver installato l'interfaccia a riga di comando di Google Cloud.
  • Configura le impostazioni dell'interfaccia a riga di comando di Google Cloud predefinite per il tuo progetto utilizzando uno dei seguenti metodi:
    • Utilizza gcloud init se vuoi avere istruzioni dettagliate sull'impostazione delle impostazioni predefinite del progetto.
    • Utilizza gcloud config per impostare singolarmente l'ID, la zona e l'area geografica del progetto.

    gcloud init

    1. Esegui gcloud init e segui le istruzioni:

      gcloud init

      Se utilizzi SSH su un server remoto, usa il flag --console-only per impedire l'avvio del comando da parte di un browser:

      gcloud init --console-only
    2. Segui le istruzioni per autorizzare l'interfaccia a riga di comando gcloud a utilizzare il tuo account Google Cloud.
    3. Crea una nuova configurazione o selezionane una esistente.
    4. Scegli un progetto Google Cloud.
    5. Scegli una zona Compute Engine predefinita.
    6. Scegli un'area geografica di Compute Engine predefinita.

    gcloud config

    1. Imposta l'ID progetto predefinito:
      gcloud config set project PROJECT_ID
    2. Imposta l'area geografica di Compute Engine predefinita (ad esempio us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Imposta la zona Compute Engine predefinita (ad esempio us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Aggiorna gcloud alla versione più recente:
      gcloud components update

    Impostando le posizioni predefinite puoi evitare errori nell'interfaccia a riga di comando gcloud come One of [--zone, --region] must be supplied: Please specify location:

Aggiornamento di un'applicazione

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

kubectl set

Puoi utilizzare kubectl set per apportare modifiche ai campi image, resources (risorse di calcolo come CPU e memoria) o selector di un oggetto.

Ad esempio, per aggiornare un deployment dalla nginxversione 1.7.9 alla 1.9.1, 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 di un deployment alla volta.

Come ulteriore 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 attiva di un'applicazione:

  1. Vai alla pagina Carichi di lavoro in 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 di pod.

  5. Fai clic su Salva.

Gestire un'implementazione di aggiornamento

Puoi utilizzare kubectl rollout per esaminare l'implementazione nel momento in cui si verifica, per mettere in pausa e riprendere un'implementazione, per eseguire il rollback di un aggiornamento e per 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 controllare 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 di 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 questo comando:

kubectl rollout history deployment nginx --revision 3

Esegui il rollback di un aggiornamento con kubectl rollout undo

Puoi eseguire il rollback di un'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

In alternativa, per eseguire il rollback alla terza revisione del deployment, esegui il comando seguente:

kubectl rollout undo deployment nginx --to-revision 3

Considerazioni per StatefulSet e DaemonSet

Gli StatefulSet a partire da Kubernetes 1.7 e DaemonSet dal momento che Kubernetes 1.6 utilizza una strategia di aggiornamento per configurare e disabilitare 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 suoi pod. Devi eliminare manualmente i pod per far sì che il controller crei nuovi pod che riflettano le modifiche apportate. OnDelete è utile se preferisci aggiornare i pod manualmente.

RollingUpdate implementa aggiornamenti automatici in sequenza per i pod nello StatefulSet. RollingUpdate fa sì che il controller elimini e ricrei ciascun 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 StatefulSet.

Utilizzo della strategia RollingUpdate

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

Ad esempio, per applicare patch allo StatefulSet web per applicare la strategia RollingUpdate, esegui il comando seguente:

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

Poi, modifica lo spec.template di StatefulSet. Ad esempio, puoi utilizzare kubectl set per modificare l'immagine container. Nel seguente esempio, lo StatefulSet web è impostato per fare in modo che il suo contenitore 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 aggiornati, 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 ogni pod e attende che inizi la transizione a In esecuzione e Pronto prima di aggiornare il pod successivo.

Partizionamento di un elemento RollingUpdate

Puoi specificare un parametro partition in un campo RollingUpdate StatefulSet's.

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

Se un valore partition è maggiore del suo numero replicas, gli aggiornamenti non vengono propagati ai suoi pod. Il partizionamento è utile se vuoi preparare un aggiornamento, implementare una versione canary o eseguire un'implementazione graduale.

Ad esempio, per eseguire il partizionamento dello StatefulSet web, esegui il comando seguente:

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

Questo comporta l'aggiornamento dei pod con un numero ordinale maggiore o uguale a 3.

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 suoi pod dopo aver apportato modifiche al relativo 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 quando il pod viene ricreato dallo StatefulSet e passa a In esecuzione e Pronto, esegui questo comando:

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 suoi pod vengono eseguiti con la nuova configurazione. Dopo aver aggiornato un job, devi eliminare manualmente il job precedente e i relativi pod, se vuoi.

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

kubectl delete job my-job

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

kubectl delete job my-job --cascade=false

Puoi anche eseguire kubectl describe deployment nginx, che consente di ottenere ulteriori informazioni sul deployment.

Passaggi successivi