StormForge Agent releases
To install the latest version, see the Upgrade topic.
For past releases, see Previous StormForge Agent and Applier releases.
Version 3.3.1
Changed
- Dependency updates
Fixed
- LimitRange violations: The Agent now detects configured LimitRanges, so recommendations that violate them are not deployed.
Security
- Go 1.27.2: Updated to Go 1.27.2, which includes security fixes to the
crypto/tlsandnet/httppackages.
Version 3.3.0
Added
-
Node CPU pressure detection: The Agent detects Kubernetes nodes under sustained CPU pressure and identifies the workloads responsible. It reads each node’s Pressure Stall Information (PSI) from cAdvisor. When a node’s CPU pressure exceeds the detection threshold, the Agent finds the containers on that node using more CPU than they request, maps them to their workloads, and creates a recommendation with the
CPUPressureDetectedreason. Each recommendation lists the node, pod, and container, and how far CPU usage exceeded the request. Detection is always on. See CPU pressure response.The Agent reports these metrics for CPU pressure detection:
sf_container_cpu_pressure_waiting_seconds_totalsf_container_cpu_pressure_stalled_seconds_totalsf_container_cpu_pressure_waiting_ratesf_container_cpu_pressure_stalled_ratesf_workload_event_last_timestamp_seconds
Changed
- Dependency updates
Fixed
- Node metrics refresh on provider ID change: Node metrics now pick up provider IDs that are assigned late or change. Previously, node updates that changed only the provider ID were ignored.
- Provider ID sync to StormForge API: When cluster data is enabled, the Agent sends a node’s provider ID to the StormForge API whenever it changes. Previously, it was sent only when a node was added or its labels changed.
Version 3.2.0
Added
- GPU optimization (early access): StormForge can now collect GPU metrics for workloads that use NVIDIA GPUs and show per-workload GPU memory usage and GPU allocation alongside device-level GPU activity. See GPU optimization.
- StormForge Node Agent: A new optional DaemonSet,
stormforge-node-agent, collects the GPU metrics from GPU nodes. It is disabled by default; enable it with--set nodeAgent.enabled=true. See Node Agent configuration. - GPU workload detection: Workloads that request a GPU, whether through a GPU extended resource such as
nvidia.com/gpuor through a Dynamic Resource Allocation resource claim, are identified by StormForge. Detection needs no configuration and does not require the Node Agent.
Changed
- Dependency updates
Version 3.1.3
Changed
- Dependency updates
Fixed
- Recommendation status update conflict: Resolved a conflict between the pod admission webhook and the Applier when updating recommendation status.
Version 3.1.2
Added
- Applier alerts change diffs: Applier alerts sent to external endpoints when the applier applies recommendations now include full before-and-after diffs for resources that were changed.
Changed
- Performance improvements
- Dependency updates
Fixed
- Missing RBAC for Events: The Applier now includes RBAC to allow creating and patching Events when use of the Edit role is disabled.
- Stale cost metric retention: The Agent now correctly removes cost-related metrics for deleted pods not owned by workload types StormForge recognizes. Previously, some of these metrics were retained until the Agent restarted.
Version 3.1.1
Fixed
- OpenShift pod scheduling: The consolidated v3 chart no longer applies a hardcoded pod
securityContext(fsGroup/runAsGroup/runAsUser: 65534) whenopenshift=trueandcommonPodSecurityContextis unset.
Version 3.1.0
The agent parameter group is renamed to clusterAgent, and exporter to forwarder. The deprecated agent.* and exporter.* values still work, overriding their clusterAgent.* and forwarder.* equivalents, and will be removed in a future major version. Update your values when convenient.
Added
- JVM old-gen live-set metric: The forwarder (formerly
exporter) now collectsjvm_memory_pool_collection_used_bytesfor live data size transforms. - Chart
deepOverridehelper: Explicit-zero-preserving merge helper so intentional0values in overrides are no longer dropped.
Changed
exportercomponent renamed toforwarder: TheexporterHelm values key is renamed toforwarder. The old key is deprecated but still works (see the note above).agentcomponent renamed tocluster-agent: TheagentHelm values key is renamed toclusterAgent, and the agent config file tocluster-agent.yml. The old key is deprecated but still works (see the note above); the config file is passed via--config, so no action is needed for it.- Webhook injection scope narrowed to the applier’s own pods: The mutating webhook exclusion no longer covers the entire release namespace. It now skips only pods labeled
webhook.stormforge.io/skip(which the applier carries). As a result:- StormForge’s own workloads in the release namespace become eligible for webhook-based apply.
- The release namespace may now appear in
allowNamespaces. - Helm 4 server-side-apply upgrades work without
--force-conflicts.
- Quieter logging: Pod spec generation failures now log at debug instead of error.
- Dependency updates
Fixed
-
Applier init container fails behind a corporate CA/proxy: The applier init container (
applier license-check, which calls the StormForge API over TLS) now mountsadditionalVolumeMounts. Previously it mounted no volumes, so customers injecting a corporate CA cert hitx509: certificate signed by unknown authorityduring init and the pod never started. Restores the 2.x chart behavior and matches theadditionalVolumeMountsdocs (“added to all containers”). -
SuspendStateevent silently skipped: The applier Deployment now projectsPOD_NAME/POD_NAMESPACEfrom the downward API, so the applier can resolve its own Deployment and emit theSuspendStateevent on startup (for example, when settingsuspend=All). Previously this failed withErrSelfPodEnvUnsetand only logged a warning.
Version 3.0.0
Version 3.0.0 unifies all StormForge components into a single Helm chart. Upgrading from the v2 Agent and Applier charts requires migration — see Migrate v2 → v3.
Added
-
Unified
stormforgeHelm chart: New chart that bundles the workload-agent and the applier in a single installation, replacing the separatestormforge-agentchart. Required values are the same (clusterName,authorization.clientID,authorization.clientSecret). Breaking change — replacesstormforge-agent. -
workloadResourceKindsmodel: A single list replaces the two parallel v2 parameters (workloadResourceTypes+ownerResourceTypes). Each entry carries an explicitrolefield —workload,conditionalWorkload,owner,ignoredOwner— eliminating the ambiguity of separate lists.patchTargetDefaults(renamed frompatchTargetTypeDefaults) is set per entry; the chart injects the requiredlive.stormforge.io/prefix internally. Breaking change — see Migrate v2 → v3. -
includeCommonAddOnResourceKinds: ReplacesincludeCommonAddOnResourceTypes, enabled by default. Prepends curated entries for Argo Rollouts, Prometheus operator, OpenTelemetry collector, KEDA, and Dynatrace.
Changed
-
CRDs are now Helm-managed: CRDs moved from
crds/totemplates/crds/so they upgrade in lockstep with the chart.crds.enabled(defaulttrue) opts out for out-of-band CRD management;crds.keep(defaulttrue) prevents cascade-delete on uninstall. Breaking change — upgrade note below. -
cAdvisor scrape method auto-detected: The
CadvisorDirectScrapeconfig flag is removed. The scrape method is now inferred automatically from theinstancelabel on incoming PSI metrics. -
PSI waiting-rate uses a time-weighted window: The fixed-sample-count ring buffer is replaced with timestamped samples averaged over a configurable
WaitingAverageWindow. TheSampleIntervalconfig field is removed; setWaitingAverageWindow(default10m) instead. Stale samples outside the window are excluded regardless of scrape cadence changes.
Upgrade note — CRD ownership transfer
CRDs previously installed from the crds/ directory carry no Helm ownership metadata. The first helm upgrade onto v3.0.0 may fail with “invalid ownership metadata.” Remediation options:
- Helm ≥ 3.17: run the upgrade once with
--take-ownership - GitOps / older Helm: label and annotate the existing CRDs before upgrading:
kubectl label crd <name> app.kubernetes.io/managed-by=Helm --overwrite kubectl annotate crd <name> \ meta.helm.sh/release-name=<release> \ meta.helm.sh/release-namespace=<namespace> --overwrite