Ejecutar Docker Engine en modo Swarm
Al instalar e iniciar el trabajo con Docker Engine por primera vez, el modo Swarm está deshabilitado por defecto. Al habilitar el modo Swarm, trabajas con el concepto de servicios administrados a través del comando docker service.
Existen dos formas de ejecutar el motor en modo Swarm:
- Crear un nuevo swarm, tema del que trata este artículo.
- Unirse a un swarm existente.
Al ejecutar el motor en modo Swarm en tu máquina local, puedes crear y probar servicios basados en imágenes que hayas creado u otras imágenes disponibles. En tu entorno de producción, el modo Swarm proporciona una plataforma tolerante a fallos con características de gestión de clústeres para mantener tus servicios en ejecución y disponibles.
Estas instrucciones asumen que has instalado Docker Engine en una máquina para que sirva como nodo administrador (manager) en tu swarm.
Si aún no lo has hecho, lee los Conceptos clave del modo Swarm y prueba el Tutorial del modo Swarm.
Crear un swarm
Al ejecutar el comando para crear un swarm, Docker Engine comienza a ejecutarse en modo Swarm.
Ejecuta
docker swarm init para crear un swarm de un solo nodo en el nodo actual. El motor configura el swarm de la siguiente manera:
- Cambia el nodo actual al modo Swarm.
- Crea un swarm llamado
default. - Designa el nodo actual como el nodo administrador líder (leader manager node) para el swarm.
- Nombra al nodo utilizando el nombre de host de la máquina (hostname).
- Configura al administrador para escuchar en una interfaz de red activa en el puerto
2377. - Establece la disponibilidad del nodo actual en
Active(Activo), lo que significa que puede recibir tareas del planificador. - Inicia un almacén de datos distribuido interno para que los motores (Engines) que participan en el swarm mantengan una vista consistente del swarm y de todos los servicios que se ejecutan en él.
- Por defecto, genera una CA raíz autofirmada para el swarm.
- Por defecto, genera tokens para que los nodos trabajadores y administradores se unan al swarm.
- Crea una red superpuesta (overlay network) llamada
ingresspara publicar puertos de servicio de forma externa al swarm. - Crea subredes y direcciones IP predeterminadas para las redes.
La salida de docker swarm init proporciona el comando de conexión a utilizar cuando unes nuevos nodos trabajadores al swarm:
$ docker swarm init
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Configurar los grupos de direcciones predeterminadas
Por defecto, el modo Swarm utiliza el grupo de direcciones predeterminado 10.0.0.0/8 para redes de ámbito global (overlay). Cada red que no tenga una subred especificada recibirá una subred asignada secuencialmente a partir de este grupo. En algunas circunstancias, puede ser deseable utilizar un grupo de direcciones IP predeterminado diferente para las redes.
Por ejemplo, si el rango predeterminado 10.0.0.0/8 entra en conflicto con el espacio de direcciones ya asignado en tu red, es recomendable asegurarse de que las redes utilicen un rango diferente sin requerir que los usuarios de swarm especifiquen cada subred con la opción de comando --subnet.
Para configurar grupos de direcciones predeterminados personalizados, debes definirlos al inicializar el swarm utilizando la opción de línea de comandos --default-addr-pool. Esta opción utiliza la notación CIDR para definir la máscara de subred. Para crear el grupo de direcciones personalizado para Swarm, debes definir al menos un grupo de direcciones predeterminado y una longitud de máscara de subred opcional. Por ejemplo, para la máscara de subred 10.0.0.0/27, utiliza el valor 27.
Docker asigna direcciones de subred a partir de los rangos de direcciones especificados por la opción --default-addr-pool. Por ejemplo, la opción --default-addr-pool 10.10.0.0/16 indica que Docker asignará subredes a partir de ese rango de direcciones /16. Si no se especifica --default-addr-pool-mask-len o se establece explícitamente en 24, esto daría como resultado 256 redes /24 de la forma 10.10.X.0/24.
El rango de subred proviene de --default-addr-pool (como 10.10.0.0/16). El tamaño de 16 representa el número de redes que se pueden crear dentro de ese rango de grupo de direcciones predeterminado. La opción --default-addr-pool puede aparecer múltiples veces para proporcionar direcciones adicionales que docker utilizará para las subredes superpuestas.
El formato del comando es:
$ docker swarm init --default-addr-pool <IP range in CIDR> [--default-addr-pool <IP range in CIDR> --default-addr-pool-mask-length <CIDR value>]
El comando para crear un grupo de direcciones IP predeterminado con un /16 (clase B) para la red 10.20.0.0 se ve así:
$ docker swarm init --default-addr-pool 10.20.0.0/16
El comando para crear un grupo de direcciones IP predeterminado con un /16 (clase B) para las redes 10.20.0.0 y 10.30.0.0, y crear una máscara de subred de /26 para cada red se ve así:
$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool 10.30.0.0/16 --default-addr-pool-mask-length 26
En este ejemplo, docker network create -d overlay net1 dará como resultado 10.20.0.0/26 como la subred asignada para net1, y docker network create -d overlay net2 dará como resultado 10.20.0.64/26 como la subred asignada para net2. Esto continúa hasta que se agoten todas las subredes.
Consulta las siguientes páginas para más información:
- Redes de Swarm para más información sobre el uso del grupo de direcciones predeterminado.
- Referencia de la CLI de
docker swarm init[/reference/cli/docker/swarm/init/] para más detalles sobre la opción--default-addr-pool.
Configurar la dirección de anuncio (advertise address)
Los nodos administradores utilizan una dirección de anuncio para permitir que otros nodos del swarm accedan a la API de Swarmkit y a las redes superpuestas. Los demás nodos del swarm deben poder acceder al nodo administrador en su dirección de anuncio.
Si no especificas una dirección de anuncio, Docker comprueba si el sistema tiene una única dirección IP. Si es así, Docker utiliza esa dirección IP con el puerto de escucha predeterminado 2377. Si el sistema tiene múltiples direcciones IP, debes especificar la opción --advertise-addr correcta para permitir la comunicación entre administradores y las redes superpuestas:
$ docker swarm init --advertise-addr <MANAGER-IP>
También debes especificar la opción --advertise-addr si la dirección donde otros nodos acceden al primer nodo administrador no es la misma dirección que el administrador ve como propia. Por ejemplo, en una configuración en la nube que abarca diferentes regiones, los hosts tienen tanto direcciones internas para el acceso dentro de la región como direcciones externas que se utilizan para el acceso desde fuera de esa región. En este caso, especifica la dirección externa con --advertise-addr para que el nodo pueda propagar esa información a otros nodos que se conecten posteriormente.
Consulta la referencia de la CLI de docker swarm init [/reference/cli/docker/swarm/init/] para más detalles sobre la dirección de anuncio.
Ver el comando de unión o actualizar un token de unión de swarm
Los nodos requieren un token secreto para unirse al swarm. El token para nodos trabajadores es diferente del token para nodos administradores. Los nodos solo utilizan el token de unión en el momento en que se unen al swarm. Rotar el token de unión después de que un nodo ya se haya unido al swarm no afecta a su pertenencia al mismo. La rotación de tokens garantiza que los nuevos nodos que intenten unirse al swarm no puedan utilizar un token antiguo.
Para obtener el comando de unión, incluido el token de unión para nodos trabajadores, ejecuta:
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
Para ver el comando de unión y el token para nodos administradores, ejecuta:
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-59egwe8qangbzbqb3ryawxzk3jn97ifahlsrw01yar60pmkr90-bdjfnkcflhooyafetgjod97sz \
192.168.99.100:2377
Pasa la opción --quiet para imprimir únicamente el token:
$ docker swarm join-token --quiet worker
SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
Ten cuidado con los tokens de unión, ya que son los secretos necesarios para unirse al swarm. En particular, guardar un secreto en un sistema de control de versiones es una mala práctica, ya que permitiría a cualquiera con acceso al código fuente de la aplicación añadir nuevos nodos al swarm. Los tokens de los administradores son especialmente sensibles porque permiten que un nuevo nodo administrador se una y obtenga el control sobre todo el swarm.
Se recomienda rotar los tokens de unión en las siguientes circunstancias:
- Si un token se guardó por accidente en un sistema de control de versiones, chat de grupo o se imprimió accidentalmente en tus registros.
- Si sospechas que un nodo ha sido comprometido.
- Si deseas garantizar que ningún nodo nuevo pueda unirse al swarm.
Además, es una buena práctica implementar un programa de rotación regular para cualquier secreto, incluidos los tokens de unión del swarm. Se recomienda rotar los tokens al menos cada 6 meses.
Ejecuta swarm join-token --rotate para invalidar el token antiguo y generar uno nuevo. Especifica si deseas rotar el token para nodos trabajadores (worker) o administradores (manager):
$ docker swarm join-token --rotate worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \
192.168.99.100:2377
Más información
- Unir nodos a un swarm
- Referencia de línea de comandos de
swarm init[/reference/cli/docker/swarm/init/] - Tutorial del modo Swarm