Exécuter des mises à jour progressives

Cette page explique comment effectuer des mises à jour progressives pour les applications déployées dans Google Kubernetes Engine.

Présentation

Une mise à jour progressive vous permet d'actualiser les images, la configuration, les libellés, les annotations et les limites ou demandes de ressources des charges de travail exécutées dans vos clusters. Les mises à jour progressives remplacent de manière incrémentielle les pods de votre ressource par de nouveaux pods, qui sont ensuite programmés sur des nœuds présentant des ressources disponibles. Les mises à jour progressives sont conçues pour mettre à jour vos charges de travail sans temps d'arrêt.

Les objets suivants représentent des charges de travail Kubernetes. Vous pouvez déclencher une mise à jour progressive de ces charges de travail en modifiant leur modèle de pod :

  • Objets DaemonSet
  • Objets Deployment
  • StatefulSets

Chacun de ces objets possède un modèle de pod, représenté par le champ spec: template dans le fichier manifeste de l'objet. Le champ "template" du pod contient une spécification déterminant l'état ou le comportement souhaité pour les pods créés par le contrôleur. Vous déclenchez le déploiement d'une mise à jour en modifiant le contenu du champ spec: template de l'objet.

Le modèle de pod contient les champs suivants :

Pour en savoir plus sur le modèle de pod, consultez la documentation sur PodTemplateSpec.

Le scaling d'une ressource ou la mise à jour de champs situés en dehors du modèle de pod ne déclenchent pas de déploiement.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

Configurez les paramètres gcloud par défaut à l'aide de l'une des méthodes suivantes :

  • Utilisez gcloud init pour suivre les instructions permettant de définir les paramètres par défaut.
  • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

Utiliser gcloud init

Si le message d'erreur One of [--zone, --region] must be supplied: Please specify location s'affiche, effectuez les tâches ci-dessous.

  1. Exécutez gcloud init et suivez les instructions :

    gcloud init

    Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

    gcloud init --console-only
  2. Suivez les instructions pour autoriser gcloud à utiliser votre compte Google Cloud.
  3. Créez ou sélectionnez une configuration.
  4. Choisissez un projet Google Cloud.
  5. Choisissez une zone Compute Engine par défaut.

Utiliser gcloud config

  • Définissez votre ID de projet par défaut :
    gcloud config set project PROJECT_ID
  • Si vous utilisez des clusters zonaux, définissez votre zone de calcul par défaut :
    gcloud config set compute/zone COMPUTE_ZONE
  • Si vous utilisez des clusters régionaux, définissez votre région de calcul par défaut :
    gcloud config set compute/region COMPUTE_REGION
  • Mettez à jour gcloud vers la dernière version :
    gcloud components update

Mettre à jour une application

La section suivante explique comment mettre à jour une application à l'aide de Google Cloud Console ou de kubectl.

kubectl set

La commande kubectl set vous permet de modifier les champs suivants d'un objet : image, resources (ressources de calcul telles que le processeur et la mémoire) ou selector.

Par exemple, pour mettre à jour un déploiement de la version 1.7.9 vers la version 1.9.1 de nginx, exécutez la commande suivante :

kubectl set image deployment nginx nginx=nginx:1.9.1

La commande kubectl set image met à jour l'image nginx des pods d'un objet Deployment à raison d'un pod à la fois.

Cet autre exemple montre comment définir les demandes et les limites de ressources d'un objet Deployment :

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

Ou, pour supprimer les demandes de ressources de l'objet Deployment :

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

kubectl apply

La commande kubectl apply vous permet de mettre à jour un objet en appliquant un fichier manifeste nouveau ou modifié.

Pour appliquer un nouveau fichier manifeste, exécutez la commande suivante :

kubectl apply -f [MANIFEST]

[MANIFEST] est le fichier manifeste mis à jour.

Console

