Wie leite ich Docker-Containerprotokolle an ELK weiter?

7

Ich möchte wissen, wie ich meine Docker-Container-Protokolle am einfachsten an einen ELK-Server weiterleiten kann. Bisher haben die Lösungen, die ich nach der Suche im Internet ausprobiert habe, überhaupt nicht funktioniert.

Grundsätzlich habe ich ein Docker-Image, das ich mit Docker-Compose ausführe. Dieser Container protokolliert nichts lokal (er besteht aus verschiedenen Diensten, aber keiner von ihnen ist Logstash oder was auch immer), aber ich sehe die Protokollierung durch docker logs -tf imageNameoder docker-compose logs. Da ich die Container mit compose beginne, kann ich die --logs-driverDocker-Option nicht nutzen (oder weiß zumindest nicht wie) .

Daher habe ich mich gefragt, ob mich jemand ein bisschen darüber aufklären könnte, wie man diese Protokolle beispielsweise an einen ELK-Container weiterleitet.

Danke im Voraus,

Grüße

LÖSUNG :

Dank madeddie konnte ich mein Problem folgendermaßen lösen. Erwähnen Sie, dass ich die grundlegenden ELK-Stack-in-Container verwendet habe, die madeddie in seinem Beitrag vorgeschlagen hat.

Zuerst aktualisiere ich die docker-compose.ymlDatei meines Containers, um Einträge für die Protokollierungsreferenz hinzuzufügen, wie Madeddie mir sagte. Ich habe einen Eintrag pro Dienst hinzugefügt. Ein Ausschnitt aus meinem Docker-Compose sieht so aus

   version: '2'
    services:
      mosquitto:
        image: ansi/mosquitto
        ports:
          - "1883:1883" # Public access to MQTT
          - "12202:12202"  #mapping logs
        logging: 
           driver: gelf
           options: 
             gelf-address: udp://localhost:12202
    redis:
     image: redis
     command: redis-server --appendonly yes
     ports:
       - "6379:6379" # No public access to Redis
       - "12203:12203" #mapping logs
     volumes:
       - /home/dockeruser/redis-data:/data
     logging: 
       driver: gelf
       options: 
         gelf-address: udp://localhost:12203 

Zweitens musste ich pro Service eine andere Portnummer verwenden, um die Protokolle weiterleiten zu können.

Schließlich habe ich meine docker-compose.ymlElchcontainerdatei aktualisiert , um jeden der Aktualisierungsports, an denen ich meine Protokolle gesendet habe, dem zuzuordnen, den logstash abhört

logstash:
  build: logstash/
  command: logstash -f /etc/logstash/conf.d/logstash.conf
  volumes:
    - ./logstash/config:/etc/logstash/conf.d
  ports:
    - "5000:5000"
    - "12202:12201/udp" #mapping mosquitto logs
    - "12203:12201/udp" #mapping redis logs

Bei dieser Konfiguration und dem Hinzufügen des Eintrags von gelf {}in logstash.confist es ebenfalls wichtig, die IP-Adresse des Docker-Dienstes ordnungsgemäß einzurichten.

Grüße!

ndarkness
quelle
Dies ist eine interessante Lösung. Sie haben jetzt einen Port, der alle anderen Container an den Logstash-Container weiterleitet. Normalerweise würden Sie nicht alle diese 1220 * -Ports auf den anderen Containern haben, nur die 12201 / udp auf dem Logstash-Port und die Protokollierung würde darauf verweisen gelf-address:udp://ip_of_dockerhost:12201(wenn alle Container auf demselben Host ausgeführt werden, würde 172.17.0.1 als ip_of_dockerhost funktionieren , andernfalls verwenden Sie die Haupt-IP-Adresse des Hosts, auf dem der Logstash-Container ausgeführt wird.
Madeddie
Ich habe es versucht, aber während des Laufens habe docker-compose upich eine Beschwerde gesehen, dass der Port bereits verwendet wurde.
Ndarkness
Ja, weil Sie einen Port für Logstash für alle Ihre Container öffnen, während Sie ihn nur für den Logstash-Container öffnen sollten. Es ist nicht erforderlich, dass alle anderen Container auf Logstash-Verbindungen warten. Daher müssen sie keinen Port dafür öffnen.
Madeddie
Ich verstehe es nicht ganz. Meinst du, dass meine loggingOption servicesstattdessen pro Container auf der gleichen Tag- Ebene sein sollte ?
Ndarkness
die Protokollierung Stichwort öffnet sich nicht tatsächlich einen Port zu hören auf, es konfiguriert , wo Docker verbinden zu . Ich spreche von den Portzuordnungen, die Sie für jeden Container vornehmen. Sie können einen Port nur einmal öffnen , aber Sie sollten keinen Port zum Anmelden an jedem Container öffnen, sondern nur den Logstash-Port. Das Problem liegt in Ihrer Verwendung von "localhost" als Host des Wallach-Endpunkts. Anstelle von localhost sollten Sie die IP des Computers verwenden, auf dem der Logstash-Container ausgeführt wird, oder 172.17.0.1, wenn sich alle Container auf demselben Host befinden, oder "logstash" verwenden "Wenn alle Container mit derselben Compose-Datei gestartet werden.
Madeddie

