Folio / Docker / Systemlogs mit dem ELK-Stack ansehen

Seite ursprünglich erstellet im GBV-Wiki von Florian Gleixner

Ingolf hat mich gebeten, unsere Doku aus dem LRZ auch hier einzustellen. Wir betreiben im LRZ einige Folio Instanzen für Bibliotheken des BVB.

Ziel

Die teilnehmenden Bibliotheken sollen bei Fehlern oder Unklarheiten die Möglichkeit haben, auf die Logs der Docker Container, von Okapi, dem Betriebssystem und der Datenbank schauen können.

Installation Server

Neue Debian 10 Openstack VM foliotest-log.


apt-get update
apt-get upgrade
apt-get install gnupg
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update
apt-get install elasticsearch
systemctl enable elasticsearch
apt-get install kibana
systemctl enable kibana

Elasticsearch (Single Instance)

Konfiguration /etc/elasticsearch/elasticsearch.yml:

cluster.name: folio-logs
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.type: single-node
xpack.security.enabled: true

Elasticsearch starten und Passwörter setzen:

systemctl start elasticsearch
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

Für alle das selbe Passwort gesetzt. Es steht in /home/debian/elastic-pw

Compute Cloud ungeeignet für Elasticsearch (→ Elastic Cluster)

Der Rechner auf der Compute Cloud hatte so eine schlechte Schreib-Performance, dass ich die Elasticsearch Node auf einen Rechner der SolraaS Infrastruktur verschieben musste.

Dabei wurde ein Elastic Cluster aus 4 Nodes aufgebaut. Der Cluster funktioniert aber nur, wenn man Zertifikate installiert:

/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
mkdir /etc/elasticsearch/certs
cp /usr/share/elasticsearch/elastic-certificates.p12 /etc/elasticsearch/certs/
chown -r elasticsearch /etc/elasticsearch/certs

Die Datei elastic-certificates.p12 muss man dann auf alle Knoten in das Verzeichnis legen. Die /etc/elastasticsearch/elastic.yml sieht dann so aus:

cluster.name: folio-logs
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
cluster.initial_master_nodes: ["search-dar1-01"]
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

search-dar1-01 = 10.195.16.101 ist dabei der erste Elasticsearch Clusterknoten.

Kibana

Konfiguration von /etc/kibana/kibana.yml

elasticsearch.hosts: ["http://10.195.16.101:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "********"

Die Einstellung elasticsearch.hosts kann weggelassen werden, wenn auf dem Rechner auch ein Elasticsearch läuft.

Starten

systemctl start kibana


Client - Filebeat

Auf den einzelnen Folio Instanzen werden die Logs per Filebeat geschickt:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update && apt-get install filebeat
systemctl enable filebeat

Konfiguration /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: container
  enabled: true
  paths:
          - /var/lib/docker/containers/*/*.log
- type: log
  enabled: true
  paths:
    - /var/log/*.log
    - /var/log/syslog
    - /var/log/folio/*.log
    - /var/log/postgresql/*.log
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
output.elasticsearch:
  hosts: ["10.195.16.101:9200"]
  indices:
    - index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
  username: "elastic"
  password: "********"
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata:
      host: "unix:///var/run/docker.sock"
  - add_kubernetes_metadata: ~
  - decode_json_fields:
      fields: ["message"]
      target: "json"
      overwrite_keys: true
  - drop_event:
      when:
        regexp:
          message: " filebeat"

Die Filebeat Integration ist inzwischen per Ansible Playbook automatisiert. Der Indexname hat den Rechnernamen vorgestellt, so dass man die Indexe den einzelnen Bibliotheken zuweisen kann.

Kibana GUI

Die Kibana GUI ist dann auf Port 5601 erreichbar. Login mit dem User "elastic". Als erstes muss man unter "Stack Management" → "Index Patterns" so einen erstellen mit Index-Pattern Name "filebeat-*". Dann kann man unter Analytics → Discover diesen ansehen.

Sinnvoll ist die Auswahl der Felder wie im Bild

SSL

Die Kommunikation zwischen Filebeat und Elasticserach sowie zwischen Kibana und Elasticserach ist momentan nicht verschlüsselt. Ist auch nicht zwingend notwendig (interne Netze). Wie das geht sollte hier beschrieben sein:

https://www.elastic.co/de/blog/configuring-ssl-tls-and-https-to-secure-elasticsearch-kibana-beats-and-logstash

Damit User von aussen sich per https auf kibana einloggen können wurde ein Zertifikat erstellt, und ein nginx als Proxy vorgeschaltet:

apt-get install nginx
egrep -ve "^\s*#" /etc/nginx/sites-enabled/default
 
server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        ssl_certificate     /etc/ssl/private/foliotest-log-chain.pem;
        ssl_certificate_key /etc/ssl/private/foliotest-log-sec-key-ohnepass.pem;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name foliotest-log.bib-bvb.de;
        location / {
                proxy_pass http://localhost:5601;
        }
}
 
systemctl enable nginx --now