Planificación de la Arquitectura del Clúster
Para sistemas de recolección de logs de escala media, una topología básica compuesta por Filebeat, Elasticsearch y Kibana suele ser suficiente. Sin embargo, para entornos de alta concurrencia y procesamiento complejo, se recomienda integrar Kafka como búfer de mensajes y Logstash para la transformación de datos. A continuación, se detalla la distribución de servicios en un clúster de tres nodos:
- elastic-node-01 (10.0.1.11): Elasticsearch (Master/Data), Kibana, Zookeeper, Kafka.
- elastic-node-02 (10.0.1.12): Elasticsearch (Data), Logstash, Zookeeper, Kafka.
- elastic-node-03 (10.0.1.13): Elasticsearch (Data), Zookeeper, Kafka.
Nota: La configuración detallada del clúster de Kafka y Zookeeper se omite en esta guía para centrarse estrictamente en la pila ELK.
Optimización del Sistema Operativo
Antes de instalar cualquier componente, es crucial ajustar los parámetros del kernel y los límites de recursos en todos los nodos para garantizar un rendimiento óptimo de la JVM y el motor de búsqueda Lucene.
Ajuste de Parámetros del Kernel
Reduzca el uso de la memoria de intercambio (swap) y aumente el límite de mapas de memoria virtual:
echo "vm.swappiness=1" | tee -a /etc/sysctl.conf
echo "vm.max_map_count=262144" | tee -a /etc/sysctl.conf
sysctl --system
Configuración de Límites de Recursos (ulimit)
Modifique el archivo de límites de seguridad para permitir un mayor número de descriptores de archivo, procesos y bloqueo de memoria:
echo "elastic_user soft nofile 655360" | tee -a /etc/security/limits.conf
echo "elastic_user hard nofile 655360" | tee -a /etc/security/limits.conf
echo "elastic_user soft nproc 4096" | tee -a /etc/security/limits.conf
echo "elastic_user hard nproc 4096" | tee -a /etc/security/limits.conf
echo "elastic_user soft memlock unlimited" | tee -a /etc/security/limits.conf
echo "elastic_user hard memlock unlimited" | tee -a /etc/security/limits.conf
Para aplicar los cambios en la sesión actual sin reiniciar el servidor:
ulimit -n 655360
ulimit -u 4096
Instalación de los Componentes
Descargue e instale los paquetes RPM correspondientes en cada servidor. Asegúrese de descargar los binarios directamente desde los repositorios oficiales.
Elasticsearch (En los 3 nodos)
cd /opt/installers
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-x86_64.rpm
sudo rpm --install elasticsearch-7.10.2-x86_64.rpm
Kibana (Solo en elastic-node-01)
curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-x86_64.rpm
sudo rpm --install kibana-7.10.2-x86_64.rpm
Logstash (Solo en elastic-node-02)
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.10.2-x86_64.rpm
sudo rpm --install logstash-7.10.2-x86_64.rpm
Filebeat (En los servidores de origen de logs)
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.2-x86_64.rpm
sudo rpm --install filebeat-7.10.2-x86_64.rpm
Configuración de Seguridad y Certificados TLS
Para habilitar la autenticación X-Pack y el cifrado de red entre nodos, genere una Autoridad Certificadora (CA) y los certificados de nodo. Ejecute estos comandos en el primer nodo:
/usr/share/elasticsearch/bin/elasticsearch-certutil ca --out /tmp/elastic-stack-ca.p12 --pass ""
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca /tmp/elastic-stack-ca.p12 --ca-pass "" --out /tmp/elastic-certificates.p12 --pass ""
Distribuya el archivo elastic-certificates.p12 al directorio /etc/elasticsearch/ de todos los nodos y asigne los permisos adecuados:
chown root:elasticsearch /etc/elasticsearch/elastic-certificates.p12
chmod 660 /etc/elasticsearch/elastic-certificates.p12
Configuración del Clúster Elasticsearch
Edite el archivo /etc/elasticsearch/elasticsearch.yml en cada nodo. A continuación, se muestran las configuraciones adaptadas para una arquitectura con nodos de datos calientes (hot) y fríos (cold).
Configuración para elastic-node-01 (Nodo Master/Hot)
cluster.name: prod-logging-cluster
node.name: elastic-node-01
node.attr.data_type: hot
node.roles: [ master, data ]
path.data: /opt/elastic/data
path.logs: /var/log/elasticsearch
network.host: 10.0.1.11
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["10.0.1.11:9300", "10.0.1.12:9300", "10.0.1.13:9300"]
cluster.initial_master_nodes: ["elastic-node-01"]
bootstrap.memory_lock: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/elastic-certificates.p12
Configuración para elastic-node-02 (Nodo Data/Cold)
cluster.name: prod-logging-cluster
node.name: elastic-node-02
node.attr.data_type: cold
node.roles: [ data ]
path.data: /opt/elastic/data
path.logs: /var/log/elasticsearch
network.host: 10.0.1.12
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["10.0.1.11:9300", "10.0.1.12:9300", "10.0.1.13:9300"]
cluster.initial_master_nodes: ["elastic-node-01"]
bootstrap.memory_lock: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/elastic-certificates.p12
Configuración para elastic-node-03 (Nodo Data/Cold)
cluster.name: prod-logging-cluster
node.name: elastic-node-03
node.attr.data_type: cold
node.roles: [ data ]
path.data: /opt/elastic/data
path.logs: /var/log/elasticsearch
network.host: 10.0.1.13
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["10.0.1.11:9300", "10.0.1.12:9300", "10.0.1.13:9300"]
cluster.initial_master_nodes: ["elastic-node-01"]
bootstrap.memory_lock: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/elastic-certificates.p12
Ajustes de Systemd para Bloqueo de Memoria
Dado que hemos habilitado bootstrap.memory_lock: true, es obligatorio modificar el servicio de systemd para permitir el bloqueo de memoria ilimitado. La mejor práctica es crear un archivo de anulación (override) en lugar de editar el archivo original del paquete:
systemctl edit elasticsearch
Agregue la siguiente configuración en el editor que se abra:
[Service]
LimitMEMLOCK=infinity
LimitNOFILE=655360
LimitNPROC=4096
Recargue el demonio de systemd para aplicar los cambios:
systemctl daemon-reload
Inicio del Clúster y Gestión de Credenciales
Inicie el servicio de Elasticsearch en todos los nodos y habilítelo para que arranque automáticamente con el sistema:
systemctl enable --now elasticsearch.service
Una vez que los nodos se hayan descubierto y formado el clúster, genere las contraseñas para los usuarios internos reservados:
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto -u "http://10.0.1.11:9200"
Nota: Use el parámetro interactive en lugar de auto si prefiere definir contraseñas personalizadas manualmente para cada usuario del sistema.
Verificación del Estado del Clúster
Consulte la API de salud del clúster para asegurarse de que todos los nodos están operativos y el estado es verde (green):
curl -s -u elastic:YourGeneratedPassword http://10.0.1.11:9200/_cluster/health?pretty
La respuesta JSON debe mostrar "status" : "green" y "number_of_nodes" : 3, confirmando que la replicación y los shards están correctamente asignados.
Despliegue y Configuración de Kibana
Edite el archivo de configuración de Kibana (/etc/kibana/kibana.yml) para conectarlo al clúster seguro. En versiones 7.8 y superiores, el usuario interno para Kibana es kibana_system:
server.port: 5601
server.host: "10.0.1.11"
server.name: "kibana-prod"
elasticsearch.hosts: ["http://10.0.1.11:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "KibanaGeneratedPassword"
i18n.locale: "es"
Inicie y habilite el servicio de Kibana:
systemctl enable --now kibana.service
Acceda a la interfaz web a través de http://10.0.1.11:5601 e inicie sesión utilizando las credenciales del superusuario elastic para validar la integración completa de la plataforma y comenzar a crear los índices y dashboards.