Instalar cluster docker (swarm) + portainer.io

Ésta semana y la anterior estoy con un curso de DevOPs. En él estamos viendo principalmente docker y los orquestadores swarm y kubernetes.
En éste post nos vamos a centrar de momento con swarm.

Swarm viene “instalado” cuando instalamos docker y no tendremos que instalar nada addicional, simplemente configurarlo que lo veremos mas adelante.

Primero de todo pues tendremos que instalar docker, pero no usaremos los paquetes del repositorio, sino que vamos a seguir la instalación de la página web de docker para debian.

El entorno donde vamos a instalar docker van a ser 3 máquinas virtuales con KVM, docker-master (172.31.0.201), docker-worker1 (172.31.0.202) y docker-worker2 (172.31.0.203). La instalación la repetimos en las 3 máquinas.

Instalar docker

Comprobamos que docker no esté instalado y si lo está, lo desinstalamos

root@docker-master:~# apt update && apt -y upgrade && apt -y dist-upgrade
root@docker-master:~# apt-get remove docker docker-engine docker.io containerd runc

Instalamos las dependencias necesarias

root@docker-master:~# apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Añadimos la clave GPG

root@docker-master:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
root@docker-master:~# apt-key fingerprint 0EBFCD88

Configuramos el repositorio “stable”

root@docker-master:~#  add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

Instalamos docker

root@docker-master:~# apt update
root@docker-master:~# apt-get install docker-ce docker-ce-cli containerd.io

A partir de aquí ya tenemos docker instalado y procederemos a montar el cluster swarm.

Activar cluster swarm

A continuación, montaremos 1 master y 2 workers. La recomendación es tener mínimo 3 master y 3 workers. En swarm, un master puede actuar como worker. De momento en el entorno que estamos montando nos limitaremos a 3 nodos, docker-master, docker-worker1 y docker-worker2.

En el master vamos a ejecutar lo siguiente:

root@docker-master:~# docker swarm init --advertise-addr 172.31.0.201
Swarm initialized: current node (gsfmiqxfi2kzw4u4yc9t2rexd) is now a manager.

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

    docker swarm join --token SWMTKN-1-563paqeb74nfn8fyaef0hgfptycdp61e0xn2jnq0737i4c3nos-************************* 172.31.0.201:2377

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

La ip que pondremos será la ip que será accesible desde los worker.
Si nos equivocamos, para eliminar la configuración de swarm, vamos a eleminar el directorio /var/lib/docker/swarm y reiniciamos docker

root@docker-master:~# rm -R /var/lib/docker/swarm
root@docker-master:~# systemctl restart docker

Y ejecutamos lo siguiente en los dos worker

root@docker-worker1:~# docker swarm join --token SWMTKN-1-563paqeb74nfn8fyaef0hgfptycdp61e0xn2jnq0737i4c3nos-************************* 172.31.0.201:2377
This node joined a swarm as a worker.
root@docker-worker2:~# docker swarm join --token SWMTKN-1-563paqeb74nfn8fyaef0hgfptycdp61e0xn2jnq0737i4c3nos-************************* 172.31.0.201:2377
This node joined a swarm as a worker.

Para comprobar que el cluster se ha montado correctamente hacemos usamos docker node ls

root@docker-master:~# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
gsfmiqxfi2kzw4u4yc9t2rexd *   docker-master       Ready               Active              Leader              19.03.13
m465hzbhhra0a9p82t03h8tjb     docker-worker1      Ready               Active                                  19.03.13
cxsxa45st0xhyra5gjf7oi52n     docker-worker2      Ready               Active                                  19.03.13

Desde aquí podemos administrar el cluster docker-swarm, pero nos podrá interesar instalar un entorno gui/web para gestionar el orquestador, en éste caso portainer.io.

TODO
https://www.portainer.io/installation/ (swarm != standalone)

  120  cd /
  121  mkdir portainer
  122  curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
  123  cat portainer-agent-stack.yml 
  124  docker stack deploy --compose-file=portainer-agent-stack.yml portainer
  125  docker stack ls
  126  docker stack ps portainer 
  127  docker service ps portainer_agent 
  128  docker service ps portainer_portainer 
root@docker-master:~# cd
root@docker-master:~# mkdir portainer
root@docker-master:~# cd portainer/
root@docker-master:~/portainer# ls
root@docker-master:~/portainer# curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   757  100   757    0     0    124      0  0:00:06  0:00:06 --:--:--   156
root@docker-master:~/portainer# ls
portainer-agent-stack.yml
root@docker-master:~/portainer# vi portainer-agent-stack.yml 
root@docker-master:~/portainer# docker stack deploy --compose-file=portainer-agent-stack.yml portainer
Creating network portainer_agent_network
Creating service portainer_agent
Creating service portainer_portainer
root@docker-master:~/portainer# docker stack ls
NAME                SERVICES            ORCHESTRATOR
portainer           2                   Swarm
root@docker-master:~/portainer# docker stack ps portainer 
ID                  NAME                                        IMAGE                           NODE                DESIRED STATE       CURRENT STATE              ERROR               PORTS
ubu2un4081no        portainer_agent.h8npmjp902itkgbc1o4h7rbbn   portainer/agent:latest          docker-worker2      Running             Preparing 22 seconds ago                       
vrmlh4cqggua        portainer_agent.jqk9vb4dz5fk8o7e3uup9nxqw   portainer/agent:latest          docker-worker1      Running             Preparing 22 seconds ago                       
s16d83o5fylx        portainer_agent.nty1ejqatx2fsgpb6veclsqi9   portainer/agent:latest          docker-master       Running             Preparing 22 seconds ago                       
v0btdrwwjhr7        portainer_portainer.1                       portainer/portainer-ce:latest   docker-master       Running             Preparing 21 seconds ago                       
root@docker-master:~/portainer# docker service ps portainer_agent 
ID                  NAME                                        IMAGE                    NODE                DESIRED STATE       CURRENT STATE              ERROR               PORTS
ubu2un4081no        portainer_agent.h8npmjp902itkgbc1o4h7rbbn   portainer/agent:latest   docker-worker2      Running             Preparing 32 seconds ago                       
vrmlh4cqggua        portainer_agent.jqk9vb4dz5fk8o7e3uup9nxqw   portainer/agent:latest   docker-worker1      Running             Preparing 32 seconds ago                       
s16d83o5fylx        portainer_agent.nty1ejqatx2fsgpb6veclsqi9   portainer/agent:latest   docker-master       Running             Preparing 32 seconds ago                       
root@docker-master:~/portainer# docker service ps portainer_portainer 
ID                  NAME                        IMAGE                           NODE                DESIRED STATE       CURRENT STATE           ERROR                       PORTS
q99tmtqpgxff        portainer_portainer.1       portainer/portainer-ce:latest   docker-master       Ready               Ready 3 seconds ago                                 
0wwk8k45ju66         \_ portainer_portainer.1   portainer/portainer-ce:latest   docker-master       Shutdown            Failed 4 seconds ago    "task: non-zero exit (1)"   
v0btdrwwjhr7         \_ portainer_portainer.1   portainer/portainer-ce:latest   docker-master       Shutdown            Failed 13 seconds ago   "task: non-zero exit (1)"   

Ésto nos va a levantar el servicio de portainer en el puerto 9000, al entrar nos va a pedir definir un nombre de usuario y contraseña, una vez realizado accederemos al panel web de portainer

Y de momento dejo éste post aquí ;) en próximos post explicaciones de como desplegar Dockerfile y docker-compose.

Gracias Alberto Garcia F. por el curso :)

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.