# Gestionar nodos en un swarm


Como parte del ciclo de vida de gestión del swarm, es posible que necesites:

* [Listar nodos en el swarm](#listar-nodos)
* [Inspeccionar un nodo individual](#inspeccionar-un-nodo-individual)
* [Actualizar un nodo](#actualizar-un-nodo)
* [Abandonar el swarm](#abandonar-el-swarm)

## Listar nodos

Para ver una lista de nodos en el swarm, ejecuta `docker node ls` desde un nodo administrador:

```console
$ docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
46aqrk4e473hjbt745z53cr3t    node-5    Ready   Active        Reachable
61pi3d91s0w3b90ijw3deeb2q    node-4    Ready   Active        Reachable
a5b2m3oghd48m8eu391pefq5u    node-3    Ready   Active
e7p8btxeu3ioshyuj6lxiv6g0    node-2    Ready   Active
ehkv3bcimagdese79dn78otj5 *  node-1    Ready   Active        Leader
```

La columna `AVAILABILITY` muestra si el planificador puede asignar tareas al nodo o no:

* `Active` (Activo) significa que el planificador puede asignar tareas al nodo.
* `Pause` (Pausado) significa que el planificador no asigna nuevas tareas al nodo, pero las tareas existentes siguen ejecutándose.
* `Drain` (Drenado) significa que el planificador no asigna nuevas tareas al nodo. El planificador detiene las tareas existentes y las programa en otro nodo disponible.

La columna `MANAGER STATUS` muestra la participación del nodo en el consenso Raft:

* Ningún valor indica un nodo trabajador que no participa en la gestión del swarm.
* `Leader` (Líder) significa que el nodo es el administrador principal que toma todas las decisiones de orquestación y gestión del swarm.
* `Reachable` (Accesible) significa que el nodo es un administrador que participa en el quórum de consenso Raft. Si el nodo líder deja de estar disponible, este nodo es elegible para ser elegido como nuevo líder.
* `Unavailable` (No disponible) significa que el nodo es un administrador que no puede comunicarse con otros administradores. Si un nodo administrador deja de estar disponible, debes unir un nuevo nodo administrador al swarm o promover un nodo trabajador para que sea administrador.

Para obtener más información sobre la administración de swarms, consulta la [Guía de administración de Swarm](/engine/swarm/manage-nodes/admin_guide/).

## Inspeccionar un nodo individual

Puedes ejecutar `docker node inspect <NODE-ID>` en un nodo administrador para ver los detalles de un nodo individual. La salida por defecto tiene formato JSON, pero puedes pasar la opción `--pretty` para imprimir los resultados en un formato legible para humanos. Por ejemplo:

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

ID:                     ehkv3bcimagdese79dn78otj5
Hostname:               node-1
Joined at:              2016-06-16 22:52:44.9910662 +0000 utc
Status:
 State:                 Ready
 Availability:          Active
Manager Status:
 Address:               172.17.0.2:2377
 Raft Status:           Reachable
 Leader:                Yes
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  2
 Memory:                1.954 GiB
Plugins:
  Network:              overlay, host, bridge, overlay, null
  Volume:               local
Engine Version:         1.12.0-dev
```

## Actualizar un nodo

Puedes modificar los atributos de los nodos para:

* [Cambiar la disponibilidad del nodo](#cambiar-la-disponibilidad-del-nodo)
* [Añadir o eliminar metadatos de etiquetas (labels)](#añadir-o-eliminar-metadatos-de-etiquetas)
* [Cambiar el rol de un nodo](#promover-o-degradar-un-nodo)

### Cambiar la disponibilidad del nodo

Cambiar la disponibilidad del nodo te permite:

* Drenar (drain) un nodo administrador para que solo realice tareas de gestión del swarm y no esté disponible para la asignación de tareas.
* Drenar un nodo para que puedas retirarlo para mantenimiento.
* Pausar un nodo para que no pueda recibir nuevas tareas.
* Restaurar el estado de disponibilidad de nodos no disponibles o pausados.

Por ejemplo, para cambiar un nodo administrador a disponibilidad `Drain`:

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

node-1
```

Consulta [Listar nodos](#listar-nodos) para obtener descripciones de las diferentes opciones de disponibilidad.

### Añadir o eliminar metadatos de etiquetas

Las etiquetas de nodo proporcionan un método flexible para organizar los nodos. También puedes utilizar las etiquetas de nodo en las restricciones de servicio. Aplica restricciones al crear un servicio para limitar los nodos donde el planificador asigna tareas para el servicio.

Ejecuta `docker node update --label-add` en un nodo administrador para añadir metadatos de etiquetas a un nodo. La opción `--label-add` admite una clave `<key>` o un par `<key>=<value>`.

Pasa la opción `--label-add` una vez por cada etiqueta de nodo que quieras añadir:

```console
$ docker node update --label-add foo --label-add bar=baz node-1

node-1
```

Las etiquetas que estableces para los nodos utilizando `docker node update` se aplican solo a la entidad del nodo dentro del swarm. No las confundas con las etiquetas del demonio Docker para [dockerd](/engine/manage-resources/labels/).

Por lo tanto, las etiquetas de nodo se pueden utilizar para limitar tareas críticas a nodos que cumplan con ciertos requisitos. Por ejemplo, programar solo en máquinas donde se deban ejecutar cargas de trabajo especiales, como máquinas que cumplan con la [conformidad PCI-DSS](https://www.pcisecuritystandards.org/).

Un nodo trabajador comprometido no podría comprometer estas cargas de trabajo especiales porque no puede cambiar las etiquetas del nodo.

Las etiquetas de motor (engine labels), sin embargo, siguen siendo útiles porque algunas características que no afectan la orquestación segura de contenedores podrían configurarse mejor de manera descentralizada. Por ejemplo, un motor podría tener una etiqueta para indicar que tiene un determinado tipo de dispositivo de disco, lo cual puede no ser relevante directamente para la seguridad. El orquestador del swarm confía en estas etiquetas de manera más directa.

Consulta la referencia de la línea de comandos de [`docker service create`](/reference/cli/docker/service/create/) para obtener más información sobre las restricciones de servicio.

### Promover o degradar un nodo

Puedes promover un nodo trabajador al rol de administrador. Esto es útil cuando un nodo administrador deja de estar disponible o si quieres desconectar un administrador para mantenimiento. Del mismo modo, puedes degradar un nodo administrador al rol de trabajador.

> [!NOTE]
> 
> Independientemente del motivo para promover o degradar un nodo, siempre debes mantener un quórum de nodos administradores en el swarm. Para obtener más información, consulta la [Guía de administración de Swarm](/engine/swarm/manage-nodes/admin_guide/).

Para promover un nodo o conjunto de nodos, ejecuta `docker node promote` desde un nodo administrador:

```console
$ docker node promote node-3 node-2

Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.
```

Para degradar un nodo o conjunto de nodos, ejecuta `docker node demote` desde un nodo administrador:

```console
$ docker node demote node-3 node-2

Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.
```

`docker node promote` y `docker node demote` son comandos de conveniencia para `docker node update --role manager` y `docker node update --role worker` respectivamente.

## Instalar plugins en nodos de swarm

Si tu servicio de swarm depende de uno o más [plugins](/engine/extend/plugin_api/), estos plugins deben estar disponibles en cada nodo donde el servicio pudiera desplegarse. Puedes instalar manualmente el plugin en cada nodo o automatizar la instalación mediante scripts. También puedes desplegar el plugin de manera similar a un servicio global utilizando la API de Docker, especificando un `PluginSpec` en lugar de un `ContainerSpec`.

> [!NOTE]
> 
> No existe una forma de desplegar un plugin en un swarm utilizando la CLI de Docker o Docker Compose. Además, no es posible instalar plugins desde un repositorio privado.

El [`PluginSpec`](/engine/extend/plugin_api/#json-specification) es definido por el desarrollador del plugin. Para añadir el plugin a todos los nodos de Docker, utiliza la API [`service/create`](/reference/api/engine/v1.31/#operation/ServiceCreate), pasando el JSON `PluginSpec` definido en el `TaskTemplate`.

## Abandonar el swarm

Ejecuta el comando `docker swarm leave` en un nodo para eliminarlo del swarm.

Por ejemplo, para abandonar el swarm en un nodo trabajador:

```console
$ docker swarm leave

Node left the swarm.
```

Cuando un nodo abandona el swarm, Docker Engine deja de ejecutarse en modo Swarm. El orquestador ya no programa tareas en ese nodo.

Si el nodo es un nodo administrador, recibirás una advertencia sobre el mantenimiento del quórum. Para omitir la advertencia, pasa la opción `--force`. Si el último nodo administrador abandona el swarm, el swarm dejará de estar disponible, lo que requerirá que tomes medidas de recuperación ante desastres.

Para obtener información sobre el mantenimiento del quórum y la recuperación ante desastres, consulta la [Guía de administración de Swarm](/engine/swarm/manage-nodes/admin_guide/).

Después de que un nodo abandone el swarm, puedes ejecutar `docker node rm` en un nodo administrador para eliminar el nodo de la lista de nodos.

Por ejemplo:

```console
$ docker node rm node-2
```

## Más información

* [Guía de administración de Swarm](/engine/swarm/manage-nodes/admin_guide/)
* [Referencia de línea de comandos de Docker Engine](/reference/cli/docker/)
* [Tutorial del modo Swarm](/engine/swarm/manage-nodes/swarm-tutorial/)

