jueves, 1 de marzo de 2018

Docker (6) : Swarns

1. Introducción. Swarn, swarn manager, node, worker

Estamos siguiendo las instrucciones de docs-docker.

Un "swarn" es un grupo de múltiples máquinas formando un cluster "dockerizado". Así una aplicación puede ser multi-container y multi-máquina.

Un "swarn" es un grupo de máquinas que están corriendo Docker y están unido formando un cluster.
Hay un "swarn manager" que ejecuta los comandos de docker. Las máquinas del "swarn" pueden ser físicas o lógicas. Después de unirse a un swarn, se les referirá como "nodes".

Los swarn managers son las únicas máquinas que pueden ejecutar órdenes docker. Tambien pueden autorizar a otras máquinas a unirse al swarn como "workers", sin que estas tengan la autoridad de un swarn manager frente a otras máquinas.

Docker puede correr en una máquina o varias máquinas (swarm mode). En este modo, nuestra máquina actua como swarm manager.

2. Prerequisito :Instalar Docker Compose

Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multi-container. Se configura con YAML.

Descargamos el producto

sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Damos permisos de ejecución a los binarios

sudo chmod +x /usr/local/bin/docker-compose

Opcionalmente si utilizamos la bash podemos instalar el command completion que se instalara en /etc/bash_completion.d/ 

sudo curl -L https://raw.githubusercontent.com/docker/compose/1.19.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

Basta con abrit un nuevo terminal para que funcione



3. Prerequisito :Instalar docker-machine

Para ello nos bajamos el software:

curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
sudo install /tmp/docker-machine /usr/local/bin/docker-machine

Comprobamos la instalación:

docker-machine version

Y sale:

docker-machine version 0.13.0, build 9ba6da9


4. Configurar el swarm

Para permitir el "swarm mode" y que nuestra máquina sea un "swarm manager":

docker swarm init

y que otras máquinas se unan como "workers" , se ejecuta en cada máquina (no olvidar el puntito):
docker swarm join .
Debemos tener instalado el Virtual Box de Oracle y creamos 2 máquinas virtuales myvm1 y myvm2
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

Y para la primera contesta:


Creating CA: /home/eduard/.docker/machine/certs/ca.pem
Creating client certificate: /home/eduard/.docker/machine/certs/cert.pem
Running pre-create checks...
(myvm1) Image cache directory does not exist, creating it at /home/eduard/.docker/machine/cache...
(myvm1) No default Boot2Docker ISO found locally, downloading the latest release...
(myvm1) Latest release for github.com/boot2docker/boot2docker is v17.12.1-ce
(myvm1) Downloading /home/eduard/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v17.12.1-ce/boot2docker.iso...
(myvm1) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(myvm1) Copying /home/eduard/.docker/machine/cache/boot2docker.iso to /home/eduard/.docker/machine/machines/myvm1/boot2docker.iso...
(myvm1) Creating VirtualBox VM...
(myvm1) Creating SSH key...
(myvm1) Starting the VM...
(myvm1) Check network to re-create if needed...
(myvm1) Found a new host-only adapter: "vboxnet0"
Error creating machine: Error in driver during machine creation: This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory

Como vemos sale un error que nos dice que hay que permitir el VT-x. Para ello rearrancamos el ordenador, entramos en la BIOS: Security-System Security- VT-x le damos a enable.

Voy a eliminar las máquinas:

docker-machine rm myvm1
docker-machine rm myvm2

Para listar las máquinas para ver si se han eliminado:

docker-machine ls
Y vuelvo a repetir los pasos para crear otra vez las máquinas



docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
Y para la primera máquina sale:


Running pre-create checks...
Creating machine...
(myvm1) Copying /home/eduard/.docker/machine/cache/boot2docker.iso to /home/eduard/.docker/machine/machines/myvm1/boot2docker.iso...
(myvm1) Creating VirtualBox VM...
(myvm1) Creating SSH key...
(myvm1) Starting the VM...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env myvm1

Para listar las máquinas

docker-machine ls
Y sale:


NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.102:2376           v17.12.1-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.103:2376           v17.12.1-ce   

Como vemos, las máquinas estan corriendo sin errores.


5. Inicializar el swarm y añadir nodes

La primera máquina actuará de "manager" y la segunda de "worker".

Vamos a decirle a la primera máquina que sea manager, para ello le enviamos la orden

docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.102:2376"

Donde:

  • docker-mashine ssh se utiliza para enviar comandos a una máquina
  • docker swarm init .. es para hacerla manager
  • 192.168.00.102:2376 es la URL de la primera máquina
Contesta:


Swarm initialized: current node (766cvl4wmayrwn7ly1tk92oi8) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1yww21r6dv1ex4c48sumuahaqdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2376

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Dándonos el comando para añadir la segunda máquina como worker. Y ejecutamos el código amarillo pero enviándoselo por ssh a myvm2:

docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-1yww21r6dv1ex4c48sumuahaqdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2376"
Y contesta:


