Checkmk
to checkmk.com

1. Einleitung

docker logo breit

In den vergangenen Jahren hat das Containerkonzept die IT-Welt im Sturm erobert. Das wirft natürlich auch Fragen zu der Überwachung solcher Container auf. Checkmk kann Docker-Container direkt über den Linux-Agenten überwachen. Dabei werden nicht nur Rahmendaten, wie der Status des Daemons oder des Containers, sondern auch die Container selbst überwacht. Eine vollständige Liste der aktuell überwachbaren Dinge finden Sie wie immer im Katalog der Check-Plugins.

Neben den Status- und Inventurinformationen, die Checkmk über den Node (Docker-Sprech für: Host, auf dem die Container laufen) ermitteln kann, kann Checkmk detaillierte Statusinformationen der Container ermitteln. Hierzu wird in Checkmk jeder Container als eigenständiger Host angelegt, wenn er überwacht werden soll. Seine Daten werden im Huckepackverfahren (piggyback) an diesen Host geliefert.

Seit Version 1.6.0 der CEE Checkmk Enterprise Editions können Sie mit Hilfe der dynamischen Konfiguration die Container-Hosts sogar automatisch anlegen und entfernen lassen.

2. Einrichtung

2.1. Installation von Agent und Plugins

Damit Sie einen Docker-Node mit Checkmk überwachen können, muss dieser zunächst mit dem normalen Linux-Agenten überwacht werden. Dadurch erhalten Sie wie gewohnt ein Grundmonitoring des Wirtssystems, jedoch noch keine Information über den Docker-Daemon oder gar über die Container.

Dazu benötigen Sie noch das Agentenplugin mk_docker.py.

Installieren Sie das Plugin wie gewohnt nach /usr/lib/check_mk_agent/plugins. In den Enterprise Editions können Sie natürlich alternativ auch mit der Agentenbäckerei arbeiten, welche für Docker den entsprechenden Regelsatz bereitstellt: Docker node and containers.

Bitte beachten Sie, dass seit Version 1.6.0 die Python-Bibliothek docker benötigt wird --, nicht docker-py. Es ist mindestens Version 2.0.0 notwendig. Mit python auf der Kommandozeile können Sie dies leicht überprüfen:

root@linux# python
Python 2.7.16 (default, Sep 24 2020, 22:49:21)
[GCC 8.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker
>>> docker.version
'4.0.2'

Falls notwendig, können Sie die Bibliothek als root-Nutzer mit pip installieren:

root@linux# pip install docker

Bei Nodes ohne Internet-Anbindung kopieren Sie die Bibliothek und installieren sie offline:

root@linux# pip install docker-4-3-1.tar.gz

Einige Distributionen erlauben auch die Installation über ihre Paketmanager, also zum Beispiel per apt-get install python-docker unter Debian, Ubuntu und deren Derivaten. Dabei kann es allerdings passieren, dass darüber zu alte, nicht kompatible Versionen installiert werden (beispielsweise Version 1.9 unter Debian 9). Gehen Sie in solchen Fällen wie oben beschrieben mit pip install vor.

Achtung: Die Pakete docker-py beziehungsweise python-docker-py dürfen nicht installiert sein. Diese stellen eine veraltete und nicht kompatible Version der Docker-Bibliothek unter dem selben Namesraum zur verfügung! Wenn Sie docker-py (oder beide Varianten) installiert haben, reicht eine alleinige Deinstallation nicht aus, da pip den Namesraum nicht reparieren kann. Um sicherzustellen, dass die korrekte Version installiert ist, führen Sie in diesem Fall bitte folgende Befehle aus:

root@linux# pip uninstall docker-py docker
root@linux# pip install docker

An diesem Punkt können Sie nun testen, ob das Plugin läuft und Informationen ausgibt und ob die Ausgabe auch im Agenten vorhanden ist. Das Plugin selbst testen Sie auf dem Host mit:

root@linux# python /usr/lib/check_mk_agent/plugins/mk_docker.py

Und die Ausgabe im Agenten testen Sie auf dem Checkmk-Server mit:

OMD[mysite]:~$ strings tmp/check_mk/cache/mydockerhost | grep "<<<docker"

Wenn Sie jetzt in WATO die Serviceerkennung durchführen und die Änderungen aktivieren, sollten Sie zunächst einige neue Services finden, welche den Docker-Node selbst betreffen (hier von Version 1.6.0):

docker basic services

2.2. Feintuning des Plugins

Seit der 1.6.0 können Sie verschiedene Parameter des Plugins konfigurieren. So können Sie zum Beispiel Ressourcen schonen, in dem Sie nicht benötigte Sektionen deaktivieren, oder — falls nötig — den Docker-API-Engine-Endpunkt anpassen (der Standard ist das Unix-Socket unix://var/run/docker.sock).

Legen Sie dazu wie üblich eine Konfigurationsdatei /etc/check_mk/docker.cfg an. Eine Vorlage mit ausführlichen Erläuterungen finden Sie im Checkmk-Verzeichnis unter share/check_mk/agents/cfg_examples/docker.cfg.

In den Enterprise Editions können Sie alle Parameter bequem mit der Agentenbäckerei einstellen.

2.3. Überwachung der Container

Anlegen der Container-Hosts

Das eigentlich Interessante ist natürlich das Überwachen der Docker-Container. Dies geschieht durch Installation der Plugins automatisch. Allerdings werden die Services nicht dem Docker-Node zugeordnet, vielmehr geht Checkmk von einem eigenen Host pro Docker-Container aus.

Der Mechanismus, der hier zum Einsatz kommt, heißt Piggyback (Huckepack). Dabei transportiert ein Plugin oder Spezialagent Daten zu anderen Hosts quasi „huckepack“ in seiner Ausgabe mit. Checkmk legt diese Daten im Verzeichnis tmp/check_mk/piggyback in einem eigenen Unterverzeichnis ab. Sie brauchen dann nur noch in WATO Hosts anzulegen, die genauso heißen, wie eben die zugehörigen Piggyback-Unterverzeichnisse. Services werden diesen dann automatisch zugeordnet.

Seit Version 1.6.0 der Enterprise Editions können Sie diese Hosts aber auch automatisch anlegen lassen. Verwenden Sie dazu in der dynamischen Konfiguration den Konnektor Piggyback.

Wenn Sie die Hosts dennoch von Hand anlegen, beachten Sie dabei Folgendes:

  • Der Hostname muss exakt dem Verzeichnis entsprechen, welches in tmp/check_mk/piggyback angelegt wird. Per Default ist das die zwölfstellige Short-ID des Containers (z.B. 2ed23056480f). Sie können das allerdings auch die vollständige ID oder den Namen ändern, wie im nachfolgenden Kapitel näher beschrieben.

  • Falls die Container keine eigene IP-Adresse haben (was meist der Fall ist), stellen Sie das Attribut bei IP-Address-Family auf No IP ein.

  • Bei Data sources stellen Sie Check_MK Agent unbedingt auf No agent ein.

  • Das Feld Parent können Sie auf den Hostnamen der Docker-Node setzen.

  • Wichtig ist ferner, dass der Docker-Node und dessen Container von derselben Checkmk-Instanz aus überwacht werden.

Nachdem Sie die Container-Hosts angelegt und die Serviceerkennung durchgeführt haben, tauchen auf diesen weitere Services auf. Dort finden Sie auch einen Hinweis auf die Piggyback-Herkunft:

docker container services

Alternative Benennung der Container-Hosts

Als Standardeinstellung wird wie oben erwähnt die zwölfstellige Short-ID des Containers als Name des Container-Hosts verwendet. Dies können Sie anders konfigurieren. Setzen Sie hierzu in der Konfigurationsdatei die Option container_id auf long, um die vollständige Container-ID als Namen zu verwenden, oder auf name, um den Containernamen zu verwenden. Selbstverständlich können Nutzer der CEE Checkmk Enterprise Editions dies in der Agentenbäckerei einstellen.

Übrigens: Mit dem Regelsatz Access to agents > General settings > Hostname translation for piggybacked hosts können Sie recht flexibel Regeln definieren, nach denen Hostnamen, welche in Piggyback-Daten enthalten sind, umgewandelt werden, um bessere Hostnamen für Checkmk zu generieren. Damit können Sie z.B. auch das Problem lösen, wenn Sie auf zwei verschiedenen Docker-Nodes Container mit dem gleichen Namen haben. Über geeignete Translation-Regeln können Sie die Namen dann z.B. mit einem Präfix versehen, um diese eindeutig zu machen.

Überwachen des Hoststatus

Da der Hoststatus eines Containers nicht unbedingt über TCP-Pakete oder ICMP geprüft werden kann, muss dieser anders ermittelt werden. Hier bietet sich der Service Docker container status an. Dieser prüft ohnehin, ob der Container läuft oder nicht und kann daher als sicheres Mittel verwendet werden, um den Hoststatus zu ermitteln. Legen Sie dazu eine Regel in dem Regelset Host Check Command an und setzen Sie die Option Use the status of the service auf den erwähnten Service. Vergessen Sie nicht die Bedingungen so zu setzen, dass sie nur Container betreffen. In unserem Beispiel liegen alle Container in einem gleichnamigen Ordner:

docker container hoststatus

Überwachen von Services im Container

Um Details im Container selbst zu überwachen (z.B. laufenden Prozesse, Datenbanken, Logdateien, etc.), ist es notwendig, dass der Checkmk-Agent im Container ausgeführt wird.

Ausnahme: Die drei Plugins mem, cpu und diskstat (Disk-I/O) funktionieren auch ohne Agenten im Container und werden dann vom Checkmk-Agenten auf dem Node selbst berechnet. In Containern laufende Agenten geben diese Werte entsprechend nicht (nochmals) aus, da sie wissen, dass sie in einem Container laufen.

Der Aufruf erfolgt aber auch mit Agenten im Container nach wie vor gebündelt über den Docker-Node im Piggyback-Verfahren. Der Container-Agent wird dazu schlicht vom Node-Agenten abgefragt.

Der im Container installierte Agent funktioniert natürlich nur dann, wenn in dem Container auch alle benötigten Befehle vorhanden sind.

Speziell bei minimal gebauten Containern auf Basis von Alpine-Linux kann es gut sein, dass elementare Dinge wie die Bash nicht vorhanden sind. In diesem Fall sollten Sie den Container aus dem Docker-Node heraus überwachen — auch wenn sich so nicht alle Details erfassen lassen. Diese oben erläuterte Verwendung des Regelsets Host Check Command zur Überwachung des Hoststatus wird aber nur benötigt, wenn der Container nicht pingbar ist.

3. Diagnosemöglichkeiten

3.1. Diagnose für einen Docker-Node

Sollte die Einrichtung nicht klappen, gibt es verschiedene Möglichkeiten der Analyse des Problems. Prüfen Sie zunächst, ob der Agent in der korrekten, aktuellen Version läuft; beispielsweise mit:

OMD[mysite]:~$ cmk -n myhost | grep -o -P '\[agent\] Version:.*?,'

Anschließend sollten Sie sicherstellen, dass auch das Plugin — ganz unabhängig vom Agenten — funktioniert:

root@linux# python /usr/lib/check_mk_agent/plugins/mk_docker.py

Falls die Version des Agenten auf dem Host passt und das Plugin läuft, prüfen Sie als Nächstes, ob die Daten in der Ausgabe des Agenten enthalten sind. Sie können die Ausgabe als Textdatei über den Button Download agent output in der GUI über das Dropdown-Menü des Hosts herunterladen:

docker node dropdown

Oder Sie durchsuchen direkt den Agenten-Cache. Die Ausgabe in dem folgenden Beispiel ist der Anschaulichkeit halber auf die Docker-relevanten Bereiche gekürzt:

OMD[mysite]:~$ strings tmp/check_mk/cache/mydockerhost | grep "&lt&lt&ltdocker"
<<<docker_node_info>>>
<<<docker_node_disk_usage:sep(44)>>>
<<<docker_node_images>>>
<<<docker_node_network:sep(0)>>>

Werden die Sektionen hier nicht geführt, wird die Docker-Installation nicht erkannt.

Der Service Docker node info verwendet folgenden Befehl, mit dem Sie auch manuell testen können, ob Ihre Docker-Installation korrekt läuft:

root@linux# docker info 2>&1

Eine typische Fehlerquelle, insbesondere, wenn Docker-Installation, Agent und dessen Plugin einzeln korrekt laufen, ist die oben bereits erwähnte Python-Bibliothek für Docker. Wenn die beschriebene Neuinstallation keine Abhilfe schafft, schauen Sie mal nach weiteren Fehlermeldungen beim Import in Python:

root@linux# python
>>> import docker

Beispiel: Unter Debian 9 kann es hier zu Problemen mit den SSL-Backports kommen. die sich mit einer Deinstallation via pip und einer Neuinstallation via apt-get lösen lassen:

root@linux# pip uninstall backports.ssl-match-hostname
root@linux# apt-get install backports.ssl-match-hostname

3.2. Diagnose für einen Container-Host

Falls der Container-Host keine Daten erhält, bzw. keine Services erkannt werden, prüfen Sie zuerst, ob die Piggyback-Daten zu diesem Host vorhanden sind. Der Name des Hosts muss identisch mit der ID des Containers sein. Alternativ können Sie auch über das Regelset Hostname translation for piggybacked hosts eine manuelle Zuordnung vornehmen. Hier bietet sich allerdings nur die Option Explicit hostname mapping an:

docker container namemapping

Um zu prüfen, ob zu einer ID Piggyback-Daten angelegt werden, können Sie folgenden Befehl nutzen:

OMD[mysite]:~$ ls -l tmp/check_mk/piggyback/
76adfc5a7794  f0bced2c8c96  bf9b3b853834

4. Hostlabels

Seit Version 1.6.0 von Checkmk gibt es sogenannte Hostlabels. Das überarbeitete Docker-Monitoring setzt automatisch die drei Labels cmk/docker_image, cmk/docker_image_name und cmk/docker_image_version. Diese Labels können Sie z.B. in Bedingungen für Ihre Regeln verwenden, um Ihre Monitoringkonfiguration von den jeweiligen Images abhängig zu machen, die in Containern verwendet werden.

5. Besonderheiten in Version 1.5

Das Docker-Monitoring wurde in Checkmk Version 1.5.0 eingeführt und in Version 1.6.0 massiv umgebaut. Sofern Sie noch die Version 1.5.0 nutzen, gibt es ein paar Punkte zu beachten, die sich vom aktuellen, bis hier hin dokumentierten Stand unterscheiden.

  • Plugins: mk_docker_node und mk_docker_container_piggybacked (statt mk_docker.py).

  • Regelsätze für Agentenbäckerei: Docker node und Piggybacked Docker containers (statt Docker node and containers).

  • Falls kein Agent im Container installiert ist, wird der Agent des Docker-Nodes im Container ausgeführt (diese Funktion wurde aus Gründen der Performance in der Version 1.6.0 entfernt).

6. Dateien und Verzeichnisse

PfadBedeutung

tmp/check_mk/piggyback/

Hier legt WATO die Huckepackdaten ab. Für jeden Host wird ein Unterordner mit seinem Namen erzeugt. Darin befindet sich eine Textdatei mit den Daten des Hosts. Dateiname ist der Host, welcher die Daten angeliefert hat.

tmp/check_mk/cache/

Hier wird die jeweils jüngste Agentenausgabe aller Hosts temporär gespeichert. Der Inhalt einer Datei zu einem Host ist identisch zu der Ausgabe des Befehls cmk -d myserver123.

Auf dieser Seite