Pour modifier la configuration active d'une application, procédez comme suit :

  1. Accédez au menu "Charges de travail" de Google Kubernetes Engine dans Cloud Console.

    Accéder au menu Charges de travail

  2. Sélectionnez la charge de travail souhaitée.

  3. Cliquez sur Modifier.

  4. Apportez les modifications souhaitées aux libellés ou au modèle de pod de l'objet dans l'éditeur.

  5. Cliquez sur Enregistrer.

Gérer un déploiement de mise à jour

La commande kubectl rollout vous permet d'inspecter un déploiement en cours, de suspendre et de reprendre un déploiement, d'annuler une mise à jour et d'afficher l'historique de déploiement d'un objet.

Inspecter un déploiement avec kubectl rollout status

Vous pouvez directement inspecter l'état d'un déploiement en utilisant la commande kubectl rollout status.

Par exemple, vous pouvez inspecter le déploiement de l'objet nginx en exécutant la commande suivante :

kubectl rollout status deployment nginx

Le résultat ressemble à ce qui suit :

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

Une fois le déploiement mené à bien, exécutez la commande kubectl get deployment nginx pour vérifier que tous ses pods sont en cours d'exécution. Le résultat ressemble à ce qui suit :

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

Suspendre et reprendre un déploiement

La commande kubectl rollout pause vous permet de suspendre un déploiement.

Par exemple, pour suspendre le déploiement de l'objet Deployment nginx, exécutez la commande suivante :

kubectl rollout pause deployment nginx

Pour reprendre, exécutez la commande suivante :

kubectl rollout resume deployment nginx

Afficher l'historique des déploiements avec kubectl rollout history

La commande kubectl rollout history vous permet d'afficher l'historique de déploiement d'un objet.

Par exemple, pour afficher l'historique de déploiement de l'objet Deployment nginx, exécutez la commande suivante :

kubectl rollout history deployment nginx

Pour afficher l'historique de la troisième révision, exécutez la commande suivante :

kubectl rollout history deployment nginx --revision 3

Procéder au rollback d'une mise à jour via la commande kubectl rollout undo

La commande kubectl rollout undo vous permet de procéder au rollback du déploiement d'un objet.

Par exemple, pour revenir à la version précédente de l'objet Deployment nginx, exécutez la commande suivante :

kubectl rollout undo deployments nginx

Cet autre exemple vous montre comment revenir à la troisième révision de l'objet Deployment en exécutant la commande suivante :

kubectl rollout undo deployment nginx --to-revision 3

Considérations relatives aux objets StatefulSet et DaemonSet

Les objets StatefulSet (depuis Kubernetes 1.7) et DaemonSet (depuis Kubernetes 1.6) utilisent une stratégie de mise à jour pour configurer ou désactiver les mises à jour progressives automatisées des conteneurs, des libellés, des demandes ou limites de ressources, et des annotations relatifs à leurs pods. La configuration de cette stratégie de mise à jour s'effectue via le champ spec.updateStrategy.

Les valeurs possibles du champ spec.updateStrategy.type sont OnDelete et RollingUpdate.

OnDelete est le comportement appliqué par défaut lorsque le champ spec.updateStrategy.type n'est pas spécifié. La stratégie OnDelete empêche le contrôleur de mettre à jour automatiquement ses pods. Vous devez supprimer manuellement les pods pour que le contrôleur crée de nouveaux pods reflétant vos modifications. La stratégie OnDelete est utile si vous préférez mettre à jour manuellement les pods.

La stratégie RollingUpdate met en œuvre des mises à jour progressives automatisées pour les pods de l'objet StatefulSet. Avec la stratégie RollingUpdate, le contrôleur supprime et recrée chacun de ses pods, à raison d'un pod à la fois. Le contrôleur attend qu'un pod mis à jour soit en cours d'exécution et prêt pour mettre à jour son prédécesseur.

Le contrôleur StatefulSet met à jour tous les pods par ordre séquentiel inverse tout en respectant les garanties StatefulSet.

Utiliser la stratégie RollingUpdate

La stratégie RollingUpdate vous permet de mettre à jour automatiquement tous les pods d'un objet StatefulSet ou DaemonSet.