Error response from daemon: rpc error: code = Internal desc = connection error: desc = "transport: remote error: tls: bad certificate"
exit status 1

Y según este link, hay que cambiar el puerto 2376 por 2377 y funciona

docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-1yww21r6dv1ex4c48sumuahaqdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2377"
Contestando:


qdyuxigxncalcj0j8mg5mudpre-d0rrehv96j8qc5xa7z61vji3p 192.168.99.102:2377"
This node joined a swarm as a worker.


Si se quiere salir del swarn se puede teclear para cada nodo.

docker swarn leave

6. Desplegar la aplicacion en el swarm cluster

Para ejecutar comandos en una máquina virtual hacíamos uso de docker-mashine ssh, Pero ahora vamos a utilizar otra opción que es docker-mashine env <machine> , que nos pormite utilizar ficheros de configuración docker-compose.yml, para desplegar la aplicacion de forma remota sin tenerla que copiar a ninguna parte.

Vamos a ejecutar

 docker-machine env myvm1
y contesta:


export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.102:2376"
export DOCKER_CERT_PATH="/home/eduard/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell: 
# eval $(docker-machine env myvm1)

Y ejecutamos la orden de amarillo:

eval $(docker-machine env myvm1)

Y comprobamos que myvm1 es la máquina activa ya que tiene el asterisco


docker-machine ls


NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.102:2376           v17.12.1-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.103:2376           v17.12.1-ce 

Vamos a desplegar la aplicación en el swarm manager. Para ello sabemos que el comando docker stack deploy despliega las aplicaciones, y tenemos un fichero de configuración docker-compose.yml . Tenemos nuestra maquina myvm1 activa. Nos situamos en el directorio donde reside el docker-compose.yml y ejecutamos


docker stack deploy -c docker-compose.yml getstartedlab
y nos contesta:


Creating network getstartedlab_webnet
Creating service getstartedlab_web

Veamos como se ejecuta:

docker stack ps getstartedlab

Y vemos que los servicios se distribuyen en ambas máquinas


ID                  NAME                  IMAGE                         NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
lf3vepnhivp4        getstartedlab_web.1   ximodante/get-started:part2   myvm2               Running             Running 7 minutes ago                       
s0y522grwgyp        getstartedlab_web.2   ximodante/get-started:part2   myvm1               Running             Running 7 minutes ago                       
p6l9njwxhbrx        getstartedlab_web.3   ximodante/get-started:part2   myvm2               Running             Running 7 minutes ago                       
3phjbcb63xx8        getstartedlab_web.4   ximodante/get-started:part2   myvm1               Running             Running 7 minutes ago                       
o6um4bt8aoen        getstartedlab_web.5   ximodante/get-started:part2   myvm2               Running             Running 7 minutes ago                       

Vamos a acceder al cluster, ya sea por la dirección IP de myvm1 o myvm2, todas repiten las 5 instancias cíclicamente de hostname cuando refrescamos el navegador, demostrando la carga balanceada. Se dice pues que hay un "routing mesh"



Si ahora cambiamos el docker-compose.yml para cambiar el comportamiento del programa, al igual que hicimos en un post anterior hacemos


docker stack deploy -c docker-compose.yml getstartedlab
Podemos unir todas las máquinas que queramos con el docker swarn join, y a continuación hacer desplegarlas con docker-stack deploy anterior .

7. Parar el swarm y eliminarlo

Para parar el swarm ejecutamos:

docker stack rm getstartedlab

Para eliminar el swarm, tras haberlo parado en elpunto anterior:

Ejecutamos para el "worker":

docker-machine ssh myvm2 "docker swarm leave"
Ejecutamos para el "manager":

docker-machine ssh myvm1 "docker swarm leave --force"

Si queremos eliminar las variables de entorno de nuestra shell ejecutamos

eval $(docker-machine env -u)
Cosa que desconecta la shell de las máquinas virtuales creadas con "docker-machine create", y nos permite continuar trabajando con la misma shell, pero ahora usando los comandos "docker"

Si queremos rearrancar la máquinas docker ejecutamos:

docker-machine start <machine-name>

8. Cheat sheet

Ahí va un resumen:

docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1                # View basic information about your node
docker-machine ssh myvm1 "docker node ls"         # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect <node ID>"        # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker"   # View join token
docker-machine ssh myvm1   # Open an SSH session with the VM; type "exit" to end
docker node ls                # View nodes in swarm (while logged on to manager)
docker-machine ssh myvm2 "docker swarm leave"  # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
docker-machine start myvm1            # Start a VM that is currently not running
docker-machine env myvm1      # show environment variables and command for myvm1
eval $(docker-machine env myvm1)         # Mac command to connect shell to myvm1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression   # Windows command to connect shell to myvm1
docker stack deploy -c <file> <app>  # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"   # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
eval $(docker-machine env -u)     # Disconnect shell from VMs, use native docker
docker-machine stop $(docker-machine ls -q)               # Stop all running VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images

No hay comentarios :

Publicar un comentario