en

Monitoring für Arme

November 2021

An Kubernetes hat mir immer gefallen, dass man deklariert wie eine Applikation deployed sein soll und Kubernetes sorgt für die Umsetzung. Also ich deklariere "mein Service soll mit 2 Replikaten laufen" und Kubernetes sorgt in der Realität dafür, dass nach Abstürzen und sonstigen äußeren Einflüssen immer wieder dieses Zielbild hergestellt wird. Wenn meine Services "unhealthy" werden, weil sie z.B. zu viel Arbeitsspeicher verbrauchen, sorgt Kubernetes dafür, dass die Services neu gestartet werden.

Was mir an Kubernetes nicht so gefällt sind die Hardwareanforderungen. Man sollte schon 8GB Arbeitsspeicher verfügbar haben. Ich habe Rechner am Laufen die haben gar nicht so viel Speicher. Und dann kommt noch dazu, dass man alles was man vor Docker geschrieben hat erst mal von seinen init.d Skripten oder systemd Konfigurationen befreien muss um es zu "Containerizen".

Mein selbst geschriebenes, minimalistisches Monitoring besteht nun aus einem python-Skript welches jede Minute von crond aufgerufen wird. Ich habe mich dazu entschlossen die Monitoring-Regeln zwecks Einfachheit direkt im Skript abzulegen. Eine einzelne Regel sieht dann z.B. so aus:

(
    'wekan',
    # stop condition
    or_trigger(
    low_available_memory(essential_available_memory_watermark),
    watch_for('memory-limit', td(minutes=3), process_tree_memory_limit(systemd_main_process('snap.wekan.wekan.service'), memory_tolerate_factor * wekan_healthy_memory_size)),
    ),
    # stop action
    systemd_action('stop', 'snap.wekan.wekan.service'),

    # start condition
    and_trigger(
    systemd_status_is('snap.wekan.wekan.service', 'active', False),
    watch_for('memory-available', td(minutes=3), enough_available_memory(wekan_healthy_memory_size + essential_available_memory_watermark)),
    ),
    # start action
    systemd_action('start', 'snap.wekan.wekan.service'),
    )

Ich habe mir so ein paar Regeln zusammengeschnürt, die ein paar für mich nicht essentielle Dienste beenden wenn der Arbeitsspeicher knapp wird. Des weiteren werden die Dienste erst dann wieder gestartet wenn wieder genug Arbeitsspeicher verfügbar sein sollte.

Feedback

Falls der Artikel interessant war oder etwas unklar ist freue ich mich über Fragen per e-Mail an markus.peroebner@gmail.com.