github attune-io/attune v0.1.36

36 minutes ago

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, and attune_savings_estimated_monthly_dollars now have a policy label. 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.configMap and omitted export.pullRequest each inherit from AttuneDefaults. Explicit configMap: false stays off. Set pullRequest.enabled: false on a policy that should only write ConfigMaps (#1084, #1091, #1092).

  • kubectl attune hid 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. OnRecommendation waits until the window is open. AfterSuccessfulResize can 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 ResizeSkipped event (#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 cycle Reverted. If the newest history row is already Reverted or Failed, an older Success row is left alone (#1093, #1103).

  • Workload status dropped the line that explains a missing object. The error list stays within its cap, and a workloadRef row 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 allowDecrease before AttuneDefaults, and Java fills overhead 40 before 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.

Full changelog

v0.1.35...v0.1.36

Don't miss a new attune release

NewReleases is sending notifications on new releases.