Skip to content

feat(arc): let a sized profile's runner pods overflow onto burst nodes - #26

Merged
Mearman merged 1 commit into
mainfrom
feat/burst-overflow
Sep 30, 2026
Merged

Mearman merged 1 commit into
mainfrom
feat/burst-overflow

Conversation

@Mearman

@Mearman Mearman commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

Adds an optional burst key to a scale-set profile, for fleets whose fixed nodes can overflow onto nodes a cluster autoscaler launches on demand (cloud instances that join the cluster labelled and tainted, and carry no eligibility label).

With burst set, the runner pods drop the eligibility nodeSelector for a required node affinity that accepts either the eligibility label or burst.node_label_key (any value, or one of node_label_values), plus a preferred term at the highest weight for nodes without the burst label, so the scheduler keeps using the fixed pool while it has room. burst.tolerations goes on the pod template. The listener keeps the eligibility nodeSelector so it never lands on a node that can be removed.

burst.max_runners is added to the ceiling sizing derives (uniform in the filter, measured in the overlay at install time), so ARC creates more pods than the fixed nodes hold and the surplus pends until the autoscaler adds a node. It needs sizing and rejects max_runners and autoscale on the same profile, since an explicit ceiling is final and the usage-driven autoscaler has no notion of nodes that do not exist yet.

A profile without burst renders exactly as before. The placement logic is a new arc_runner_placement filter with unit tests, and tests/unit/test_scale_set_overlay.py renders the real overlay through ansible-playbook for both paths.

A scale-set profile can now set burst: the label a cluster autoscaler's
burst nodes carry, tolerations for their taint, and how many runners
those nodes hold at most.

The runner pods then trade the eligibility nodeSelector for a required
node affinity accepting either the eligibility label or the burst label,
with a preferred term that keeps them on the fixed nodes while those
have room. The listener keeps the eligibility nodeSelector.

burst.max_runners is added to the ceiling sizing derives, uniform or
measured, so ARC creates more runner pods than the fixed nodes hold and
the extra ones pend until the autoscaler adds a node. A profile without
burst renders exactly as before.
@Mearman
Mearman marked this pull request as ready for review September 30, 2026 08:30
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
🔒 Security Review ✅ Completed 2026-09-30T08:38:31.975283Z 1c2eb58 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@Mearman
Mearman merged commit 94a0b2b into main Sep 30, 2026
20 checks passed
@Mearman
Mearman deleted the feat/burst-overflow branch September 30, 2026 08:39
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 1.6.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant