Configurando Consul en Producción

¿ Qué es Consul ?

HashiCorp Consul es una solución de red de servicios que permite a los equipos administrar la conectividad de red segura entre servicios y en entornos y tiempos de ejecución locales y de múltiples nubes. Consul ofrece descubrimiento de servicios, malla de servicios, gestión de tráfico y actualizaciones automatizadas para dispositivos de infraestructura de red. Puede utilizar estas funciones individualmente o juntas en una única implementación de Consul.

Consul proporciona un plano de control que le permite registrar, consultar y proteger los servicios implementados en su red. El plano de control es la parte de la infraestructura de la red que mantiene un registro central para rastrear los servicios y sus respectivas direcciones IP. Es un sistema distribuido que se ejecuta en clústeres de nodos, como servidores físicos, instancias en la nube, máquinas virtuales o contenedores. Aumenta la resiliencia de las aplicaciones, refuerza el tiempo de actividad, acelera la implementación de aplicaciones y mejora la seguridad en las comunicaciones entre servicios.

Consul utiliza identidades de servicio y prácticas de redes tradicionales para ayudar a las organizaciones a conectar de forma segura aplicaciones que se ejecutan en cualquier entorno.

Consul KV

KV de Consul es una de las funciones disponibles en Consul y tiene la capacidad de almacenar valores clave distribuidos. Se utiliza principalmente para configuración dinámica, señalización de funciones, coordinación, elección de líder y también tiene muchos otros usos además de estos. Su sencilla API HTTP hace que sea fácil de usar y puede considerarse como un estándar de la industria.

Instalación

Para instalar el binario precompilado, descarga el paquete adecuado para tu sistema:

