Repository navigation
fix: keep the single-replica components drainable (maxUnavailable 1) - #697
Merged
Merged
Conversation
The budgets of muster, klaus-gateway, agent-manager, muster-valkey and the kagent controller were minAvailable: 1 on one replica, refusing every eviction, so a cluster upgrade rolling its machines waited for each drain's timeout. They are maxUnavailable: 1; Karpenter's consolidation stays away through the pods' do-not-disrupt annotation (#431), not the budget. A one-instance platform Postgres renders enablePDB: false: the operator's primary budget has no replica to switch over to. verify-disruption asserts all of it.
* origin/main: fix(netpol): admit the scrape of the kagent controller and atenet-egress ext-proc (#691) # Conflicts: # CHANGELOG.md
verify-gpu-pool, verify-target and verify-wiring compare against origin/main, which still renders minAvailable: 1; they hold the budgets until GOLDEN_REF carries this change. The ATS drift test edits muster's maxUnavailable instead of minAvailable.
* origin/main: feat: one OTLP collector for every exporter (global.observability.traces.otlp) (#696)
Since #696 is on main, origin/main renders the kube-system otlp-gateway default too; the hold cut it from the head only, so verify-target failed on main and on every branch after it.
* origin/main: fix(substrate): keep Substrate's metrics on the scrape path (#694) # Conflicts: # tests/verify-target.py
Published Helm chart
|
| Chart | agent-platform |
| Version | 4.76.1-re950fef2t20260925110702hd55a40c |
| OCI reference | oci://gsoci.azurecr.io/charts/giantswarm/agent-platform:4.76.1-re950fef2t20260925110702hd55a40c |
| Digest | sha256:461dc3b534ec3e4447e13576102a26549c0ae37ba9f7f211b0c4ba66ff87c150 |
| Registry | public — gsoci.azurecr.io |
| Git catalog | giantswarm-test-catalog (index) |
Pull this chart
helm pull oci://gsoci.azurecr.io/charts/giantswarm/agent-platform --version 4.76.1-re950fef2t20260925110702hd55a40cPosted by architect-orb · build 14336 · commit d55a40c · updated in place on every push
Published Helm chart
|
| Chart | agent-platform-connectivity |
| Version | 4.76.1-re950fef2t20260925110702hd55a40c |
| OCI reference | oci://gsoci.azurecr.io/charts/giantswarm/agent-platform-connectivity:4.76.1-re950fef2t20260925110702hd55a40c |
| Digest | sha256:3282f527bd0673ce97586a70d7fea6fb4a8a01a72f2d58c1c9ab09e5ffbc391f |
| Registry | public — gsoci.azurecr.io |
| Git catalog | giantswarm-test-catalog (index) |
Pull this chart
helm pull oci://gsoci.azurecr.io/charts/giantswarm/agent-platform-connectivity --version 4.76.1-re950fef2t20260925110702hd55a40cPosted by architect-orb · build 14338 · commit d55a40c · updated in place on every push
Member
Author
|
From Timo's agent: released as v4.76.1, rolled onto a production installation, and every HelmRelease there is Ready.
|
teemow
added a commit
that referenced
this pull request
Sep 25, 2026
…en-606 * origin/main: (28 commits) feat(dashboards): turn done (final flush) p50 and p95 on Klaus Gateway (#701) feat: the managers', the portal's and mcp-kubernetes' traces to the platform's OTLP gateway (#700) feat(kagent): compact agent histories only past 600000 tokens (#699) fix: keep the single-replica components drainable (maxUnavailable 1) (#697) feat(model-serving): export the model pods' traces to the platform's OTLP gateway (#695) fix(substrate): keep Substrate's metrics on the scrape path (#694) feat: one OTLP collector for every exporter (global.observability.traces.otlp) (#696) fix(netpol): admit the scrape of the kagent controller and atenet-egress ext-proc (#691) fix(serving): make the models Gateway an internet-facing NLB on AWS (#692) fix(model-manager): reach the workload clusters' API servers (#689) feat(components): the CloudNativePG operator chart and image from gsoci (#671) fix(serving): tear the serving slice down in order, configs freed (#679) fix: derive the managers' OAuth login from muster's OAuth server (#678) feat(model-serving): stamp the cache claim's tier as annotations (#676) fix(substrate): the capz snapshot-store identity holds Storage Blob Delegator on the account (#686) fix(connectivity): the egress gateway reaches the Substrate credential provider (#685) feat(llm-routing): route the LLM endpoint by model, with API keys (#672) feat: the kagent line and the Substrate line at 1.1.0 (#665) fix(model-manager): read served models wherever model-manager serves (#681) feat(model-serving): check every shipped preset's parsers by model family (#674) ... # Conflicts: # CHANGELOG.md # tests/verify-gpu-pool.py
teemow
added a commit
that referenced
this pull request
Sep 25, 2026
…reset-597 * origin/main: (28 commits) feat(dashboards): turn done (final flush) p50 and p95 on Klaus Gateway (#701) feat: the managers', the portal's and mcp-kubernetes' traces to the platform's OTLP gateway (#700) feat(kagent): compact agent histories only past 600000 tokens (#699) fix: keep the single-replica components drainable (maxUnavailable 1) (#697) feat(model-serving): export the model pods' traces to the platform's OTLP gateway (#695) fix(substrate): keep Substrate's metrics on the scrape path (#694) feat: one OTLP collector for every exporter (global.observability.traces.otlp) (#696) fix(netpol): admit the scrape of the kagent controller and atenet-egress ext-proc (#691) fix(serving): make the models Gateway an internet-facing NLB on AWS (#692) fix(model-manager): reach the workload clusters' API servers (#689) feat(components): the CloudNativePG operator chart and image from gsoci (#671) fix(serving): tear the serving slice down in order, configs freed (#679) fix: derive the managers' OAuth login from muster's OAuth server (#678) feat(model-serving): stamp the cache claim's tier as annotations (#676) fix(substrate): the capz snapshot-store identity holds Storage Blob Delegator on the account (#686) fix(connectivity): the egress gateway reaches the Substrate credential provider (#685) feat(llm-routing): route the LLM endpoint by model, with API keys (#672) feat: the kagent line and the Substrate line at 1.1.0 (#665) fix(model-manager): read served models wherever model-manager serves (#681) feat(model-serving): check every shipped preset's parsers by model family (#674) ... # Conflicts: # CHANGELOG.md # tests/verify-gpu-pool.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Written by Timo's agent.
Problem
These PodDisruptionBudgets are
minAvailable: 1, each on a single replica:That refuses every voluntary eviction. A cluster upgrade that rolls its machines drains each node, and the drain waits for its timeout on every node where one of these pods runs. The budgets came with #431 to keep Karpenter's consolidation off the streaming pods. But their
karpenter.sh/do-not-disruptannotation already covers that, and the budget additionally blocks every drain.Change
Budgets: each is now
maxUnavailable: 1. A drain evicts the single replica and goes on, with the usual restart gap. Karpenter's consolidation still stays away through the pods'do-not-disruptannotation, which is unchanged.muster.podDisruptionBudget→ muster chartminAvailable: ""(clears the chart's default of 1),maxUnavailable: 1klausGateway.podDisruptionBudget→ klaus-gateway chartminAvailable: "",maxUnavailable: 1kagent.controller.pdb→ kagent chartmaxUnavailable: 1agentManager.podDisruptionBudget(meta and connectivity)maxUnavailable: 1valkey.podDisruptionBudget(meta and connectivity)maxUnavailable: 1Platform Postgres: with
postgres.instances: 1, the CNPGClusterrendersenablePDB: false. The operator's budget on a lone primary has no replica to switch over to and would hold a drain. With two or more instances (the default is three), the operator's budgets stay and it switches the primary over when its node drains.Unchanged: vm-manager's
minAvailable: 1. Evicting its pod ends every VM on the node, so it is a deliberate choice outside this change.Test
make verify-disruptionpasses. It now assertsmaxUnavailable: 1on each budget and nominAvailablenext to it, the guards (both fields, neither, a loneminAvailablepasses through), andenablePDB: falseat one Postgres instance only.make verify-components-charts: every component chart renders the forwarded values, at the range resolution and at the BOM pin. muster, klaus-gateway and kagent render their budget asmaxUnavailable: 1.Checklist
values.yamlandvalues.schema.jsonare valid.