Par exemple, pour corriger l'objet StatefulSet web de sorte qu'il applique la stratégie RollingUpdate, exécutez la commande suivante :

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

Ensuite, modifiez le champ spec.template de cet objet StatefulSet. Par exemple, vous pouvez modifier l'image du conteneur en exécutant la commande kubectl set. Dans l'exemple suivant, l'objet StatefulSet web est configuré pour que son conteneur nginx exécute l'image nginx-slim:0.7 :

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

Pour vérifier que les pods de l'objet StatefulSet exécutant le conteneur nginx sont en cours de mise à jour, exécutez la commande suivante :

kubectl get pods -l app=nginx -w

Le résultat ressemble à ce qui suit :

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

Les pods de l'objet StatefulSet sont mis à jour par ordre séquentiel inverse. Le contrôleur StatefulSet arrête chaque pod et attend sa transition vers l'état "En cours d'exécution et prêt" avant de mettre à jour le pod suivant.

Partitionner un RollingUpdate

Vous pouvez spécifier un paramètre partition dans le champ RollingUpdate de l'objet StatefulSet.

Si vous spécifiez un paramètre partition, tous les pods dont le numéro séquentiel est supérieur ou égal à la valeur partition sont mis à jour. Tous les pods de rang séquentiel inférieur à la valeur partition sont exclus de la mise à jour, et sont recréés à la version antérieure en cas de suppression.

Si une valeur partition est supérieure au nombre d'instances dupliquées (valeur replicas), les mises à jour ne sont pas propagées aux pods. Le partitionnement est utile si vous souhaitez effectuer une mise à jour par étapes, déployer une version Canary ou procéder à un déploiement progressif.

Par exemple, pour partitionner l'objet StatefulSet web, exécutez la commande suivante :

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

Cette commande à pour effet de mettre à jour les pods dont le numéro séquentiel est supérieur ou égal à 3.

Paramètre maxUnavailable de l'objet DaemonSet

Le paramètre facultatif maxUnavailable de l'objet DaemonSet est un enfant du champ rollingUpdate de cet objet.

maxUnavailable détermine le nombre maximal de pods DaemonSet indisponibles tolérés lors des mises à jour. Si ce paramètre n'est pas spécifié, la valeur par défaut est 1. Cette valeur ne peut pas être égale à 0. Elle peut être exprimée sous la forme d'un nombre absolu ou d'un pourcentage.

Effectuer une mise à jour avec la stratégie OnDelete

Si vous préférez mettre à jour manuellement un objet StatefulSet ou DaemonSet, vous pouvez omettre le champ spec.updateStrategy, ce qui indique au contrôleur qu'il doit utiliser la stratégie OnDelete.

Pour mettre à jour un contrôleur qui utilise la stratégie OnDelete, vous devez supprimer manuellement ses pods après avoir modifié son modèle de pod.

Par exemple, vous pouvez configurer l'objet StatefulSet web pour qu'il utilise l'image nginx-slim:0.7 :

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

Exécutez ensuite la commande suivante pour supprimer le premier pod web :

kubectl delete pod web-0

Pour suivre la recréation du pod par l'objet StatefulSet puis son passage à l'état "En cours d'exécution et prêt", exécutez la commande suivante :

kubectl get pod web-0 -w

Le résultat de la commande ressemble à ceci :

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

Mettre à jour une tâche

Lorsque vous mettez à jour la configuration d'une tâche, la nouvelle tâche et ses pods s'exécutent avec la configuration mise à jour. Après la mise à jour d'une tâche, vous devez supprimer manuellement l'ancienne tâche et ses pods si vous le souhaitez.

Pour supprimer une tâche et tous ses pods, exécutez la commande suivante :

kubectl delete job my-job

Pour supprimer une tâche tout en maintenant ses pods en cours d'exécution, spécifiez l'option --cascade=false :

kubectl delete job my-job --cascade=false

Vous pouvez également exécuter la commande kubectl describe deployment nginx, qui fournit des informations encore plus détaillées sur l'objet Deployment.

Étape suivante