Highlights
HTTP/2 and gRPC support (#1084)
The interceptor now supports HTTP/2 (h2c and h2 over TLS), enabling autoscaling of gRPC workloads. Backend transport is selected based on the Kubernetes appProtocol field on the Service port (#1676): cleartext backends default to HTTP/1.1 unless appProtocol: kubernetes.io/h2c is set; TLS backends negotiate via ALPN.
The KEDA_HTTP_FORCE_HTTP2 environment variable has been removed — HTTP/2 is now negotiated automatically.
Cold-start placeholder responses (#874)
New coldStart.placeholder support lets you return static HTTP responses while a workload scales from zero, instead of holding the request until a pod is ready.
Scaler resilience (#1667)
The scaler now tolerates partial interceptor pod failures instead of restarting on a single unreachable endpoint. Last-known concurrency is cached for unreachable pods to prevent underreporting.
Graceful shutdown (#1636)
The interceptor now drains in-flight requests before exiting. It waits for active handlers to complete (bounded by KEDA_HTTP_DRAIN_TIMEOUT), marks the readiness probe unhealthy immediately on SIGTERM, and delays listener closure by KEDA_HTTP_SHUTDOWN_DELAY to let Kubernetes propagate endpoint removal.
Deprecations
KEDAHTTP_OPERATOR_EXTERNAL_SCALER_SERVICEandKEDAHTTP_OPERATOR_EXTERNAL_SCALER_PORThave been renamed toKEDA_HTTP_OPERATOR_EXTERNAL_SCALER_SERVICEandKEDA_HTTP_OPERATOR_EXTERNAL_SCALER_PORT. Old names still work but log a deprecation warning. (#1623)
What's Changed
- fix(deps): update module github.com/cert-manager/cert-manager to v1.19.5 by @renovate[bot] in #1612
- fix: disable digest pinning for kindest/node in renovate by @linkvt in #1614
- chore: group e2e-framework with Kubernetes deps in renovate by @linkvt in #1613
- chore(deps): update e2e dependencies by @renovate[bot] in #1615
- chore(deps): update dependency golangci/golangci-lint to v2.12.1 by @renovate[bot] in #1616
- fix(deps): update go dependencies (non-major) by @renovate[bot] in #1611
- chore: remove unused .dockerignore file by @linkvt in #1621
- ci: add stable e2e summary job for branch protection by @linkvt in #1618
- chore: improve OpenSSF Scorecard security posture by @linkvt in #1620
- fix(ci): add retry logic to e2e Helm dependency installs by @Fedosin in #1584
- fix: rename KEDAHTTP_OPERATOR_EXTERNAL_SCALER_* env vars to KEDA_HTTP_OPERATOR_EXTERNAL_SCALER_* by @Fedosin in #1623
- fix: use downward API for namespace env vars instead of hardcoded value by @Fedosin in #1625
- chore: add OpenSSF and community badges to README by @linkvt in #1624
- chore(deps): update github actions by @renovate[bot] in #1630
- chore(deps): update dependency golangci/golangci-lint to v2.12.2 by @renovate[bot] in #1629
- chore(deps): update ghcr.io/wolfi-dev/static:alpine docker digest to de720d5 by @renovate[bot] in #1627
- fix(deps): update k8s.io/utils digest to ff6756f by @renovate[bot] in #1628
- chore: flatten nested checklist in PR template by @linkvt in #1632
- chore: exclude gnu.org/make from lychee link checks by @linkvt in #1631
- feat: add native Go fuzz tests for untrusted-input surfaces by @Fedosin in #1599
- chore(deps): update actions/upload-artifact action to v7 by @renovate[bot] in #1642
- chore(deps): update github/codeql-action action to v4.35.5 by @renovate[bot] in #1638
- chore(deps): update e2e dependencies by @renovate[bot] in #1640
- fix(deps): update go dependencies (non-major) to v0.34.8 by @renovate[bot] in #1639
- fix(deps): update go dependencies (non-major) by @renovate[bot] in #1641
- docs: reference new e2e test suite in contributor docs by @linkvt in #1635
- chore: remove old HTTPSO examples by @linkvt in #1643
- Replace gorilla/websocket with coder/websocket by @Akram-saj in #1633
- fix(deps): update module github.com/coder/websocket to v1.8.14 by @renovate[bot] in #1650
- perf: strip managed fields from controller-runtime cache by @linkvt in #1651
- chore(deps): update module golang.org/x/net to v0.55.0 [security] by @renovate[bot] in #1652
- chore(deps): update github actions by @renovate[bot] in #1653
- chore(deps): update helm release opentelemetry-collector to v0.156.2 - autoclosed by @renovate[bot] in #1654
- ci: add workflow to block PRs with 'on hold' label by @linkvt in #1647
- feat: add coldStart.placeholder support for static responses by @linkvt in #1626
- feat(scaler): add observability (metrics + tracing) to the external scaler by @Fedosin in #1634
- chore(deps): update helm release opentelemetry-collector to v0.158.0 by @renovate[bot] in #1660
- fix: filter GetMetrics response by requested metric name by @linkvt in #1664
- feat: add s390x to release platforms by @linkvt in #1663
- chore: clean up README and remove outdated files by @linkvt in #1666
- fix(deps): update go dependencies (non-major) by @renovate[bot] in #1661
- fix(interceptor): close request body to prevent panic by @linkvt in #1669
- fix(deps): update go dependencies (non-major) to v1.44.0 by @renovate[bot] in #1673
- chore(deps): update github actions by @renovate[bot] in #1671
- chore(deps): update e2e dependencies by @renovate[bot] in #1672
- fix: drain in-flight requests on shutdown by @linkvt in #1648
- feat: add gRPC and HTTP/2 support to interceptor by @linkvt in #1658
- chore: use pinned version comments for GitHub Actions by @linkvt in #1674
- fix: tolerate partial interceptor pod failures in scaler by @Fedosin in #1670
- feat: select backend transport via service appProtocol by @linkvt in #1678
- chore: pin helm version and add timeouts to e2e helm installs by @linkvt in #1686
- fix(deps): update go dependencies (non-major) to v0.34.9 by @renovate[bot] in #1682
- chore(deps): update ghcr.io/wolfi-dev/static:alpine docker digest to 6a4616e by @renovate[bot] in #1680
- chore(deps): update pre-commit hooks to v2.5.0 by @renovate[bot] in #1683
- fix(deps): update go dependencies (non-major) by @renovate[bot] in #1684
- chore: prepare release v0.15.0 by @linkvt in #1687
New Contributors
- @Akram-saj made their first contribution in #1633
Full Changelog: v0.14.0...v0.15.0