Skip to content
Release Radar

Kubernetes event-driven autoscaling

v2.21.054 days after v2.20.2
View on GitHub

Release history

v2.21.0

CompareGitHub

We are happy to release KEDA 2.21.0 🎉

[!IMPORTANT] KEDA 2.21.0 contains three breaking changes. If you are upgrading from KEDA 2.20, review Upgrading from KEDA 2.20 to 2.21 before upgrading.

Before upgrading from KEDA 2.20

Service account token audience enforcement (CVE-2026-77524)

KEDA 2.21 fixes the critical CVE-2026-77524 / GHSA-637c-6jxx-4rwm. You are affected if you use:

  • Vault Kubernetes authentication, including configurations using the operator token, an existing projected token, or credential.serviceAccountName.
  • Any TriggerAuthentication or ClusterTriggerAuthentication using boundServiceAccountToken, including integrations with Metrics API, Prometheus, Loki, Datadog Cluster Agent, and other token-authenticated receivers.

You are not affected if you use ordinary Vault token authentication, API keys, OAuth credentials, or another authentication method that does not use a bound service account token. Before upgrading, review carefully the upgrade guide

Temporal Rules-Based Versioning settings

The Temporal scaler no longer accepts the deprecated buildId, selectAllActive, and selectUnversioned settings. Existing ScaledObjects and ScaledJobs containing them will fail scaler metadata parsing. Remove the settings for unversioned workers, or migrate versioned workers to workerDeploymentName and workerDeploymentBuildId. See Temporal Rules-Based Versioning settings.

Azure Pipelines in-flight jobs

KEDA 2.21 adds scaleOnInFlight, defaulting to true. Queue length now includes unfinished jobs already assigned to an agent. Set scaleOnInFlight: false to retain the unassigned-only behavior from KEDA 2.20; for ScaledJobs, combine this with the accurate scaling strategy. See Azure Pipelines in-flight jobs.

