En un mundo donde la alta disponibilidad y la resiliencia de los servicios son esenciales, Consul y Envoy se destacan como una combinación poderosa para gestionar el tráfico de red de manera eficiente. En esta entrada, explicaremos cómo instalar y configurar Consul y Envoy para crear un balanceador de carga en alta disponibilidad, aprovechando sus fortalezas en el descubrimiento de servicios, balanceo de carga y monitoreo.
¿Qué son Consul y Envoy?
Consul es una herramienta de HashiCorp diseñada para el descubrimiento de servicios, la configuración y la orquestación. Ofrece funcionalidades clave como:
- Descubrimiento Automático de Servicios: Facilita que los servicios se encuentren y se comuniquen automáticamente.
- Supervisión y Salud de los Servicios: Realiza chequeos de salud para asegurar que solo los servicios operativos sean utilizados.
- KV Store: Almacena configuraciones dinámicas y datos clave.
- Alta Disponibilidad: Soporta clústeres de múltiples nodos, permitiendo tolerancia a fallos.
Envoy es un proxy de servicio de alto rendimiento desarrollado por Lyft, ideal para arquitecturas de microservicios. Sus principales características incluyen:
- Proxy Inverso y Balanceador de Carga: Distribuye el tráfico entre múltiples instancias de servicio.
- Telemetría y Observabilidad: Proporciona métricas detalladas y registros para monitoreo.
- Configuración Dinámica: Permite ajustes de configuración en tiempo real sin reinicios.
Ventajas de Combinar Consul y Envoy
- Descubrimiento Automático de Servicios: Consul registra y descubre servicios automáticamente, mientras Envoy utiliza esta información para balancear la carga.
- Alta Disponibilidad y Resiliencia: Consul en clúster y Envoy distribuyendo tráfico aseguran que los servicios sigan operativos incluso ante fallos.
- Configuración Dinámica y Gestión de Tráfico: Ambos permiten ajustes y actualizaciones en tiempo real sin interrupciones.
- Monitoreo y Observabilidad: Proporcionan visibilidad completa del tráfico y el estado de los servicios.
- Seguridad y Segmentación de Red: Consul y Envoy juntos mejoran la seguridad con autenticación, autorización y segmentación de red.
- Integración y Flexibilidad: Se integran fácilmente con diversas herramientas y plataformas, adaptándose a diferentes entornos de TI.
Servidores
Servidor | IP | Rol |
---|---|---|
srvlco01 | 192.168.1.120 | Consul |
srvlco02 | 192.168.1.121 | Consul |
srvlco03 | 192.168.1.122 | Consul |
srvlen01 | 192.168.1.123 | Envoy |
srvlen01 | 192.168.1.124 | Envoy |
srvlbck01 | 192.168.1.150 | backend |
Instalación de Consul y Envoy
A continuación, te mostramos cómo instalar y configurar Consul y Envoy en un entorno de alta disponibilidad.
Paso 1: Instalar Consul
- Actualizar los paquetes:
sudo apt update
sudo apt upgrade -y
Instalar software requerido
apt install wget unzip
Descargar e instalar Consul:
- Descarga la última versión de Consul desde HashiCorp.
- Descomprime el archivo y mueve el binario a
/usr/local/bin
:
wget https://releases.hashicorp.com/consul/1.19.0/consul_1.19.0_linux_amd64.zip
unzip consul_1.10.0_linux_amd64.zip
sudo mv consul /usr/local/bin/
Crear el directorio de configuración:
sudo mkdir -p /etc/consul.d
sudo mkdir -p /var/lib/consul
Configurar Consul:
- Crear el archivo de configuración de Consul:
sudo vi /etc/consul.d/consul.hcl
node srvlco01
server = true
bootstrap_expect = 3
data_dir = "/var/lib/consul"
log_level = "INFO"
node_name = "srvlco01"
bind_addr = "192.168.1.120"
client_addr = "0.0.0.0"
retry_join = ["192.168.1.121", "192.168.1.122"]
connect {
enabled = true
}
node srvlco02
cat /etc/consul.d/consul.hcl
server = true
bootstrap_expect = 3
data_dir = "/var/lib/consul"
log_level = "INFO"
node_name = "srvlco02"
bind_addr = "192.168.1.121"
client_addr = "0.0.0.0"
retry_join = ["192.168.1.120", "192.168.1.122"]
connect {
enabled = true
}
node srvlco03
cat /etc/consul.d/consul.hcl
server = true
bootstrap_expect = 3
data_dir = "/var/lib/consul"
log_level = "INFO"
node_name = "srvlco03"
bind_addr = "192.168.1.122"
client_addr = "0.0.0.0"
retry_join = ["192.168.1.120", "192.168.1.121"]
connect {
enabled = true
}
Habilitar la Interfaz de Usuario de Consul
Para habilitar la interfaz de usuario de Consul, sigue estos pasos:
- Editar el Archivo de Configuración del Agente Consul:Accede al servidor donde tienes instalado Consul y encuentra el archivo de configuración del agente Consul. El archivo de configuración generalmente se encuentra en
/etc/consul/consul.json
o/etc/consul.d/config.json
.
sudo vi /etc/consul.d/config.json
Modificar la Configuración para Habilitar la UI:
Dentro del archivo de configuración, asegúrate de que la siguiente configuración esté presente y configurada correctamente:
{
"ui_config": {
"enabled": true
}
}
Registro del Servicio backend
El servicio backend
está registrado en Consul para ser descubierto y monitoreado:
- Archivo de Configuración
backend.json
:
sudo vi /etc/consul.d/backend.json
- Añadir
{
"service": {
"name": "backend",
"tags": [],
"port": 80,
"check": {
"http": "http://192.168.1.150:80",
"interval": "10s"
}
}
}
Descripción: Este archivo define el servicio backend
que corre en el puerto 80 en la dirección IP 192.168.1.150
. El chequeo de salud se realiza cada 10 segundos mediante una solicitud HTTP a la ruta especificada.
Registro del Servicio:
consul services register /etc/consul.d/backend.json
Descripción: Registra el servicio backend
en Consul usando el archivo de configuración backend.json
. Esto permite que otros servicios descubran y se conecten al backend a través de Consu
Registro del Servicio Envoy
El servicio envoy
actúa como un proxy y también está registrado en Consul para la detección y monitoreo:
- Archivo de Configuración
srvlen01.json
:
sudo vi /etc/consul.d/srvlen01.json
añadir
{
"service": {
"name": "envoy",
"tags": ["proxy"],
"port": 10000,
"check": {
"http": "http://192.168.1.123:10000/",
"interval": "10s"
}
}
}
Descripción: Este archivo define el servicio envoy
que actúa como proxy y escucha en el puerto 10000 en la dirección IP 192.168.1.123
. Se realiza un chequeo de salud cada 10 segundos mediante una solicitud HTTP a la ruta especificada.
Registro del Servicio envoy
:
consul services register /etc/consul.d/srvlen01.json
Descripción: Registra el servicio envoy
en Consul usando el archivo de configuración srvlen01.json
. Esto permite que otros servicios descubran y se conecten al proxy Envoy en la dirección IP especificada.
- Archivo de Configuración
srvlen02.json
:
sudo vi /etc/consul.d/srvlen02.json
añadir
{
"service": {
"name": "envoy",
"tags": ["proxy"],
"port": 10000,
"check": {
"http": "http://192.168.1.124:10000/",
"interval": "10s"
}
}
}
Descripción: Este archivo define el servicio envoy
que actúa como proxy y escucha en el puerto 10000 en la dirección IP 192.168.1.12
4. Se realiza un chequeo de salud cada 10 segundos mediante una solicitud HTTP a la ruta especificada.
Registro del Servicio envoy
:
consul services register /etc/consul.d/srvlen02.json
Descripción: Registra el servicio envoy
en Consul usando el archivo de configuración srvlen02.json
. Esto permite que otros servicios descubran y se conecten al proxy Envoy en la dirección IP especificada.
Crear archivo de servicio systemd para Consul:
sudo vi /etc/systemd/system/consul.service
- Añadir
[Unit]
Description=Consul Agent
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
2. Configuración de Envoy y Servicios
En cada uno de los nodos de servicios (srvlen01
,srvlen02):
- Instalar Envoy:
sudo apt update
sudo apt install debian-keyring debian-archive-keyring apt-transport-https curl lsb-release
curl -sL 'https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key' | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
sudo apt update
sudo apt install getenvoy-envoy
Registrar servicios en Consul (opcional, si los servicios no se registran automáticamente):
sudo vi /etc/consul.d/web.json
- Añadir:
{
"service": {
"name": "web",
"tags": ["http"],
"port": 80
}
}
Configurar Envoy:
sudo vi /etc/envoy/envoy.yaml
- Añadir:
udo cat /etc/envoy/envoy.yaml
admin:
access_log_path: "/dev/null"
address:
socket_address:
address: 0.0.0.0
port_value: 9901
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: service_cluster
timeout: 15s
max_stream_duration:
max_stream_duration:
seconds: 15
nanos: 0
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: service_cluster
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 192.168.1.150
port_value: 80
Crear archivo de servicio systemd para Envoy:
sudo vi /etc/systemd/system/envoy.service
- Añade
[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/envoy -c /etc/envoy/envoy.yaml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
Crea el directorio de los logs
sudo mkdir /var/log/envoy/
Iniciar y habilitar Envoy:
sudo systemctl enable envoy
sudo systemctl start envoy
sudo systemctl status envoy
Verificación y Monitoreo
Para verificar que Consul y Envoy están funcionando correctamente:
- Accede a la interfaz web de Consul en
http://<consul-server-ip>:8500
para comprobar los servicios registrados y su estado.
- Prueba el balanceador de carga con Envoy utilizando
curl
u otra herramienta para asegurarte de que redirige el tráfico correctamente entre los servicios backend registrados.
curl -i http://192.168.1.124:10000
HTTP/1.1 200 OK
server: envoy
date: Tue, 18 Jun 2024 15:34:47 GMT
content-type: text/html
content-length: 16
last-modified: Tue, 18 Jun 2024 15:34:21 GMT
etag: "6671a8fd-10"
accept-ranges: bytes
x-envoy-upstream-service-time: 1
RED-ORBITA.COM
:wq!