Highlights
Savings numbers are the request gap that is still left, with one series per policy. A pod that is already at its recommendation adds nothing.
Schedule windows, quota, and template updates are stricter about when a change is written.
Bug fixes
-
Savings gauges mixed policies and counted a resize as money already saved.
attune_savings_cpu_cores_total,attune_savings_memory_bytes_total, andattune_savings_estimated_monthly_dollarsnow have apolicylabel. The value is the live request minus the current recommendation. After an in-place resize that lands on the recommendation, that pod's gap is 0. The overview stats are titled "CPU request gap", "Memory request gap", and "Estimated monthly request gap" (#1078, #1081, #1083, #1103). -
A policy that only set ConfigMap export could start opening pull requests. Omitted
export.configMapand omittedexport.pullRequesteach inherit from AttuneDefaults. ExplicitconfigMap: falsestays off. SetpullRequest.enabled: falseon a policy that should only write ConfigMaps (#1084, #1091, #1092). -
kubectl attunehid an inherited ConfigMap export. The EXPORT column and the empty-export tip use the effective setting, including AttuneDefaults (#1092). -
Days of week with no time windows looked like no schedule. Other days still skip resizes and set
ScheduleBlocked. The status text says workload changes are deferred, not only resizes (#1098, #1099). -
Template writes ignored the schedule, or published a failed attempt.
OnRecommendationwaits until the window is open.AfterSuccessfulResizecan still retry a write that already succeeded inside the window. A later failed resize does not copy that attempt's limits onto the template, and it does not shrink the last applied request down to an older lower limit (#1097, #1101, #1103). -
A multi-container increase could leave the pod only partly resized. Attune counts quota already used by earlier increases in the same cycle, and skips the next container before the API server rejects it. The skip is still an operator log and a
ResizeSkippedevent (#1100). -
A failed safety rollback could be recorded as a success, or an older success could be rewritten. A rollback that does not land is marked
Failed. A later successful rollback can mark that cycleReverted. If the newest history row is alreadyRevertedorFailed, an olderSuccessrow is left alone (#1093, #1103). -
Workload status dropped the line that explains a missing object. The error list stays within its cap, and a
workloadRefrow stays when that same workload also has a selector error (#1091, #1103). -
A runtime profile could lose to cluster defaults. Java, Python, and Node.js fill
allowDecreasebefore AttuneDefaults, and Java fills overhead40before AttuneDefaults. A value set on the policy still wins (#1084).
Upgrading
Existing policy YAML still applies. Upgrade the chart to 0.1.36, or set the image tag to 0.1.36 or v0.1.36. The image is built with Go 1.27.3.
Apply the 0.1.36 CRDs before or with the controller. Helm does not update CRDs on helm upgrade. The CRD text for export.configMap and workloadErrors changed. The schema still accepts the same YAML.
If a policy already has an export block and does not set pullRequest, it now inherits AttuneDefaults. To keep pull requests off, set pullRequest.enabled: false on that policy.
Savings alerts that summed the gauges still work. The number is the remaining request gap, not lifetime savings, and each policy is its own series.
Kubernetes support stays 1.32 and newer. On 1.33, an in-place memory limit decrease is still refused when the resize policy is NotRequired. Use RestartContainer or move to 1.34 or newer. MemoryLimitClamped is a Warning event.
Guide: Upgrading.