fix(gatus): reload the pod when its config changes #700

Merged
k.renner merged 1 commits from gatus-config-reload into master 2026-08-28 09:45:15 +00:00
Member

Das Entfernen des PBS-2-Checks in #699 hat sauber reconciled und nichts bewirkt.

Nachgemessen nach dem Merge:

ConfigMap im Cluster:   Web Service 1..10, Infrastructure 3, Infrastructure 4
Laufende Instanz:       Web Service 1..10, Infrastructure 1, Infrastructure 3, Infrastructure 4
                                           ^^^^^^^^^^^^^^^^

Gatus liest seine Konfiguration einmal beim Start und nie wieder. Der Pod ist 26 Stunden alt.

Warum das von außen richtig aussieht

Flux meldet die Kustomization als applied, die ConfigMap stimmt mit git überein, keine Ressource ist im Fehlerzustand. Das einzige Symptom ist, dass die vom Dienst ausgelieferte Endpunktliste der im Repo widerspricht.

Das gilt in beide Richtungen: einen Check hinzuzufügen wäre genauso unsichtbar geblieben wie einen zu entfernen. Jede Gatus-Änderung seit dem Deploy vor 111 Tagen hätte einen manuellen Pod-Neustart gebraucht.

Die Fähigkeit war längst da

Reloader läuft seit 40 Tagen cluster-weit (kube-system/reloader-reloader), und elf andere Workloads tragen seine Annotation bereits — in den Namespaces apps, home-assistant, woodpecker, wordpress und authentik. Gatus hat schlicht nie eine bekommen.

Die Annotationsform für ConfigMaps ist gegen Upstream verifiziert, nicht aus dem Gedächtnis: configmap.reloader.stakater.com/reload nimmt den ConfigMap-Namen. Die elf vorhandenen sind alle secret.…, diese Variante nutzte hier noch niemand.

Preis

Der Pod startet beim Reload neu, und das Deployment nutzt Recreate wegen seines RWO-Volumes. Die Statusseite hat also bei jeder Konfigänderung eine kurze Lücke. Das ist der richtige Tausch gegen Checks, die still nicht mehr dem Repo entsprechen.

Bewusst nicht angefasst

Das Deployment verletzt PodSecurity restricted an vier Stellen (allowPrivilegeEscalation, capabilities, runAsNonRoot, seccompProfile) — sichtbar als Warnung beim Dry-Run. Das ist älter als diese Änderung und eine eigene Sache.

Nach dem Merge

Ich prüfe, dass der Pod tatsächlich neu startet und die laufende Instanz danach zwölf Endpunkte ohne Infrastructure 1 meldet. Ein Neustart von Hand kommt nicht in Frage — das würde genau den Mechanismus überspringen, den dieser PR testet.

Das Entfernen des PBS-2-Checks in #699 hat sauber reconciled und **nichts bewirkt**. Nachgemessen nach dem Merge: ``` ConfigMap im Cluster: Web Service 1..10, Infrastructure 3, Infrastructure 4 Laufende Instanz: Web Service 1..10, Infrastructure 1, Infrastructure 3, Infrastructure 4 ^^^^^^^^^^^^^^^^ ``` Gatus liest seine Konfiguration **einmal beim Start** und nie wieder. Der Pod ist 26 Stunden alt. ## Warum das von außen richtig aussieht Flux meldet die Kustomization als applied, die ConfigMap stimmt mit git überein, keine Ressource ist im Fehlerzustand. Das einzige Symptom ist, dass die vom Dienst ausgelieferte Endpunktliste der im Repo widerspricht. Das gilt in beide Richtungen: einen Check **hinzuzufügen** wäre genauso unsichtbar geblieben wie einen zu entfernen. Jede Gatus-Änderung seit dem Deploy vor 111 Tagen hätte einen manuellen Pod-Neustart gebraucht. ## Die Fähigkeit war längst da Reloader läuft seit 40 Tagen cluster-weit (`kube-system/reloader-reloader`), und **elf andere Workloads** tragen seine Annotation bereits — in den Namespaces `apps`, `home-assistant`, `woodpecker`, `wordpress` und `authentik`. Gatus hat schlicht nie eine bekommen. Die Annotationsform für ConfigMaps ist **gegen Upstream verifiziert**, nicht aus dem Gedächtnis: `configmap.reloader.stakater.com/reload` nimmt den ConfigMap-Namen. Die elf vorhandenen sind alle `secret.…`, diese Variante nutzte hier noch niemand. ## Preis Der Pod startet beim Reload neu, und das Deployment nutzt `Recreate` wegen seines RWO-Volumes. Die Statusseite hat also bei jeder Konfigänderung eine kurze Lücke. Das ist der richtige Tausch gegen Checks, die still nicht mehr dem Repo entsprechen. ## Bewusst nicht angefasst Das Deployment verletzt PodSecurity `restricted` an vier Stellen (`allowPrivilegeEscalation`, `capabilities`, `runAsNonRoot`, `seccompProfile`) — sichtbar als Warnung beim Dry-Run. Das ist älter als diese Änderung und eine eigene Sache. ## Nach dem Merge Ich prüfe, dass der Pod tatsächlich neu startet und die laufende Instanz danach zwölf Endpunkte ohne `Infrastructure 1` meldet. Ein Neustart von Hand kommt nicht in Frage — das würde genau den Mechanismus überspringen, den dieser PR testet.
claude-bot added 1 commit 2026-08-28 09:44:43 +00:00
fix(gatus): reload the pod when its config changes
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
1d8ba05123
Dropping the PBS 2 check in the previous commit reconciled cleanly and changed
nothing. The ConfigMap in the cluster no longer lists it; the running instance
still reports Infrastructure 1, because Gatus reads its config once at startup
and the pod is 26 hours old.

Nothing about that state looks wrong from the outside. Flux reports the
Kustomization applied, the ConfigMap matches git, and no resource is failing —
the only symptom is that the endpoint list served by the app disagrees with the
one in the repo. Adding a check would have been just as invisible as removing
one.

Reloader has been installed cluster-wide for 40 days and eleven other workloads
already carry its annotation, across the apps, home-assistant, woodpecker,
wordpress and authentik namespaces. Gatus was simply never given one. The
annotation form for a ConfigMap is confirmed against upstream rather than
recalled: configmap.reloader.stakater.com/reload takes the ConfigMap name.

The pod restarts on reload and the deployment uses Recreate for its RWO volume,
so the status page has a short gap whenever the config changes. That is the
correct trade against serving checks that silently no longer match the repo.

Not addressed: the deployment trips PodSecurity restricted on four counts
(allowPrivilegeEscalation, capabilities, runAsNonRoot, seccompProfile). That
predates this and is its own change.
k.renner merged commit 64462f540a into master 2026-08-28 09:45:15 +00:00
Sign in to join this conversation.