* Descarga el archivo binario:

  {{wget https://releases.hashicorp.com/consul/1.10.3/consul_1.10.3_linux_amd64.zip}}

* También descarga el archivo SHA256SUMS para verificar la suma de comprobación correspondiente:

  {{wget https://releases.hashicorp.com/consul/1.10.3/consul_1.10.3_SHA256SUMS}}

* El archivo SHA256SUMS muestra la suma de comprobación correspondiente para este archivo:

  50afd45daaffd3af5ab67b03ff616117eca9961014ca0ef25ed2aaa27a7be698  consul_1.10.3_linux_amd64.zip

El siguiente comando debe proporcionarte la misma suma si descargaste la versión correcta del archivo:

sha256sum consul_1.10.3_linux_amd64.zip
50afd45daaffd3af5ab67b03ff616117eca9961014ca0ef25ed2aaa27a7be698  consul_1.10.3_linux_amd64.zip

Ahora que sabemos que el archivo ZIP no ha sido modificado, podemos descomprimirlo en un lugar que esté en tu ruta del sistema:

unzip ./consul_1.10.3_linux_amd64.zip
rm ./consul_1.10.3_linux_amd64.zip
mv consul /usr/bin/consul

Verifica que esté funcionando:

consul -v
Consul v1.10.3
Revisión c976ffd2d

El comando consul ofrece autocompletado opcional para banderas, sub-comandos y argumentos (donde sea compatible). Activa el autocompletado:

consul -autocomplete-install
complete -C /usr/bin/consul consul

Crea un usuario del sistema único y sin privilegios para ejecutar Consul y crea su directorio de datos:

useradd --system --home /etc/consul.d --shell /bin/false consul
mkdir --parents /opt/consul
chown --recursive consul:consul /opt/consul

Credenciales de Seguridad

Clave de Cifrado de Gossip

Gossip se cifra con una clave simétrica, ya que la comunicación entre nodos se realiza a través de UDP. Todos los agentes deben tener la misma clave de cifrado. Puedes crear la clave de cifrado a través de la CLI de Consul incluso si aún no se están ejecutando agentes de Consul. Genera la clave de cifrado:

consul keygen
qDOPBEr+/oUVeOFQOnVypxwDaHzLrD+lvjo5vCEBbZ0=

Necesitarás agregar la clave recién generada a la opción de cifrado en la configuración del servidor en todos los agentes de Consul. Guarda la clave en un lugar seguro, ya que la necesitarás durante la instalación.

Generar Certificados TLS para el Cifrado de RPC

Comienza creando la Autoridad de Certificación (CA) en tu instancia de administrador usando la CLI de Consul:

mkdir /opt/consul/certs
cd /opt/consul/certs
consul tls ca create

A continuación, crea un conjunto de certificados, uno para cada agente de Consul. Deberás seleccionar un nombre para tu centro de datos principal en este punto para que los certificados tengan nombres adecuados. Primero, para tus servidores de Consul, utiliza el siguiente comando para crear un certificado para cada servidor:

consul tls cert create -server -dc my_dc

Usa el siguiente comando con la bandera -client para crear certificados de cliente. El nombre del archivo aumenta automáticamente:

consul tls cert create -client -dc my_dc

Ahora debemos copiar los certificados a todos los servidores maestros (servidores) y servidores esclavos (clientes) en el directorio /etc/consul.d/:

mkdir -p /etc/consul.d/tsl
 
**Masters**
 
- consul-agent-ca.pem
- my_dc-server-consul-0-key.pem
- my_dc-server-consul-0.pem
 
**Minions**
 
- consul-agent-ca.pem
- my_dc-client-consul-0-key.pem
- my_dc-client-consul-0.pem

Configurar Consul

Crea un archivo de configuración para Consul:

touch /etc/consul.d/consul.hcl
chown --recursive consul:consul /etc/consul.d
chmod 640 /etc/consul.d/consul.hcl
nano /etc/consul.d/consul.hcl

Maestros

/etc/consul.d/consul.hcl
{{{
datacenter = "my_dc"
node_name = "consul-server"
client_addr = "0.0.0.0"
bind_addr = "172.217.160.110"
advertise_addr = "172.217.160.110"
server    = true
bootstrap = true
ui_config {
  enabled = true
}
data_dir   = "/opt/consul"
log_level  = "INFO"
addresses {
  http = "0.0.0.0"
}
ports {
  https = 8501
}
connect {
  enabled = true
}
key_file = "/etc/consul.d/my_dc-server-consul-0-key.pem"
cert_file = "/etc/consul.d/my_dc-server-consul-0.pem"
ca_file = "/etc/consul.d/consul-agent-ca.pem"
encrypt = "qDOPBEr+/oUVeOFQOnVypxwDaHzLrD+lvjo5vCEBbZ0="
verify_incoming = true
verify_outgoing = true
verify_server_hostname = true
retry_join = ["157.240.7.35"]
}}}

Minions

/etc/consul.d/consul.hcl
{{{
datacenter = "my_dc"
node_name = "consul-minion"
bind_addr = "157.240.7.35"
advertise_addr = "157.240.7.35"
server    = false
ui_config {
  enabled = false
}
data_dir   = "/opt/consul"
log_level  = "INFO"
addresses {
  http = "0.0.0.0"
}
ports {
  https = 8501
}
connect {
  enabled = true
}
key_file = "/etc/consul.d/my_dc-client-consul-0-key.pem"
cert_file = "/etc
 
/consul.d/my_dc-client-consul-0.pem"
ca_file = "/etc/consul.d/consul-agent-ca.pem"
encrypt = "qDOPBEr+/oUVeOFQOnVypxwDaHzLrD+lvjo5vCEBbZ0="
verify_incoming = true
verify_outgoing = true
verify_server_hostname = true
}}}

Puertos

Consul requiere hasta 6 puertos diferentes para funcionar correctamente, algunos en TCP, UDP o ambos protocolos. A continuación, documentamos los requisitos para cada puerto:

Uso Puertos Predeterminados
DNS 8600 (servidor DNS, TCP y UDP)
API HTTP 8500 (API HTTP, TCP solamente)
API HTTPS Desactivado por defecto (8501)*
API gRPC Desactivado por defecto (8502)*
Serf LAN 8301 (puerto de comunicación LAN de Serf, TCP y UDP)
Serf WAN 8302 (puerto de comunicación WAN de Serf, TCP y UDP)
RPC del servidor 8300 (dirección RPC del servidor, TCP solamente)
Proxy de Sidecar Min Puerto mínimo inclusivo para las asignaciones automáticas de registros de servicios de Sidecar. 21000
Proxy de Sidecar Max Número de puerto máximo inclusivo para las asignaciones automáticas de registros de servicios de Sidecar. 21255
Para HTTPS y gRPC, los puertos especificados en la tabla son recomendaciones.

Estos puertos se utilizan para:

  1. DNS: Se utiliza para resolver consultas DNS.
  2. API HTTP: Se utiliza para que los clientes se comuniquen con la API HTTP.API HTTPS (Opcional): Está desactivada de forma predeterminada, pero el puerto 8501 es una convención utilizada por varias herramientas como el valor predeterminado.
  3. API gRPC (Opcional): Actualmente, gRPC se utiliza solo para exponer la API xDS a los proxies Envoy. Está desactivada de forma predeterminada, pero el puerto 8502 es una convención utilizada por varias herramientas. El valor predeterminado es 8502 en el modo -dev.

Abre los puertos necesarios en el firewall:

firewall-cmd --permanent --zone=public --add-port=8301/tcp --add-port=8301/udp --add-port=8302/tcp --add-port=8302/udp
firewall-cmd --reload
firewall-cmd --zone=public --list-all

O, si estás utilizando UFW:

ufw allow 8301
ufw allow 8302
ufw reload
ufw status

Ejecución como Servicio

Crea un archivo de servicio para Consul:

nano /usr/lib/systemd/system/consul.service

o

nano /usr/lib/systemd/user/consul.service

Añade esta configuración al archivo de servicio de Consul:

/usr/lib/systemd/user/consul.service
[Unit]
Description="HashiCorp Consul"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/consul.d/consul.hcl
 
[Service]
Type=notify
User=consul
Group=consul
ExecStart=/usr/bin/consul agent -config-dir=/etc/consul.d/
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

Verifica que tu archivo de configuración sea válido con el comando `validate` de Consul CLI:

consul validate /etc/consul.d/consul.hcl

Habilita y inicia Consul usando el comando systemctl:

systemctl enable --now consul
service consul status

Configurar Variables de Entorno de Consul

Maestros

export CONSUL_CACERT=/etc/consul.d/consul-agent-ca.pem
export CONSUL_CLIENT_CERT=/etc/consul.d/my_dc-server-consul-0.pem
export CONSUL_CLIENT_KEY=/etc/consul.d/my_dc-server-consul-0-key.pem

Minions

export CONSUL_CACERT=/etc/consul.d/consul-agent-ca.pem
export CONSUL_CLIENT_CERT=/etc/consul.d/my_dc-client-consul-0.pem
export CONSUL_CLIENT_KEY=/etc/consul.d/my_dc-client-consul-0-key.pem

Habilitar ACL en Consul

Añade la configuración de ACL al archivo de configuración consul.hcl y elige una política predeterminada de “allow” (permitir todo el tráfico a menos que se niegue explícitamente) o “deny” (denegar todo el tráfico a menos que se permita explícitamente).

acl = {
  enabled = true
  default_policy = "allow"
  enable_token_persistence = true
}
performance {
  raft_multiplier = 1
}

Genera el Token de Inicio de Sesión de Bootstrap desde tu servidor maestro:

consul acl bootstrap

Esto devolverá el token de inicio de sesión de Bootstrap de Consul. Necesitarás el SecretID para todas las solicitudes posteriores de la API de Consul (incluidas CLI y la interfaz de usuario). Asegúrate de guardar el SecretID.

Establece la variable de entorno CONSUL_MGMT_TOKEN:

export CONSUL_HTTP_TOKEN="<SecretID del Token de Inicio de Sesión>"
export CONSUL_MGMT_TOKEN="<SecretID del Token de Inicio de Sesión>"

Crea un archivo de política de nodo con acceso de escritura para acciones relacionadas con nodos y acceso de lectura para acciones relacionadas con servicios:

mkdir /etc/consul.d/policies
nano /etc/consul.d/policies/node-policy.hcl
node-policy.hcl
agent_prefix "" {
  policy = "write"
}
node_prefix "" {
  policy = "write"
}
service_prefix "" {
  policy = "read"
}
session_prefix "" {
  policy = "read"
}

Genera la política de ACL de nodo de Consul con el archivo de política recién creado:

cd /etc/consul.d/policies
consul acl policy create \
  -token=${CONSUL_MGMT_TOKEN} \
  -name node-policy \
  -rules @node-policy.hcl

Crea el token de nodo con la política recién creada:

consul acl token create \
  -token=${CONSUL_MGMT_TOKEN} \
  -description "node token" \
  -policy-name node-policy

En todos los servidores de Consul, agrega el token de nodo:

consul acl set-agent-token \
  -token="<SecretID del Token de Administración>" \
  agent "<SecretID del Token de Nodo>"

Interfaz de Usuario de Consul

Si no has reenviado el puerto HTTP, aún puedes probar la interfaz de usuario de Consul túnelizando la interfaz de usuario a través de SSH en tu servidor local:

ssh myuser@my-server-ip -p puerto-ssh -L8500:localhost:8500

Accede a la pestaña “Nodes” y deberías ver ambos servidores maestros y servidores esclavos conectados:

http://localhost:8500/ui/my_dc/nodes
/home/mrosero/web/mauro.rosero.one/public_html/data/gitrepo/pages/notes/infraestructure/hconsul.txt · Última modificación: 2023/11/14 18:05 por mrosero
CC Attribution-Noncommercial 4.0 International Excepto donde se indique lo contrario, el contenido de este wiki esta bajo la siguiente licencia: CC Attribution-Noncommercial 4.0 International