• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

kubernetes-sigs / karpenter / 35279361127
84%
main: 83%

Build:
Build:
LAST BUILD BRANCH: node-repair-01-voluntary
DEFAULT BRANCH: main
Ran 17 Sep 2026 10:13PM UTC
Jobs 1
Files 186
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

17 Sep 2026 09:51PM UTC coverage: 83.497% (+0.1%) from 83.352%
35279361127

Pull #3311

github

DerekFrank
feat: make node repair a voluntary disruption method

Retire the standalone node.health controller and its hardcoded 20% breaker;
node repair now runs as a voluntary disruption method (reason "Unhealthy"):

- Budgeted via spec.disruption.budgets (default 10%); the Unhealthy budget
  excludes still-unhealthy nodes from its own count while other reasons keep
  counting them. Retains a 20% circuit breaker as an interim correlated-failure
  backstop (to be replaced by #3031); the budget paces concurrent repairs under it.
- Ordered by rank + age/tau: score() argmaxes over a node's ELIGIBLE conditions
  (not just its highest-priority one) over a dense-ranked integer-priority set.
- matchRepairPolicy returns the highest-priority ELIGIBLE condition, governing
  eligibility and the drain-bound action; the breaker's census counts matches
  regardless of toleration.
- Pre-spins a replacement and terminates the original only once it is healthy
  (replace-then-terminate); a replacement that never comes up healthy never
  terminates the original.
- Vetoable via a do-not-repair annotation, distinct from do-not-disrupt (which
  repair ignores); repair is never stranded by a blocking pod.
- Per-candidate TerminationGracePeriod (min of matched policy and NodeClaim TGP)
  stamped as the termination deadline at actual deletion time.
- Registered only when the NodeRepair feature gate is on; NewRepair panics if the
  provider defines no RepairPolicies.
- Re-adds karpenter_nodeclaims_unhealthy_disrupted_total, emitted at termination.

Follow-ups: correlated-failure restraint / backoff (#3031, #3178); reason-aware
matching (#3263); termination contract (#3029); do-not-disrupt overlap (#2424).
Pull Request #3311: feat: node repair as voluntary disruption

216 of 238 new or added lines in 8 files covered. (90.76%)

1 existing line in 1 file now uncovered.

17536 of 21002 relevant lines covered (83.5%)

78157.91 hits per line

Uncovered Changes

Lines Coverage ∆ File
15
89.58
pkg/controllers/disruption/repair.go
3
82.29
0.4% pkg/controllers/disruption/queue.go
3
87.53
-0.33% pkg/controllers/state/statenode.go
1
0.0
0.0% pkg/controllers/controllers.go

Coverage Regressions

Lines Coverage ∆ File
1
0.0
0.0% pkg/controllers/controllers.go
Jobs
ID Job ID Ran Files Coverage
1 35279361127.1 17 Sep 2026 10:13PM UTC 186
83.5
GitHub Action Run
Source Files on build 35279361127
  • Tree
  • List 186
  • Changed 12
  • Source Changed 0
  • Coverage Changed 12
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Pull Request #3311
  • PR Base - main (#35157266801)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc