
Splunk ist eines von mehreren der bekanntesten kommerziellen Produkte zum Sammeln und Analysieren von Protokollen. Selbst jetzt, wenn in Russland keine Verkäufe mehr getätigt werden, ist dies kein Grund, keine Anweisungen / Anleitungen zu diesem Produkt zu schreiben.
Aufgabe : Sammeln Sie Systemprotokolle von Docker-Knoten in Splunk, ohne die Host-Konfiguration zu ändern
Ich möchte mit einem offiziellen Ansatz beginnen, der bei Verwendung von Docker seltsam aussieht.
Link zum Docker HubWas haben wir:
1. Pullim-Bild
$ docker pull splunk/universalforwarder:latest
2. Wir starten den Container mit den notwendigen Parametern
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest
3. Wir gehen in den Container
docker exec -it <container-id> /bin/bash
Als nächstes werden wir gebeten,
zu der bekannten Adresse in der Dokumentation zu gehen.
Und konfigurieren Sie den Container nach dem Start:
./splunk add forward-server <host name or ip address>:<listening port> ./splunk add monitor /var/log ./splunk restart
Warte einen Moment. Was?
Aber die Überraschungen enden nicht dort. Wenn Sie den Container vom offiziellen Image im interaktiven Modus ausführen, wird Folgendes angezeigt:
Ein bisschen Enttäuschung $ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest PLAY [Run default Splunk provisioning] ******************************************************************************************************************************************************************************************************* Tuesday 09 April 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 ********* TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 ********* TASK [Get actual hostname] ******************************************************************************************************************************************************************************************************************* changed: [localhost] Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 ********* TASK [set_fact] ****************************************************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 ********* Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.216) 0:00:02.798 ********* included: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml for localhost Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 ********* TASK [splunk_common : Update Splunk directory owner] ***************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.324) 0:00:03.210 ********* included: /opt/ansible/roles/splunk_common/tasks/get_facts.yml for localhost Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 ********* ...
Großartig. Das Bild hat nicht einmal ein Artefakt. Das heißt, jedes Mal, wenn Sie starten, dauert es einige Zeit, das Archiv mit Binärdateien herunterzuladen, zu entpacken und zu konfigurieren.
Aber was ist mit Docker-Way und all dem?
Nein danke. Wir werden den anderen Weg gehen. Was ist, wenn wir alle diese Vorgänge in der Montagephase ausführen? Dann lass uns gehen!
Um lange nicht zu ziehen, zeige ich sofort das endgültige Bild:
Dockerfile # FROM centos:7 # , ENV SPLUNK_HOME /splunkforwarder ENV SPLUNK_ROLE splunk_heavy_forwarder ENV SPLUNK_PASSWORD changeme ENV SPLUNK_START_ARGS --accept-license # # wget - # expect - Splunk # jq - , RUN yum install -y epel-release \ && yum install -y wget expect jq # , , RUN wget -O splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=7.2.4&product=universalforwarder&filename=splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz&wget=true' \ && wget -O docker-18.09.3.tgz 'https://download.docker.com/linux/static/stable/x86_64/docker-18.09.3.tgz' \ && tar -xvf splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz \ && tar -xvf docker-18.09.3.tgz \ && rm -f splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz \ && rm -f docker-18.09.3.tgz # shell , inputs.conf, splunkclouduf.spl first_start.sh . source . COPY [ "inputs.conf", "docker-stats/props.conf", "/splunkforwarder/etc/system/local/" ] COPY [ "docker-stats/docker_events.sh", "docker-stats/docker_inspect.sh", "docker-stats/docker_stats.sh", "docker-stats/docker_top.sh", "/splunkforwarder/bin/scripts/" ] COPY splunkclouduf.spl /splunkclouduf.spl COPY first_start.sh /splunkforwarder/bin/ # , RUN chmod +x /splunkforwarder/bin/scripts/*.sh \ && groupadd -r splunk \ && useradd -r -m -g splunk splunk \ && echo "%sudo ALL=NOPASSWD:ALL" >> /etc/sudoers \ && chown -R splunk:splunk $SPLUNK_HOME \ && /splunkforwarder/bin/first_start.sh \ && /splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme \ && /splunkforwarder/bin/splunk restart # COPY [ "init/entrypoint.sh", "init/checkstate.sh", "/sbin/" ] # . /, . VOLUME [ "/splunkforwarder/etc", "/splunkforwarder/var" ] HEALTHCHECK --interval=30s --timeout=30s --start-period=3m --retries=5 CMD /sbin/checkstate.sh || exit 1 ENTRYPOINT [ "/sbin/entrypoint.sh" ] CMD [ "start-service" ]
Und so, was ist in enthalten
Beim ersten Start fragt Splunk nach einem Benutzernamen / Passwort, ABER diese Daten werden
nur zum Ausführen von Verwaltungsbefehlen für diese bestimmte Installation verwendet, dh innerhalb des Containers. In unserem Fall möchten wir nur den Container starten, damit alles funktioniert und die Protokolle wie Wasser fließen. Das ist natürlich Hardcode, aber ich habe keine anderen Wege gefunden.
Weiter wird das Skript ausgeführt
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl - Dies ist eine Credits-Datei für Splunk Universal Forwarder, die von der Weboberfläche heruntergeladen werden kann.
Wo zum Klicken klicken (in Bildern) Dies ist ein reguläres Archiv, das Sie entpacken können. Inside - Zertifikate und Passwort für die Verbindung zu unserer SplunkCloud und
output.conf mit einer Liste unserer Eingabeinstanzen. Diese Datei ist relevant, bis Sie Ihre Splunk-Installation neu installieren oder einen Eingabeknoten hinzufügen, wenn die Installation lokal erfolgt. Daher ist es in Ordnung, es in den Behälter zu legen.
Und der letzte ist Neustart. Ja, um die Änderungen zu übernehmen, müssen Sie sie neu starten.
In unserer
inputs.conf fügen
wir die Protokolle hinzu, die wir an Splunk senden möchten. Es ist nicht erforderlich, diese Datei zum Bild hinzuzufügen, wenn Sie beispielsweise Konfigurationen durch die Puppe streuen. Die
Hauptsache ist, dass Forwarder beim Starten des Dämons Konfigurationen sieht, andernfalls ist
ein Neustart von ./splunk erforderlich.
Welche Docker-Statistikskripte? Der Github hat eine alte Lösung von
Outcoldman , die Skripte werden von dort übernommen und finalisiert, um mit den aktuellen Versionen von Docker (ce-17. *) Und Splunk (7. *) zu arbeiten.
Mit den erhaltenen Daten können Sie solche erstellen
Dashboards: (ein paar Bilder) Der Quellcode der Deshes liegt in der Rübe am Ende des Artikels. Bitte beachten Sie, dass es 2 Auswahlfelder gibt: 1 - Wählen Sie den Index (nach Maske durchsucht) und den Host / Container aus. Abhängig von den verwendeten Namen müssen Sie wahrscheinlich die Indexmaske aktualisieren.
Abschließend möchte ich auf die Funktion
start () in achten
entrypoint.sh start() { trap teardown EXIT if [ -z $SPLUNK_INDEX ]; then echo "'SPLUNK_INDEX' env variable is empty or not defined. Should be 'dev' or 'prd'." >&2 exit 1 else sed -e "s/@index@/$SPLUNK_INDEX/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf fi sed -e "s/@hostname@/$(cat /etc/hostname)/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf sh -c "echo 'starting' > /tmp/splunk-container.state" ${SPLUNK_HOME}/bin/splunk start watch_for_failure }
In meinem Fall verwenden wir für jede Umgebung und jede einzelne Entität, unabhängig davon, ob es sich um eine Anwendung in einem Container oder auf einem Hostcomputer handelt, einen separaten Index. Die Suchgeschwindigkeit leidet also nicht unter einer signifikanten Anhäufung von Daten. Eine einfache Regel wird verwendet, um Indizes zu benennen:
<Umgebungsname> _ <Dienst / Anwendung / etc> . Um den Container universell zu machen, ersetzen wir den
sed Wildcard durch den Umgebungsnamen, bevor wir den Daemon direkt starten. Eine Variable mit einem Umgebungsnamen wird durch Umgebungsvariablen übergeben. Das klingt lustig.
Es ist auch erwähnenswert, dass Splunk aus irgendeinem Grund nicht vom Docker-
Hostnamen- Parameter betroffen ist. Auf jeden Fall sendet er dauerhaft Protokolle von der ID seines Containers an das Hostfeld. Als Lösung können Sie
/ etc / hostname vom Hostcomputer bereitstellen und beim Start einen Ersatz erstellen, der den Indexnamen ähnelt.
Beispiel Docker-compose.yml version: '2' services: splunk-forwarder: image: "${IMAGE_REPO}/docker-stats-splunk-forwarder:${IMAGE_VERSION}" environment: SPLUNK_INDEX: ${ENVIRONMENT} volumes: - /etc/hostname:/etc/hostname:ro - /var/log:/var/log - /var/run/docker.sock:/var/run/docker.sock:ro
ZusammenfassungJa, vielleicht ist die Lösung nicht perfekt und schon gar nicht universell für alle, da es viel
„Hardcode“ gibt . Auf dieser Grundlage kann jeder sein Bild sammeln und in sein eigenes privates Artefakt einfügen, wenn Sie zufällig Splunk Forwarder im Docker benötigen.
Referenzen:
Lösung aus dem ArtikelDie Lösung von Outcoldman inspirierte dazu, einen Teil der Funktionalität wiederzuverwendenVon. Setup-Dokumentation für Universal Forwarder