Highlights

  • Reduce redundant scaler-backend requests when the HPA already owns the scaling decision (#7999, #8031).
  • Add Azure Cosmos DB Change Feed, ClickHouse, and GCP Cloud Spanner scalers.
  • Let external scalers update HPA targets dynamically through StreamMetricSpec, and expose external-scaler gRPC client metrics.
  • Add Prometheus OAuth2 client-credentials authentication, Kafka Kerberos credential-cache support, and Azure Pipelines service-principal authentication.
  • Improve scaler and authentication lifecycles with deterministic cancellation, refresh handling, Kubernetes API timeouts, and external-scaler connection cleanup.

Deprecation notice

The Liiklus scaler is deprecated because the upstream project is unmaintained. Its code is planned for removal in a later KEDA release. See #7929.

Learn how to deploy KEDA by reading our documentation.

🗓️ The next KEDA release is currently estimated for the 2nd week of January 2027. Learn more in our roadmap.

Breaking Changes

Deprecations

  • 5744068: Liiklus Scaler: Deprecate the scaler because its upstream project is unmaintained; removal is planned for a later KEDA release (#7938, #7929) (@Copilot)

New

Improvements

…(truncated)

Release KEDA v2.20.2 :rocket:

⚠️⚠️⚠️⚠️ ⚠️ Please read upgrade notes if you are upgrading from version < 2.20.0: https://github.com/kedacore/keda/releases/tag/v2.20.0 ⚠️⚠️⚠️⚠️⚠️

Improvements

  • General: Introduce a dedicated HPAActive condition on ScaledObject mirroring the HPA's own ScalingActive status, so transient HPA metric gaps no longer flip the Ready condition to False (#7914)

Fixes

  • General: Fix concurrent map writes panic in the shared root CA CertPool (#7910)
  • General: Fix nil pointer dereference in AWS Secret Manager TriggerAuthentication when awsSecretManager.credentials is omitted and no awsSecretManager.podIdentity is set (#7927)
  • General: Fix nil pointer dereference in customScalingStrategy.GetEffectiveMaxScale when customScalingQueueLengthDeduction is omitted; the optional field is now treated as zero deduction instead of panicking (#7798)
  • General: Fix nil pointer dereference in GetCurrentReplicas when a Deployment/StatefulSet/ReplicaSet is returned from the informer cache with an undefaulted spec.replicas; a nil value is now treated as the Kubernetes default of 1 instead of panicking (#7863)
  • General: Fix ScaledJob CRD validation to include "default" as a valid value for scalingStrategy.strategy (#7855)
  • General: Guard GetCurrentReplicas against nil Status.ScaleTargetGVKR to prevent operator panics under the cache race documented in (#4389) / (#4955)
  • General: Restore core "" API group in events RBAC so that client-go's event broadcaster can write legacy events (#7922)
  • General: Restore gRPC reconnect backoff in the metrics service client; an unset Backoff in WithConnectParams disabled backoff and caused a zero-delay reconnect loop that flooded logs when keda-operator was unreachable (#7856)
  • General: Share HTTP transports across scalers to reuse connection pools and avoid re-dial storms at high ScaledObject counts (#7789)
  • General: Treat negative external metric values as zero to prevent incorrect HPA scaling (#7880)
  • Azure Blob Storage Scaler: Fix globPattern never matching when written in path-style with a leading /, since blob names never have one (#6492)
  • MongoDB Scaler: Disconnect the client when the initial Ping fails so the background topology-monitoring connections opened by mongo.Connect are not leaked (#5612)

New Contributors

Full Changelog: https://github.com/kedacore/keda/compare/v2.20.1...v2.20.2

Release KEDA v2.20.1 :rocket:

⚠️⚠️⚠️⚠️ ⚠️ Please read upgrade notes if you are upgrading from version < 2.20.0: https://github.com/kedacore/keda/releases/tag/v2.20.0 ⚠️⚠️⚠️⚠️⚠️

Fixes

  • General: Fix concurrent map read/write data race in fallback updateStatus that caused panics when multiple triggers were scaling simultaneously (#7838)
  • General: Fix KEDAScalersStarted "Started scalers watch" event not being emitted for ScaledJobs because it shared an events.k8s.io aggregation key with the per-scaler "scaler is built" event (#7820)

New Contributors

Full Changelog: https://github.com/kedacore/keda/compare/v2.20.0...v2.20.1

We are happy to release KEDA 2.20.0 🎉

⚠️ Upgrade note: events moved to events.k8s.io (#7781)

With the Kubernetes 0.35 dependency bump, KEDA now records Kubernetes events via the events.k8s.io API group instead of the legacy core events resource. If you deploy KEDA with custom or restricted RBAC, grant the operator create/patch on events.k8s.io/events before upgrading, otherwise event recording will fail. The bundled KEDA manifests and Helm chart already include the updated permissions.

Highlights:

  • Introduce new OpenSearch Scaler
  • Introduce Elastic Forecast Scaler
  • Add scalingModifiers fallback behavior
  • Add support for AWS External ID in TriggerAuthentication podIdentity for all AWS scalers
  • Add scaler HTTP request metrics for outbound requests made during metric collection

Learn how to deploy KEDA by reading our documentation.

🗓️ The next KEDA release is currently being estimated for 2nd week of September 2026, learn more in our roadmap.

New

  • General: Add scalingModifiers fallback behavior (#7366)
  • General: Introduce Elastic Forecast Scaler (#7494)
  • General: Introduce new OpenSearch Scaler (#7456)

Improvements

  • General: Add cooldownPeriod and pollingInterval checks for ScaledObject (#7271)
  • General: Add CRD-level validation markers (Minimum, MinLength, MinItems, Enum) for ScaledObject, ScaledJob, ScaleTriggers, and TriggerAuthentication API types (#7533)
  • General: Add --leader-election-id flag to allow configuring the leader election Lease name (#7564)
  • General: Add scaler HTTP request metrics (keda_scaler_http_requests_total, keda_scaler_http_request_duration_seconds) for outbound HTTP requests made during scaler metric collection (#6600)
  • General: Allow more control of TLS versions & ciphers via KEDA_HTTP_TLS_CIPHER_LIST, KEDA_SERVICE_TLS_CIPHER_LIST and KEDA_SERVICE_MIN_TLS_VERSION env vars (#7617)
  • General: Cap each scalers-cache reader at a per-reader budget derived from globalHTTPTimeout so ScalersCache.Close cannot block indefinitely (#7574)
  • General: Make APIService cert injections optional (#7559)
  • General: Remove unconditional json.MarshalIndent calls from admission webhook validation hot paths; replace spec-comparison MarshalIndent-and-string-compare in isRemovingFinalizer variants with reflect.DeepEqual. Prevents webhook OOM under sustained admission load at large scale (observed at ~60k ScaledObjects) (#7670)
  • AWS Scalers: Add support for AWS External ID in TriggerAuthentication podIdentity for all AWS scalers (SQS, Kinesis, DynamoDB, CloudWatch, etc.) to enable cross-account access scenarios (#6921)
  • Elasticsearch Scaler: Add HTTP status check for Elasticsearch errors (#7480)
  • Github Runner Scaler: Handle rate limit errors by respecting X-RateLimit-Reset and Retry-After headers and returning cached queue length (#7683)
  • Kubernetes Workload Scaler: Add groupByNode parameter (#7628)
  • Metrics API Scaler: Add custom HTTP client timeout (#7549)
  • MSSQL Scaler: Add Azure Workload Identity support for Azure SQL authentication (#6104)
  • Prometheus Scaler: Emit metric tracking empty responses from Prometheus (#7062)
  • RabbitMQ Scaler: Add support for OAuth2 authentication for RabbitMQ over HTTP (#7379)
  • Temporal Scaler: Add support for scaling based on Worker Deployment Version backlog via new workerDeploymentName and workerDeploymentBuildId fields. Deprecate buildId, selectAllActive, and selectUnversioned because those parameters are used for Rules-Based Worker Versioning, which was a short-lived experimental feature that has been deprecated in the Temporal server since December 2024 and will stop being supported soon. Users of Rules-Based Worker Versioning should use Worker Deployments instead. (#7672)

Fixes

  • General: Check updated status for Fallback condition instead of ScaledObject (#7488)
  • General: Fail fast in GetMetrics when the gRPC connection is in Shutdown state instead of waiting for context timeout (#7251)
  • General: Fix int64 overflow in milli-quantity conversion for very large metric values (#7441)
  • General: Fix keda_scaler_active not being emitted for CPU and memory triggers (#4945)
  • General: Fix misleading namespace in error log when secret access is restricted (#7739)
  • General: Fix race in scalers cache rebuild that caused transient scaler errors (#7574)
  • General: Fix ScaledJob emitting wrong CloudEvent type (ScaledObjectReadyType instead of ScaledJobReadyType) when transitioning to ready state (#7792)
  • General: Fix ScaledObject admission webhook to return validation error from verifyReplicaCount, preventing invalid ScaledObjects from being created (#5954)
  • General: Fix ScaledObject Ready condition not reflecting HPA status (#7649)
  • General: Handle paused scaling directly in reconciler (#7663)
  • General: Honor stderrthreshold when logtostderr is enabled by updating klog to v2.140.0 (#7568)
  • General: Limit projected service account token reads during Vault authentication (#7783)
  • General: Reject ScaledObject creation and update when the name exceeds 63 characters (#6998)
  • AWS Scalers: Fix TCP connection leak by closing HTTP idle connections on scaler Close() for SQS, Kinesis, DynamoDB, DynamoDB Streams, and CloudWatch scalers (#7756)
  • Azure Data Explorer Scaler: Remove clientSecretFromEnv support (#7554)
  • Azure Event Hub Scaler: Reject non-positive unprocessedEventThreshold to prevent integer division by zero when computing lag (#7732)
  • Azure Pipelines Scaler: Exclude already-assigned jobs from queue length (#7747)
  • Cron Scaler: Fix metric name generation so cron expressions with comma-separated values no longer produce invalid metric names (#7448)
  • External Scaler: gRPC Pool uses TLS context in the key (#7687)
  • Forgejo Scaler: Limit HTTP error response logging (#7469)
  • Forgejo Scaler: Return correct activity to enable scale-to-zero (#7527)
  • GCP Cloud Tasks Scaler: Implement escapeFilterValue for metric filtering (#7482)
  • GCP Scaler: Validate Pub/Sub resource name in BuildMQLQuery (#7468)
  • GCP Storage Scaler: Metadata is not printed in the log (#7688)
  • Github Runner Scaler: Bound etag and per-repo caches to prevent unbounded memory growth when enableEtags is on (#7685)
  • Github Runner Scaler: Improve URL construction and error handling (#7495)
  • Github Runner Scaler: Limit HTTP error response logging (#7469)
  • InfluxDB Scaler: Make authToken optional to support unauthenticated InfluxDB instances (#7616)
  • Loki Scaler: Limit HTTP error response logging (#7469)
  • Loki Scaler: serverAddress now appends /loki/api/v1/query to the end of existing path instead of overriding (#7648)
  • Metrics API Scaler: Fix aggregateFromKubeServiceEndpoints using empty label selector that matched all EndpointSlices in the namespace instead of only the target service's (#7641)
  • Metrics API Scaler: Fix division by zero in average aggregation when all kube service endpoints fail (#7742)
  • Metrics API Scaler: Prevent response value reflection in scaler errors ([#7693](https://g

…(truncated)

We are happy to release KEDA 2.19.0 🎉

Highlights:

  • Introducing new Kubernetes Resource Scaler
  • Adding file-based authentication support for ClusterTriggerAuthentication

Learn how to deploy KEDA by reading our documentation.

🗓️ The next KEDA release is currently being estimated for 2nd week of May 2026 , learn more in our roadmap.

New

  • General: Add file-based authentication support for ClusterTriggerAuthentication (#7083)
  • General: Introduce new Kubernetes Resource Scaler (#7212)

Improvements

  • General: Correct error message when awsSecretAccessKey is missing in credential-based authentication (#7265)
  • General: Emit more events about what is happening with ScaledObject/ScaledJob (#7382)
  • General: Raw metrics stream - include trigger activity status in response (#7369)
  • AWS CloudWatch Scaler: Add cross-account observability support (#7189)
  • Dynamodb Scaler: Add FilterExpression support (#7102)
  • Dynatrace Scaler: Support DQL querying (#7377)
  • MongoDB Scaler: Add TLS support (#6976)

Fixes

  • General: Apply fallback in polling loop to enable scaling from zero (#7239)
  • General: Fix accurateScalingStrategy ignoring pendingJobCount in maxReplicaCount check (#7329)
  • General: Replace deprecated azure autorest dependency to azure sdk for go (#7073)
  • Datadog Scaler: Return request in cluster agent proxy without bearer auth (#7341)
  • Datadog Scaler: Use metricUnavailableValue for 422 errors in Datadog Cluster Agent (#7246)
  • IBMMQ Scaler: Create new HTTP request for each queue query in IBMMQ scaler (#7202)
  • Kafka Scaler: Improve check for missing partition information when calculating lag (#7414)
  • Temporal Scaler: Fix TLS RootCAs initialization when using API key authentication with Temporal Cloud (#7367)

Breaking Changes

  • NATS Streaming scaler: Remove NATS Streaming Server (aka Stan) (#6366)

Other

  • ScaledObject/ScaledJob: Track activity for each trigger in the status (#7347)

We are happy to release KEDA v2.18.3 :rocket:

Fixes

  • General: Fix CVE-2025-68476 (#7334)

We are happy to release KEDA v2.17.3 🚀

Fixes

  • General: Fix CVE-2025-68476 (#7333)

We are happy to release KEDA v2.18.2 :rocket:

Fixes

  • General: Fix HPA behavior not restored when paused-scale-in/out annotation is deleted without corresponding custom behavior (#7291)
  • General: Fix nil reference panic when transfer-hpa-ownership is set but no hpa name is provided (#7254)
  • General: Fix race condition in paused-replicas annotation causing ScaledObject to get stuck (#7231)
  • General: Fix ScaledObject controller error handling for requestScaleLoop (#7273)
  • General: Remove unnecessary scaledObjectMetricSpecs variable in HPA (#7292)
  • General: Use TriggerError when all ScaledJob triggers fail (#7205)
  • ActiveMQ Scaler: Correct parse error ActiveMQ (#7245)
  • Datadog Scaler: Fix metricUnavailableValue parameter not working (#7238)

Full Changelog: https://github.com/kedacore/keda/compare/v2.18.1...v2.18.2

We are happy to release KEDA v2.18.1 :rocket:

Fixes

  • General: Add feature flag KEDA_CHECK_UNEXPECTED_SCALERS_PARAMS for checking unexpected scaler parameters (#6721)
  • General: Fix incorrect 'unmatched input property' notification (#7174)
  • Kafka Scaler: Fix missing error returns in error handling (#7182)

Other

  • General: Raw metrics stream - send also metrics during ScaledObject's interval (#7197)

Full Changelog: https://github.com/kedacore/keda/compare/v2.18.0...v2.18.1

We are happy to release KEDA 2.18.0 🎉

Here are some highlights:

  • General: Introduce new Forgejo Scaler (#6488)
  • General: Introduce new Solace Direct Messaging scaler (#6545)
  • General: Introduce new SolarWinds Scaler (#6576)
  • General: Introduce new Splunk Observability Cloud Scaler (#7152)
  • General: Introduce new Sumo Logic Scaler (#6734)
  • General: Add fallback support for triggers of Value metric type (#6655)

Here are the new deprecation(s) as of this release:

  • GCP Pub/Sub Scaler: The subscriptionSize setting is DEPRECATED and will be removed in v2.20 - Use mode and value instead (#6866)
  • Huawei Cloudeye Scaler: The minMetricValue setting is DEPRECATED and will be removed in v2.20 - Use activationTargetMetricValue instead (#6978)

Here are breaking changes as of this release:

  • General: Remove Prometheus webhook prommetrics deprecations (#6698)
  • CPU Memory scaler: The type setting is deprecated and removed, use metricType instead (#6698)
  • IBM MQ scaler: The tls setting is deprecated and removed, use unsafeSsl instead (#6698)

Learn how to deploy KEDA by reading our documentation.

New Contributors

<generated new contributors info>

New Contributors

Full Changelog: https://github.com/kedacore/keda/compare/v2.17.0...v2.18.0

We are happy to release KEDA v2.17.1 :rocket:

  • Selenium Grid: Update metric name generated without part of empty (#6772)
  • General: Admission Webhook blocks ScaledObject without metricType with fallback (#6696)
  • General: ScalerCache gets the lock before operate the scalers to prevent panics (#6739)
  • AWS SQS Queue Scaler: Fix AWS SQS Queue queueURLFromEnv not working (#6712)
  • Azure Service Bus scaler: Fix Azure Service Bus scaler add default Operation (#6730)
  • Temporal Scaler: Fix Temporal Scaler does not work properly with API Key authentication against Temporal Cloud as TLS is not enabled on the client (#6703)

Full Changelog: https://github.com/kedacore/keda/compare/v2.17.0...v2.17.1