# Drenar un nodo en el swarm


En los pasos anteriores del tutorial, todos los nodos se han estado ejecutando con disponibilidad `Active`. El administrador del swarm puede asignar tareas a cualquier nodo `Active`, por lo que hasta ahora todos los nodos han estado disponibles para recibir tareas.

A veces, por ejemplo durante tareas de mantenimiento planificadas, necesitas establecer un nodo en disponibilidad `Drain` (Drenar). La disponibilidad `Drain` evita que un nodo reciba nuevas tareas del administrador de swarm. También significa que el administrador detiene las tareas que se ejecutan en el nodo e inicia tareas de réplica en un nodo con disponibilidad `Active`.

> [!IMPORTANT]: 
>
> Establecer un nodo en `Drain` no elimina los contenedores independientes de ese nodo,
> como los creados con `docker run`, `docker compose up` o la API de Docker Engine. El estado
> de un nodo, incluido `Drain`, solo afecta a la capacidad del nodo para programar cargas de
> trabajo de servicios de swarm.

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.  Verifica que todos tus nodos estén disponibles activamente.

    ```console
    $ docker node ls

    ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    1bcef6utixb0l0ca7gxuivsj0    worker2   Ready   Active
    38ciaotwjuritcdtn9npbnkuz    worker1   Ready   Active
    e216jshn25ckzbvmwlnh5jr3g *  manager1  Ready   Active        Leader
    ```

3.  Si no sigues ejecutando el servicio `redis` del tutorial de [actualización continua](/engine/swarm/swarm-tutorial/drain-node/rolling-update/), inícialo ahora:

    ```console
    $ docker service create --replicas 3 --name redis --update-delay 10s redis:7.4.0

    c5uo6kdmzpon37mgj9mwglcfw
    ```

4.  Ejecuta `docker service ps redis` para ver cómo el administrador del swarm asignó las tareas a los diferentes nodos:

    ```console
    $ docker service ps redis

    NAME                               IMAGE        NODE     DESIRED STATE  CURRENT STATE
    redis.1.7q92v0nr1hcgts2amcjyqg3pq  redis:7.4.0  manager1 Running        Running 26 seconds
    redis.2.7h2l8h3q3wqy5f66hlv9ddmi6  redis:7.4.0  worker1  Running        Running 26 seconds
    redis.3.9bg7cezvedmkgg6c8yzvbhwsd  redis:7.4.0  worker2  Running        Running 26 seconds
    ```

    En este caso, el administrador del swarm distribuyó una tarea a cada nodo. Es posible que en tu entorno observes que las tareas se distribuyen de manera diferente entre los nodos.

5.  Ejecuta `docker node update --availability drain worker1` para drenar un nodo que tuviera una tarea asignada:

    ```console
    $ docker node update --availability drain worker1

    worker1
    ```

6.  Inspecciona el nodo para verificar su disponibilidad:

    ```console
    $ docker node inspect --pretty worker1

    ID:			38ciaotwjuritcdtn9npbnkuz
    Hostname:		worker1
    Status:
     State:			Ready
     Availability:		Drain
    ...snip...
    ```

    El nodo drenado muestra `Drain` para la propiedad `Availability`.

7.  Ejecuta `docker service ps redis` para ver cómo el administrador de swarm actualizó las asignaciones de tareas para el servicio `redis`:

    ```console
    $ docker service ps redis

    NAME                                    IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR
    redis.1.7q92v0nr1hcgts2amcjyqg3pq       redis:7.4.0  manager1  Running        Running 4 minutes
    redis.2.b4hovzed7id8irg1to42egue8       redis:7.4.0  worker2   Running        Running About a minute
     \_ redis.2.7h2l8h3q3wqy5f66hlv9ddmi6   redis:7.4.0  worker1   Shutdown       Shutdown 2 minutes ago
    redis.3.9bg7cezvedmkgg6c8yzvbhwsd       redis:7.4.0  worker2   Running        Running 4 minutes
    ```

    El administrador de swarm mantiene el estado deseado al finalizar la tarea en el nodo con disponibilidad `Drain` y crear una nueva tarea en un nodo con disponibilidad `Active`.

8.  Ejecuta `docker node update --availability active worker1` para devolver el nodo drenado a un estado activo:

    ```console
    $ docker node update --availability active worker1

    worker1
    ```

9.  Inspecciona el nodo para ver el estado actualizado:

    ```console
    $ docker node inspect --pretty worker1

    ID:			38ciaotwjuritcdtn9npbnkuz
    Hostname:		worker1
    Status:
     State:			Ready
     Availability:		Active
    ...snip...
    ```

    Al volver a establecer el nodo en disponibilidad `Active`, este podrá recibir nuevas tareas:

    * durante la actualización de un servicio para escalar verticalmente (scale up)
    * durante una actualización continua (rolling update)
    * cuando configures otro nodo en disponibilidad `Drain`
    * cuando falle una tarea en otro nodo activo

## Siguientes pasos

A continuación, aprenderás a utilizar la malla de enrutamiento (routing mesh) en el modo Swarm.

[Usar la malla de enrutamiento en el modo Swarm](/engine/swarm/ingress/)


