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 :
- DaemonSets
- Déploiements
- 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 :
Accédez à la page Charges de travail dans la console Google Cloud.
Sélectionnez la charge de travail que vous souhaitez mettre à jour.
Sur la page Informations sur le déploiement, cliquez sur list Actions > Mise à jour progressive.
Dans la boîte de dialogue Mise à jour progressive, définissez l'image de la charge de travail.
Cliquez sur Mettre à jour.
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 nœuds disposant d'un pod DaemonSet disponible qui peuvent avoir un pod DaemonSet mis à jour pendant une mise à 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.