Cómo Configurar Consul y Envoy para un Balanceador de Carga en Alta Disponibilidad

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

  1. Descubrimiento Automático de Servicios: Consul registra y descubre servicios automáticamente, mientras Envoy utiliza esta información para balancear la carga.
  2. Alta Disponibilidad y Resiliencia: Consul en clúster y Envoy distribuyendo tráfico aseguran que los servicios sigan operativos incluso ante fallos.
  3. Configuración Dinámica y Gestión de Tráfico: Ambos permiten ajustes y actualizaciones en tiempo real sin interrupciones.
  4. Monitoreo y Observabilidad: Proporcionan visibilidad completa del tráfico y el estado de los servicios.
  5. Seguridad y Segmentación de Red: Consul y Envoy juntos mejoran la seguridad con autenticación, autorización y segmentación de red.
  6. Integración y Flexibilidad: Se integran fácilmente con diversas herramientas y plataformas, adaptándose a diferentes entornos de TI.

Servidores

ServidorIPRol
srvlco01192.168.1.120Consul
srvlco02192.168.1.121Consul
srvlco03192.168.1.122Consul
srvlen01192.168.1.123Envoy
srvlen01192.168.1.124Envoy
srvlbck01192.168.1.150backend

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

  1. 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:

  1. 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.124. 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):

  1. 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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *