What's New in v0.1.29
v0.1.29 keeps GPU, hugepages, and other extended resources on live /resize, and it fails closed when HPA cannot be listed or when CREATE would re-admit a just-reverted size. OneShot now records envelope skips the same way Auto already did.
Highlights
- Live
/resizeand safety revert overlay CPU and memory only. GPU, hugepages, and ephemeral-storage stay on the pod. - CREATE no longer sizes a new pod while HPA cannot be listed, or from a recommendation that was just safety-reverted.
- OneShot emits
ResizeSkippedand a Failedenvelope_constrainthistory row when every needing replica is blocked.
Live resize and persist
-
A successful in-place resize or safety revert dropped GPU, hugepages, and ephemeral-storage. Apply now overlays CPU and memory on the live request map. Template persist still writes only CPU and memory, so those extra keys stay on the pod (#800).
-
A Safe pod could have its workload template rolled back to the pre-resize snapshot. AfterSuccessfulResize restore-retry now requires a real
Revertedhistory row, not a live request that happens to match the clamped revert target (#816). -
One Failed history row on a single replica blocked template persist for the whole workload. Persist now omits only the pod and container that failed or reverted (#816).
-
Envelope math counted run-to-completion init containers. The required envelope is the running-container sum only (#816).
OneShot, budget, and startup boost
-
OneShot stayed silent when every needing replica was blocked by the envelope (or another skip). The walk still prefers a replica that can apply. If none can, it keeps the first blocked pod so you get
ResizeSkippedand Failed history, matching Auto (#817). -
OneShot could pick a startup-boosted replica every cycle and starve the others. Boost-window CPU decreases are walked past the same way QoS and node-pressure skips already were (#816).
-
A pod that later skipped still consumed
MaxTotalCPUIncrease, so a later replica was deferred with a misleading BudgetExhausted event. Envelope and boost skips do not consume that budget (#816, #817). -
Pods that Attune never boosted were stamped
startup-boost-at, then shrunk at expiry outside the resize pipeline. The stamp is written only after a successful boost/resize. Expiry of a never-boosted stamp no longer shrinks the pod (#816). -
Startup boost with CPU
RequestsAndLimitsadded a memory limit to containers that never had one. Requests-and-limits boost now raises CPU dest only (#816). -
CREATE applied a startup CPU boost to Job and CronJob pods, but expiry skips batch workloads, so the boost never ended. CREATE no longer boosts Job or CronJob pods (#816).
-
A leftover Running pod under HPA
ScaledToZerocould still receive a startup boost. Boost now treats ScaledToZero as idle, matching persist and in-place resize. A malformedattune.io/startup-boost-atblocks CPU decrease the same way a failed expiry already did (#781).
CREATE admission and HPA
-
CREATE sized new pods from leftover recommendations while
ResizeBlocked=HPAListUnavailable. CREATE now fails closed on HPA list errors, the same as VPA list errors already did (#781). -
CREATE admitted new pods at a recommendation that was just safety-reverted. Initial sizing now respects
Revertedhistory (#816). -
A CronJob pod could be admitted unsized when its Job was not yet in the informer cache. Admission now reads the Job from the API so the CronJob owner can still be found (#816).
-
HPA auto-tune summed CPU across every resized pod, so the target depended on how many replicas had already resized. Retune is per-pod From/To. RequestsAndLimits still caps that dest at 100% of the recommendation dest (#816).
-
ContainerResource HPA metrics on sidecars were left pointing at the old request after a main-container resize. Those metrics are retuned with the resized container (#800).
-
VPA missing-resource hold used the max live request across pods, including startup-boosted replicas, so the hold only ratcheted up. The hold now ignores temporary boost stamps (#816).
Safety, CRD, and kubectl
-
An immediate safety revert did not stamp cooldown, so the same recommendation could be re-applied on the next reconcile. Cooldown is stamped after that revert (#816).
-
minAllowed/maxAllowedCEL rejected bare integers that v0.1.26 accepted. The rule type-guardsquantity()so integer-or-string values work again (#816). -
kubectl attune doctorcould print Ready while a list or webhook check had failed. Ready is True only when every required check passed (#800).
Compatibility
| Surface | Requires |
|---|---|
| Existing policies | Unchanged on Kubernetes 1.32+ |
Bare integer minAllowed / maxAllowed
| Accepted again (v0.1.26 behavior restored) |
| Tested Kubernetes versions | 1.32 through 1.36 (1.37 experimental) |
Upgrade notes
- Upgrade the chart to 0.1.29, or set
image.tagto0.1.29orv0.1.29. - Pull
ghcr.io/attune-io/attune:v0.1.29orghcr.io/attune-io/attune:0.1.29. Both tags point at the same digest. - Apply CRDs before
helm upgradeso the restored integer-or-string CEL rule is on the cluster (kubectl apply --server-side --force-conflictsfrom the releasecrds.yaml). - OneShot policies that were blocked by a pod-level envelope now show
ResizeSkippedand Failed history instead of looking idle. Auto already did this. - Scripts that assumed CREATE would still size while HPA could not be listed will now see those pods admitted at template size until the list succeeds.
See Upgrading for envelope, HPA idle, and OneShot notes from earlier releases.