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 (GKE).

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 :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.

Mettre à jour une application

La section suivante explique comment mettre à jour une application à l'aide de la console Google Cloud 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

Vous pouvez exécuter la commande kubectl apply pour mettre à jour une ressource en appliquant une configuration nouvelle ou modifiée.

Pour appliquer une configuration nouvelle ou modifiée à une ressource, exécutez la commande suivante :

kubectl apply -f MANIFEST

Remplacez MANIFEST par le nom du fichier manifeste. Si le fichier n'existe pas, cette commande crée la ressource et applique la configuration. Sinon, la configuration mise à jour est appliquée.

Console

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

  1. Accédez à la page Charges de travail dans la console Google Cloud.

    Accéder à la page 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ètres maxUnavailable et maxSurge du DaemonSet

Les paramètres facultatifs maxUnavailable et maxSurge du DaemonSet sont des enfants du champ rollingUpdate du DaemonSet.

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.

maxSurge est le nombre maximal de pods pouvant faire l'objet d'un scaling à la hausse lors des mises à jour. Si ce paramètre n'est pas spécifié, la valeur par défaut est 0.

Aucune des valeurs ne peut être 0 si l'autre valeur est 0. Les deux valeurs peuvent être un nombre absolu ou un pourcentage.

Pour en savoir plus, consultez la section DaemonSetSpec.

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