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:
- DNS: Se utiliza para resolver consultas DNS.
- 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.
- 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