From a8e2bb025b68c5b9ff83fbca9dc1f1c82b8aa344 Mon Sep 17 00:00:00 2001 From: Joris Wouter Jonkers Date: Tue, 18 Aug 2026 22:17:00 +0200 Subject: [PATCH] fix(observability): schedule pyroscope on frankfurt as intended MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pyroscope HelmRelease carried `nodeSelector.personal-stack/site: frankfurt` at the top level of `values`. The chart reads scheduling keys under its own `pyroscope` key, so Helm discarded the top-level entry and the pod was scheduled without any constraint — it landed on enschede-gtx-960m-1, a 2015 laptop, and has run there for 109 days. Nesting the selector under `pyroscope` makes the constraint take effect. `placement_intent.frankfurt_only` gains a `pyroscope` entry so the inventory states the same intent the release does. This moves roughly 17m of steady CPU and 120 MiB off a node whose entire CPU baseline is 1160m, of which only 284m was workloads. The existing 20Gi volume is `local-path` with a `kubernetes.io/hostname` nodeAffinity pinning it to enschede-gtx-960m-1, so it cannot follow the pod. The PVC has to be deleted for the StatefulSet to provision a fresh one on frankfurt, which discards accumulated profile history. Profiles are short-horizon debugging data and the retention loss is accepted. --- .../cluster/flux/apps/observability/pyroscope/release.yaml | 7 +++++-- platform/inventory/fleet.yaml | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/platform/cluster/flux/apps/observability/pyroscope/release.yaml b/platform/cluster/flux/apps/observability/pyroscope/release.yaml index cce4fd41..acfcce53 100644 --- a/platform/cluster/flux/apps/observability/pyroscope/release.yaml +++ b/platform/cluster/flux/apps/observability/pyroscope/release.yaml @@ -33,8 +33,11 @@ spec: limits: cpu: 1000m memory: 2Gi - nodeSelector: - personal-stack/site: frankfurt + # The chart reads scheduling keys under `pyroscope`, not at the top + # level of values. A top-level `nodeSelector` is silently discarded, + # which is how this landed on enschede-gtx-960m-1 instead. + nodeSelector: + personal-stack/site: frankfurt # No public ingress; Grafana datasource talks to it over the cluster # service URL. Profiles never leave the cluster. minio: diff --git a/platform/inventory/fleet.yaml b/platform/inventory/fleet.yaml index 45194c48..36a3e3a5 100644 --- a/platform/inventory/fleet.yaml +++ b/platform/inventory/fleet.yaml @@ -285,6 +285,7 @@ placement_intent: - headlamp - obsidian-sync - knowledge-api + - pyroscope enschede_only: - downloads