⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Appliquer des mises à jour progressives à un service


Dans une étape précédente du tutoriel, vous avez mis à l'échelle le nombre d' instances d'un service. Dans cette partie du tutoriel, vous déployez un service basé sur le tag de conteneur Redis 7.4.0. Ensuite, vous mettez à niveau le service pour utiliser l' image de conteneur Redis 7.4.1 en utilisant des mises à jour progressives.

  1. Si vous ne l'avez pas déjà fait, ouvrez un terminal et connectez-vous en ssh à la machine où vous exécutez votre nœud gestionnaire. Par exemple, le tutoriel utilise une machine nommée manager1.

  2. Déployez votre tag Redis dans le swarm et configurez le swarm avec un délai de mise à jour de 10 secondes. Notez que l'exemple suivant montre un tag Redis plus ancien :

    $ docker service create \
      --replicas 3 \
      --name redis \
      --update-delay 10s \
      redis:7.4.0
    
    0u6a4s31ybk7yw2wyvtikmu50
    

    Vous configurez la politique de mise à jour progressive au moment du déploiement du service.

    Le flag --update-delay configure le délai entre les mises à jour d'une tâche de service ou d'ensembles de tâches. Vous pouvez décrire le temps T comme une combinaison du nombre de secondes Ts, minutes Tm, ou heures Th. Donc 10m30s indique un délai de 10 minutes 30 secondes.

    Par défaut, le planificateur met à jour 1 tâche à la fois. Vous pouvez passer le flag --update-parallelism pour configurer le nombre maximum de tâches de service que le planificateur met à jour simultanément.

    Par défaut, lorsqu'une mise à jour d'une tâche individuelle retourne un état de RUNNING, le planificateur planifie une autre tâche à mettre à jour jusqu'à ce que toutes les tâches soient mises à jour. Si à tout moment pendant une mise à jour une tâche retourne FAILED, le planificateur met en pause la mise à jour. Vous pouvez contrôler le comportement en utilisant le flag --update-failure-action pour docker service create ou docker service update.

  3. Inspectez le service redis :

    $ docker service inspect --pretty redis
    
    ID:             0u6a4s31ybk7yw2wyvtikmu50
    Name:           redis
    Service Mode:   Replicated
     Replicas:      3
    Placement:
     Strategy:	    Spread
    UpdateConfig:
     Parallelism:   1
     Delay:         10s
    ContainerSpec:
     Image:         redis:7.4.0
    Resources:
    Endpoint Mode:  vip
    
  4. Maintenant vous pouvez mettre à jour l'image de conteneur pour redis. Le gestionnaire swarm applique la mise à jour aux nœuds selon la politique UpdateConfig :

    $ docker service update --image redis:7.4.1 redis
    redis
    

    Le planificateur applique les mises à jour progressives comme suit par défaut :

    • Arrêter la première tâche.
    • Planifier la mise à jour pour la tâche arrêtée.
    • Démarrer le conteneur pour la tâche mise à jour.
    • Si la mise à jour d'une tâche retourne RUNNING, attendre la période de délai spécifiée puis démarrer la tâche suivante.
    • Si, à tout moment pendant la mise à jour, une tâche retourne FAILED, mettre en pause la mise à jour.
  5. Exécutez docker service inspect --pretty redis pour voir la nouvelle image dans l' état désiré :

    $ docker service inspect --pretty redis
    
    ID:             0u6a4s31ybk7yw2wyvtikmu50
    Name:           redis
    Service Mode:   Replicated
     Replicas:      3
    Placement:
     Strategy:	    Spread
    UpdateConfig:
     Parallelism:   1
     Delay:         10s
    ContainerSpec:
     Image:         redis:7.4.1
    Resources:
    Endpoint Mode:  vip
    

    La sortie de service inspect montre si votre mise à jour s'est mise en pause à cause d'une défaillance :

    $ docker service inspect --pretty redis
    
    ID:             0u6a4s31ybk7yw2wyvtikmu50
    Name:           redis
    ...snip...
    Update status:
     State:      paused
     Started:    11 seconds ago
     Message:    update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b
    ...snip...
    

    Pour redémarrer une mise à jour en pause, exécutez docker service update <SERVICE-ID>. Par exemple :

    $ docker service update redis
    

    Pour éviter de répéter certaines défaillances de mise à jour, vous pourriez avoir besoin de reconfigurer le service en passant des flags à docker service update.

  6. Exécutez docker service ps <SERVICE-ID> pour regarder la mise à jour progressive :

    $ docker service ps redis
    
    NAME                                   IMAGE        NODE       DESIRED STATE  CURRENT STATE            ERROR
    redis.1.dos1zffgeofhagnve8w864fco      redis:7.4.1  worker1    Running        Running 37 seconds
     \_ redis.1.88rdo6pa52ki8oqx6dogf04fh  redis:7.4.0  worker2    Shutdown       Shutdown 56 seconds ago
    redis.2.9l3i4j85517skba5o7tn5m8g0      redis:7.4.1  worker2    Running        Running About a minute
     \_ redis.2.66k185wilg8ele7ntu8f6nj6i  redis:7.4.0  worker1    Shutdown       Shutdown 2 minutes ago
    redis.3.egiuiqpzrdbxks3wxgn8qib1g      redis:7.4.1  worker1    Running        Running 48 seconds
     \_ redis.3.ctzktfddb2tepkr45qcmqln04  redis:7.4.0  mmanager1  Shutdown       Shutdown 2 minutes ago
    

    Avant que Swarm mette à jour toutes les tâches, vous pouvez voir que certaines exécutent redis:7.4.0 tandis que d'autres exécutent redis:7.4.1. La sortie ci-dessus montre l'état une fois que les mises à jour progressives sont terminées.

Prochaines étapes

Ensuite, vous apprendrez comment drainer un nœud dans le swarm.