Soc Òscar Mas i us vull ensenyar una eina que es diu Consul. Aquesta eina és una eina de la família de l'empresa Hashicorp i hem de ser sincers: no és de les eines més populars que te Hashicorp, però crec que és de les més útils en determinats entorns. Algunes de les eines famoses que ens podem trobar de Hashicorp poden ser:
- Terraform: la seva utilitat és desplegar entorns via codi (IaC)
 - Vagrant: creació d'entorns de proves en local mitjançant màquines virtuals
 - Vault: un bon lloc per guardar secrets
 - etc....
 
No em vull estendre amb els diferents productes que te Hashicorp, ja que són bastants i cadascun és molt diferent dels altres. Us aconsello que li doneu una ullada als diferents productes que ens ofereix aquesta empresa.
Què és HashiCorp Consul
Com he comentat al principi, en aquest cas ens centrarem en Consul. El primer que hem de dir de Consul, és que fa de "gestió i descobriment de serveis en entorns distribuïts". Crec que aquesta frase és massa complicada i m'agradaria explicar que és Consul, d'una manera més amena que amb la típica frase de llibre:
Consul és un sistema en el qual, quan un servei (servidor web, base de dades, access API, etc...) es dona d'alta, ell mateix es registra en Consul. De tal manera que si tres servidors webs estan funcionant i s'han registrat a Consul. Quan li preguntis a Consul que t'informi d'aquest servei, Consul et contestarà amb les dades necessàries per accedir als tres servidors (IP, port, etc...).
En el cas que un servidor deixi de comunicar-se amb Consul, sigui per decisió pròpia o per qualsevol altre motiu, ell donarà de baixa el servei i la següent consulta, t'informarà que només hi ha dos servidors (en comptes de tres).
Aquest sistema és molt útil, ja que pots tenir serveis en diferents ubicacions (Azure, On-Premise, AWS, etc....) o anar canviant de serveis, ports, etc.... i no has d'informar a ningú, ja que els serveis es registren automàticament a Consul i sempre li has de preguntar a Consul per saber on estan les coses.
Laboratori amb Consul
Ara que ja tenim clar per a què serveix i quina és la funcionalitat de Consul, el que farem és un petit laboratori, en el qual:
- Registrarem un servei de forma manual
 - Registrarem un servei de forma automàtica
 
Prerequisits
Abans de començar, necessitarem tenir desplegats dos equips. Un farà les funcionalitats de servidor de Consul i l'altra el farem servir de client.
- Hostname: consul -> té les funcionalitats de servidor
 - Hostname: consul-client -> farà de client per registrar un servei a Consul
 

Desplegament de Consul
Un cop clar els equips que formen aquest laboratori, hem de desplegar el sistema de Consul en el que farà les funcionalitats de servidor (equip: consul). En aquest cas, desplegarem Consul amb Docker Compose. La instal·lació s'ha fet el més senzill possible, ja que és un laboratori per entendre per què serveix el producte: Consul
root@consul:~# cat /etc/docker-compose/docker-compose.yaml
services:
consul:
container_name: consul
hostname: consul
image: hashicorp/consul:1.19
ports:
- "8400:8400"
- "8500:8500" # GUI/API
- "8600:8600" # DNS server
volumes:
- /etc/localtime:/etc/localtime:ro
root@consul:~# docker compose -f /etc/docker-compose/docker-compose.yaml up -d
Un cop aixecat els serveis via Docker Compose, revisaren que tenim accés a la GUI de Consul:

Registrem un servei: de forma manual
En aquest cas registrarem un servei de forma manual a Consul de la següent manera:
root@consul:~# docker exec -it consul consul services register -name=HTTP -address=http://web.ilba.cat -port=80
Un cop registrat, podrem veure en la GUI de Consul el resultat:
Registrem un servei: de forma automàtica
En aquest cas farem servir un servidor web (nginx) i el registrarem en Consul de forma automàtica:
root@consul-client:~# cat /etc/docker-compose/docker-compose.yaml
services:
consul-registrator:
container_name: consul-registrator
hostname: consul-registrator
image: gliderlabs/registrator:master
volumes:
- /var/run/docker.sock:/tmp/docker.sock
command: "-ip=172.26.0.34 consul://172.26.0.33:8500"
nginx:
container_name: nginx
hostname: nginx
image: nginx:1.27-bookworm
ports:
- "80:80"
volumes:
- /etc/localtime:/etc/localtime:ro
depends_on:
- consul-registrator
root@consul-client:~# docker compose -f /etc/docker-compose/docker-compose.yaml up -d
Un cop registrat el servei via Docker Compose al nostre servidor de Consul, revisarem via GUI que s'hagi registrat correctament el nostre servidor web:

Consultes a Consul
No podíem acabar el post, sense ensenyar-vos el resultat d'una consulta feta al servei de Consul. Aquesta consulta s'ha fet al servei que s'ha creat de manera manual:
root@consul-client:~# curl -s http://172.26.0.33:8500/v1/agent/service/HTTP
{
"ID": "HTTP",
"Service": "HTTP",
"Tags": [],
"Meta": {},
"Port": 80,
"Address": "http://web.ilba.cat",
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false,
"ContentHash": "b3279d556030b491",
"Datacenter": "dc1"
}
També li podríem fer una consulta directa, perquè ens mostri l'URL d'un servei en concret:
root@consul-client:~# apt update && apt -y install jq
root@consul-client:~# curl -s http://172.26.0.33:8500/v1/agent/service/HTTP | jq -r '.Address'
http://web.ilba.cat
Conclusions
HashiCorp Consul és una eina ideal per a entorns amb microserveis, contenidors i desplegaments multi-núvol, on la flexibilitat i l’automatització són essencials.
Espero que aquest petit laboratori us ajudi a començar i a entendre el seu funcionament bàsic o com a mínim hàgiu descobert un nou producte.