Antworten:

5

Docker compose hat das Protokollierungsschlüsselwort: source

logging: 
  driver: syslog
  options: 
    syslog-address: "tcp://192.168.0.42:123"

Wenn Sie also wissen, wohin Sie von dort aus gehen sollen, versuchen Sie es.

Wenn nicht, kann ich Ihnen raten, in den gelfProtokollierungstreiber für Docker und das Logstash-Gelf-Eingabe-Plugin zu schauen

Wenn Sie beispielsweise dieses grundlegende ELK-Stack-in-Container-Setup verwenden würden, würden Sie die Docker-Compose-Datei aktualisieren und - "12201:12201/udp"dem Logstash einen Port hinzufügen.

Bearbeiten Sie den logstash.confEingabeabschnitt wie folgt:

input {
    tcp {
        port => 5000
    }
    gelf {
    }

}

Konfigurieren Sie dann Ihre Container so, dass sie den Protokollierungstreiber gelf(nicht Syslog) und die Option gelf-address=udp://ip_of_logstash:12201(anstelle der Syslog-Adresse) verwenden.

Die einzige Magie, um die Sie sich kümmern müssen, ist, wie Docker die IP-Adresse oder den Hostnamen des Logstash-Containers findet. Sie können dies durch Docker-Compose-Namen, Docker-Links oder einfach manuell lösen.

Docker und ELK sind mächtige, flexible, aber auch große und komplexe Bestien. Bereiten Sie sich darauf vor, etwas Zeit in das Lesen und Experimentieren zu investieren.

Haben Sie keine Angst davor, neue (und vorzugsweise sehr spezifische) Fragen zu stellen, auf die Sie stoßen, während Sie all dies untersuchen.

Madeddie
quelle
Vielen Dank für die Antwort. Soweit ich getestet habe, muss ich diesen Eintrag pro Dienst hinzufügen, der in meiner docker-compose.ymlDatei ausgeführt wird, oder? Ich habe es für zwei Dienste getan und jetzt melden sich diese nicht am Terminal an, also schätze ich, dass ihre Protokolle weitergeleitet werden. Ich habe ein bisschen Erfahrung damit, aber hauptsächlich aus der Literatur (ich habe gelesen, dass Filebeat besser ist). Könnten Sie diese Konfigurationen auch hier einfügen?
Ndarkness
Ich kann Ihnen nicht mit Filebeat helfen (verwenden Sie es nicht selbst), aber ich werde ein Beispiel-Konfigurations-Snippet für Logstash hinzufügen. Obwohl ich erwarte, dass Sie sich über die Verwendung des ELK-Stacks informieren, da dies etwas über den Rahmen dieser Frage hinausgeht (und auch ausreicht, um eine Woche Einführungsschulung zu füllen :))
madeddie
Nochmals vielen Dank, es ist in Ordnung, wenn Sie das Konfigurations-Snippet für logstash freigeben können. Ich habe ein sebp/elkImage heruntergeladen , in dem elk eingerichtet ist, und ich plane, dieses Syslog an diesen Container weiterzuleiten.
Ndarkness
Ich habe festgestellt, dass ich aufgrund der Tatsache, dass es sich um TCP handelt, nur einen meiner Dienste an einen Port anschließen kann. Kann ich udp auch für das Syslog verwenden?
Ndarkness
UDP kann auch nur durch einen Abhörvorgang geöffnet werden. Die syslog-address: "tcp://192.168.0.42:123"Option bedeutet "Protokolle an diesen Syslog-Server senden", sodass Syslog-Nachrichten nicht selbst eingerichtet und abgehört werden.
Madeddie