Compartir comentarios
Las respuestas se generan en base a la documentación.

Aplicar actualizaciones continuas a un servicio


En un paso anterior del tutorial, escalaste el número de instancias de un servicio. En esta parte del tutorial, implementarás un servicio basado en la etiqueta de contenedor de Redis 7.4.0. Luego, actualizarás el servicio para usar la imagen de contenedor de Redis 7.4.1 utilizando actualizaciones continuas (rolling updates).

  1. Si aún no lo has hecho, abre una terminal y conéctate por SSH a la máquina donde ejecutas tu nodo administrador. Por ejemplo, el tutorial utiliza una máquina llamada manager1.

  2. Implementa tu etiqueta de Redis en el swarm y configura el swarm con un retraso de actualización de 10 segundos. Ten en cuenta que el siguiente ejemplo muestra una etiqueta de Redis más antigua:

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

    Configuras la política de actualización continua en el momento de la implementación del servicio.

    La bandera --update-delay configura el retraso de tiempo entre las actualizaciones de una tarea de servicio o conjuntos de tareas. Puedes representar el tiempo T como una combinación de números para segundos Ts, minutos Tm u horas Th. De este modo, 10m30s indica un retraso de 10 minutos y 30 segundos.

    Por defecto, el programador actualiza 1 tarea a la vez. Puedes pasar la bandera --update-parallelism para configurar la cantidad máxima de tareas de servicio que el programador actualizará automáticamente al mismo tiempo.

    Por defecto, cuando la actualización de una tarea individual devuelve el estado RUNNING, el programador programa la actualización de otra tarea hasta que todas estén actualizadas. Si en cualquier momento durante la actualización una tarea devuelve FAILED, el programador pausará la actualización. Puedes controlar este comportamiento mediante la bandera --update-failure-action para docker service create o docker service update.

  3. Inspecciona el servicio 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. Ahora puedes actualizar la imagen del contenedor para redis. El administrador de swarm aplica la actualización a los nodos según la política de UpdateConfig:

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

    El programador aplica las actualizaciones continuas de la siguiente manera de forma predeterminada:

    • Detiene la primera tarea.
    • Programa la actualización para la tarea detenida.
    • Inicia el contenedor para la tarea actualizada.
    • Si la actualización de una tarea devuelve RUNNING, espera el período de retraso especificado y luego inicia la siguiente tarea.
    • Si en cualquier momento durante la actualización una tarea devuelve FAILED, pausa la actualización.
  5. Ejecuta docker service inspect --pretty redis para ver la nueva imagen en el estado deseado:

    $ 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 salida de service inspect muestra si tu actualización se pausó debido a un fallo:

    $ 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...
    

    Para reiniciar una actualización pausada, ejecuta docker service update <SERVICE-ID>. Por ejemplo:

    $ docker service update redis
    

    Para evitar repetir ciertos fallos de actualización, es posible que necesites reconfigurar el servicio pasando banderas a docker service update.

  6. Ejecuta docker service ps <SERVICE-ID> para observar la actualización continua:

    $ 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
    

    Antes de que Swarm actualice todas las tareas, podrás observar que algunas ejecutan redis:7.4.0 mientras que otras ejecutan redis:7.4.1. La salida anterior muestra el estado una vez finalizadas las actualizaciones continuas.

Siguientes pasos

A continuación, aprenderás a drenar un nodo en el swarm.

Drenar un nodo