Announcing Envoy Gateway v1.9
Envoy Gateway v1.9 release announcement.
21 minute read
We are excited to announce the release of Envoy Gateway v1.9.0.
This release delivers new capabilities across traffic management, security, extensibility, observability, and infrastructure — along with key bug fixes and performance improvements. We extend our thanks to the entire Envoy Gateway community for your ongoing contributions, feedback, and collaboration. Your efforts make each release possible.
| Release Notes | Docs | Compatibility Matrix | Install |
|---|
What’s New
Envoy Gateway v1.9.0 introduces powerful enhancements, resolves critical issues, and continues to improve the platform’s reliability and performance.
🚨 Breaking Changes
ClientTrafficPolicy.spec.clientIPDetectionnow requires exactly one ofxForwardedFor,customHeader, ordirectSourceIPto be set. Previously an emptyclientIPDetection: {}was accepted; it is now rejected by CEL validation.- Moved the Gateway API safe-upgrades ValidatingAdmissionPolicy resources out of the CRD bundle and into the gateway-helm chart templates so tools such as Flux no longer treat them as CRDs. During upgrades, two upgrade cases require action: (1) if you install Gateway API CRDs separately (e.g. with the gateway-crds-helm chart and
helm install --skip-crds), the safe-upgrades ValidatingAdmissionPolicy and its binding are now rendered by the gateway-helm chart, so add Helm ownership metadata (themeta.helm.sh/release-name,meta.helm.sh/release-namespaceannotations and theapp.kubernetes.io/managed-by=Helmlabel) to theValidatingAdmissionPolicy/safe-upgrades.gateway.networking.k8s.ioandValidatingAdmissionPolicyBinding/safe-upgrades.gateway.networking.k8s.ioresources before upgrading so Helm can manage them (see https://gateway.envoyproxy.io/v1.8/install/install-helm/#installing-crds-separately); (2) if Gateway API CRDs and safe upgrade policy resources are managed by your cloud provider (or any other mechanism outside this chart), note that--skip-crdsdoes not skip chart-templated resources, so disable rendering of the safe-upgrades ValidatingAdmissionPolicy by settingcrds.gatewayAPI.safeUpgradePolicy.enabled=false(see https://gateway.envoyproxy.io/v1.8/install/install-helm/#clusters-with-compatible-provider-managed-gateway-api-crds). - The SDS (Secret Discovery Service) reference secret
urlfield must now include theunix://scheme (e.g.unix:///var/run/secrets/workload-spiffe-uds/socket). Bare filesystem paths that were previously accepted (introduced in v1.9.0-rc.0) are now rejected and must be updated. - Lua EnvoyExtensionPolicies are now disabled by default. Use the new
enableLuafield inextensionApisto explicitly enable them. ThedisableLuafield is deprecated and will be removed in a future release. - JWT authentication provider and requirement names in generated listener xDS now use stable, content-derived names so identical providers can be deduplicated across routes. EnvoyPatchPolicy or extension-server integrations that match previous route-derived
jwt_authn.providersorrequirementMapkeys must update those references. - DNS-based clusters are now generated using Envoy’s
envoy.cluster.dnscluster extension (envoy.extensions.clusters.dns.v3.DnsCluster) instead of the deprecateddns_refresh_rateandrespect_dns_ttlfields on the EnvoyCluster. DNS resolution behavior is unchanged, butEnvoyPatchPolicyand extension server implementations that read or patchtype,dns_refresh_rate,respect_dns_ttl, ordns_lookup_familyon these clusters must be updated to target thecluster_type(envoy.cluster.dns) typed config instead, since Envoy now sources these settings from theDnsClusterextension (and ignores the top-levelCluster.dns_lookup_familywhencluster_typeis set). - EndpointSlice field indexing is now enabled by default by the
EndpointSliceIndexruntime flag and can increase Envoy Gateway controller memory usage in clusters with many EndpointSlices. Before upgrading, especially in production, operators should review and, if needed, increase the Envoy Gateway pod memory requests/limits, or opt out by addingEndpointSliceIndextoruntimeFlags.disabled. - The
XRateLimitHeadersOptionDisabledconstant inBackendTrafficPolicynow correctly holds the value"Off"to match the CRD enum (previously"Disabled"). Since"Disabled"was never a valid CRD enum value and would have been rejected by the API server, no existing manifests are affected. - The
SessionPersistence.IdleTimeoutfield has been removed from the Gateway APIHTTPRoutespec in v1.6. Envoy Gateway no longer validates or rejects routes that previously set this field; any existing manifests referencingsessionPersistence.idleTimeoutmust remove the field before upgrading the Gateway API CRDs to v1.6. - Envoy Gateway now reconciles
TCPRoute/UDPRoutevia thegateway.networking.k8s.io/v1API. You must upgrade the Gateway API CRDs to v1.6 with this release. Existingv1alpha2manifests continue to work (both versions are served), but if the v1.6 CRDs are not installed, TCP/UDP routes will be silently skipped. The stored version moves to v1; a storage-version migration will be required before v1alpha2 is eventually removed. SecurityPolicyspec.apiKeyAuth.extractFromadmission validation is now stricter: the list must contain at least one entry, each entry must specify exactly one ofheaders,params, orcookies, and source names must be non-empty. SecurityPolicies that previously applied with an empty or ambiguousextractFrom(which produced no usable API key sources) will now be rejected and must be corrected before upgrading.SecurityPolicyspec.mergeTypeadmission validation is now stricter:mergeTypecan only be used with xRoute targets (HTTPRoute,GRPCRoute, andTCPRoute) and is rejected onGateway, Gateway listener,ListenerSet, andListenerSetlistener targets. Existing SecurityPolicies usingmergeTypewith those parent-resource targets must removemergeTypebefore updating the objects after the CRD upgrade.- Shared-only global rate limit rules are now written into
typedPerFilterConfiginstead ofroute.rateLimitsin the generated xDS configuration. EnvoyPatchPolicies or extension servers that targetroute.rateLimitsfor shared-only global rate limit rules will stop matching after upgrade and must be updated to target the new location. - All
BackendTLSPolicyresources usingWellKnownCACertificates: SystemandBackendresources usingspec.tls.wellKnownCACertificates: Systemnow share a single SDS secret namedsystem_ca_certificatesinstead of one per-resource secret named<resource-name>/<namespace>-ca. EnvoyPatchPolicies or extension servers referencing the old per-resource secret names or the cluster’svalidationContextSdsSecretConfigfield must be updated accordingly. Patchingsystem_ca_certificatesis not supported; users requiring a custom CA bundle per backend should useCACertificateRefsinstead ofWellKnownCACertificates: System. Disruption to traffic during upgrade is possible, due to warming of new secrets. To opt out and restore the old per-resource secret behavior, enable thePerResourceSystemCASecretruntime flag. - Tracing client sampling now defaults to 0% instead of 100%, so Envoy Gateway no longer honors client-forced tracing unless users explicitly opt in by setting
clientSamplingFraction. BackendTrafficPolicyspec.mergeTypeadmission validation is now stricter:mergeTypecan only be used with xRoute targets (HTTPRoute,GRPCRoute,TCPRoute,UDPRoute, andTLSRoute) and is rejected onGateway, Gateway listener,ListenerSet, andListenerSetlistener targets. Existing BackendTrafficPolicies usingmergeTypewith those parent-resource targets must removemergeTypebefore updating the objects after the CRD upgrade.- Moved EnvoyExtensionPolicy Lua source code from per-route
LuaPerRouteoverrides to listener-level Lua filters to avoid route-count-dependent memory growth. This changes generated xDS Lua filter names and configuration layout; EnvoyPatchPolicies and extension servers matching the previousenvoy.filters.http.lua/<index>keys must be updated. - SDS clusters generated for Unix socket URLs now include a hash suffix in their xDS names to prevent collisions between distinct paths. EnvoyPatchPolicies or extension servers that match the previous path-derived cluster names must update those references.
- Removed the obsolete
envoy.restart_features.use_eds_cache_for_adsruntime guard from generated Envoy bootstrap configuration because Envoy now uses the replacement behavior by default.
🔒 Security Updates
- Fixed xDS server authentication bypass in GatewayNamespaceMode, adding Unary Interceptor and validating SotW requests.
- Hardened the gateway-helm chart: the Envoy Gateway controller container now runs with a read-only root filesystem, and the certgen Job runs with a restricted pod-level securityContext by default.
- Bumped Go to 1.26.5, which includes security fixes to the
crypto/tlsandospackages. - Bumped Go to 1.26.6, which includes security fixes to the
crypto/tls,encoding/asn1,encoding/xml,html/template,net/http,net/url,golang.org/x/net/idnaandgolang.org/x/net/dns/dnsmessagepackages.
✨ New Features
API & Traffic Management
- Added
spec.clientIPDetection.xForwardedFor.disableXForwardedForAppendto ClientTrafficPolicy to disable Envoy’s automatic X-Forwarded-For append behavior when using XFF-based client IP detection. - Added
ClientTrafficPolicy.spec.clientIPDetection.directSourceIPto opt the listener into using the downstream TCP connection source address as the client IP. This unlocks SecurityPolicyclientIPGeoLocationsin L4-transparent topologies (e.g. AWS NLB withtarget-type: instance+externalTrafficPolicy: Local, Azure Standard Load Balancer). - Added support for
HTTPRouteFilterPathRegex hostname rewrites, allowing the upstream Host header to be derived from regex captures on the request path. - Added a
requestBodyfield to the HTTP active health checker inBackendTrafficPolicy, allowing a request body payload to be sent during HTTP health checking. The field requires the health checkmethodto bePOSTorPUT. - Added support for
ListenerSetas atargetRefkind inClientTrafficPolicy, allowing client traffic settings to be applied to a named group of listeners without a gateway-wide policy. - Added a new
hostsection underClientTrafficPolicy’sheaderswith astripTrailingHostDotfield to normalize the Host/Authority header (trailing dot removal) without an EnvoyPatchPolicy. - Added
rateLimit.backend.redis.urlRefto source the global rate limit Redis URL from a Kubernetes Secret, enabling GitOps flows where the Redis endpoint is provisioned by an external controller. - Added support for
ListenerSetas atargetRefkind inSecurityPolicy.\ - Add support for more client timeout settings. The settings are
ConnectionInspectionTimeout,RequestHeadersReceivedTimeoutandTLSHandshakeTimeout - Added support for matching on response headers in
BackendTrafficPolicyresponseOverridevia thematch.responseHeadersfield. - Added support for referencing an Envoy Gateway HTTPRouteFilter from a GRPCRoute rule via an
extensionReffilter, enabling URL rewrite (authority/host and regex:path), direct response, credential injection, and cookie-based matches for gRPC traffic. - Added support for
ListenerSetas atargetRefkind inBackendTrafficPolicy. - Added support for
ListenerSetas atargetRefkind inEnvoyExtensionPolicy. - Added
loadBalancer.backendUtilization.outOfBandto BackendTrafficPolicy, enabling out-of-band ORCA load reporting. Envoy opens a server-streaming gRPC connection to each endpoint’sxds.service.orca.v3.OpenRcaService/StreamCoreMetricsand pulls load reports on a schedule, independent of request traffic. This supplements in-band ORCA metrics carried in response headers and trailers rather than replacing them — reports from either source feed the same endpoint weights.reportingPeriodcontrols how often reports are requested, whileportandauthorityallow reaching a dedicated reporting sidecar. The backend must implementOpenRcaServicefor this to take effect. - Added support for
MergeTypeinEnvoyExtensionPolicyto enable route-level policies to merge with parent Gateway, ListenerSet policies. - Added a Week unit to BackendTrafficPolicy’s global and local rate limiting, allowing rate limits to be expressed on a weekly basis in addition to Second/Minute/Hour/Day/Month/Year.
Security & Authentication
- Added
csrffield toSecurityPolicyfor native Cross-Site Request Forgery protection, validating theOriginheader of mutating requests against the destination and anyadditionalOrigins, with gradual rollout viashadowFraction. - Added support for CEL expressions in SecurityPolicy authorization rules.
- Added support for authorization path match.
- Added the
autoSNIFromEndpointHostnameTLS setting to Backends, allowing the SNI value sent to the backend to be automatically derived from the backend endpoint hostname instead of using a fixed SNI value. - Added support for SNI based dynamic forward proxy by allowing a
Backendof typeDynamicResolverto be referenced by aTLSRoute. The upstream host is resolved from the TLS SNI of the incoming connection. - Added
allowExpiredCertificateto ClientTrafficPolicytls.clientValidation, allowing operators to accept expired client certificates while still validating the CA chain and signature. - Added a
failedRefetchDurationfield to JWT providers inSecurityPolicy, configuring how long Envoy waits before re-fetching the JWKS after a failed fetch. If not specified, Envoy’s default of 1 second is used. - Added a
failOpenfield to JWT inSecurityPolicy, allowing a request to pass JWT authentication even when its JWT is missing or invalid (maps to Envoy’sallow_missing_or_failed). Verified claims are still forwarded, so it should be paired with an Authorization policy for enforcement. - Added
spec.oidc.forwardIDTokento SecurityPolicy, allowing the OIDC ID token to be forwarded to the upstream on a configurable request header. When the header isAuthorization, the ID token is forwarded using theBearerprefix; for any other header the raw token value is set. - Added support for referencing a Secret of type
gateway.envoyproxy.io/sdsin a Gateway listener’stls.certificateRefs, letting Envoy fetch the listener certificate from an external SDS server instead of an inlinekubernetes.io/tlsSecret, gated by the existingenableSDSSecretRefEnvoyGateway extension API flag. When multiple valid HTTPS listeners share a port, SDS-backed listeners default to HTTP/1.1 because their certificate DNS names are opaque; same-port listeners are also downgraded when their known certificate DNS names overlap the SDS listener hostname, or when that hostname is unspecified. Affected listeners reportgateway.envoyproxy.io/TLSCertificateNamesUnknown=Truewith reasonSDSCertificateOpaque.
Extensibility
- Added support for
filterContextfield in Lua EnvoyExtensionPolicy, allowing shared Lua scripts to be parameterized per route viarequest_handle:filterContext(). - Added a
statusOnErrorfield to the ExtProc settings inEnvoyExtensionPolicy, allowing the HTTP status returned to the client to be customized when the external processor is unreachable andfailOpenis false. - Extension server policies can now target Resources in different namespaces using
ReferenceGrant. - Extension server policies can now target HTTPRoutes, GRPCRoute, HTTPRoute rules (via
sectionName) and GRPCRoute rules (viasectionName) in addition to Gateways and Gateway Listeners. The extension server attachment outcome is now reported in the policy’sstatus.ancestors. - Added
xdsServer.maxReceiveMessageSizeto the EnvoyGateway API and raised the xDS gRPC server’s default receive limit from 4MiB to 32MiB. At large resource counts, an Envoy proxy’s delta xDS request on stream reconnect can exceed 4MiB, which previously broke the stream with “received message larger than max” errors and left the proxy on its last known-good configuration. - Added
EnvoyProxy.spec.mergeBackendsto let routes referencing the identical backend share a single Envoy cluster instead of generating one cluster per route rule, reducing xDS size, active health-check traffic, and stats cardinality. Disabled by default and marked experimental. - Added a
selectorfield toEnvoyProxy.spec.mergeBackendsto restrict cluster deduplication to backends whose Service, ServiceImport, or Backend resource matches a label selector, so operators can opt individual backends in gradually instead of enabling deduplication for every backend at once. - Added
healthCheckFailureDelaytoShutdownConfig, allowing Envoy Gateway to start graceful listener drain immediately while delaying health check failure during pod termination.
Infrastructure & Helm
- Added a remote infrastructure provider. This allows users to define their own infrastructure management strategy.
- Added
startupProbeto the envoy-gateway Deployment with configurable liveness and readiness probes via Helm values. - Added support for disabling the
crdsdependency on the gateway-helm chart viacrds.enabledvariable. - Added support for
deployment.envoyGateway.strategyin Helm values, allowing users to configure the Deployment update strategy (e.g.RollingUpdateorRecreate) for the Envoy Gateway control plane. - Added optional
unhealthyPodEvictionPolicyfield to envoy-gateway chart’s PodDisruptionBudget template.
Observability
- Added a
xdsNACKTotalmetric to track the number of NACKs received from Envoy, labeled by node ID and resource type URL. A NACK is a DiscoveryRequest carrying an ErrorDetail, indicating that Envoy rejected the last config update. This metric can be used to alert on config issues causing xDS rejections. - Added a
fromMetadatafield to global rate limitlimitinBackendTrafficPolicy, allowing the limit value to be sourced from per-request dynamic metadata (e.g. set by an upstream ext_proc), falling back to the staticrequests/unitwhen the metadata is absent. - Added support for setting the log level to
offandcriticalfor the Envoy Proxy. - Added support for configuring Envoy tracing client and overall sampling fractions on EnvoyProxy and BackendTrafficPolicy tracing settings.
- Added support for health check event logging in
EnvoyProxyandBackendTrafficPolicy.
Status & Validation
- Added a
RouteRulesOverlapwarning status condition for routes whose match conditions are identical to another route on the same listener, so users can identify silently-shadowed routes.
🐞 Bug Fixes
- Fixed Wasm extensions remaining permanently failed after transient errors fetching the Wasm module. Envoy’s built-in behavior only retried the fetch once after ~1 second and never re-attempted it, leaving the filter failed until the next configuration update. Envoy Gateway now configures the fetch with up to 10 retries using jittered exponential backoff (1s base interval, 30s max interval).
- Fixed TLS secrets with non-canonical PEM formatting (e.g. unusual line endings) being passed verbatim to Envoy, which could cause BoringSSL errors such as
BAD_END_LINE. Cert and key PEM data is now re-encoded to a canonical form before being delivered as xDS resources. - Fixed deduplicate CA certificates in ClientTrafficPolicy mTLS.
- Fixed the xDS server in GatewayNamespaceMode serving a stale certificate after cert-manager rotation by re-reading the cert from disk on every TLS handshake.
- Fixed controller panic when processing backend tls settings.
- Fixed
MaxStreamDurationnot being set onCommonHttpProtocolOptionsfor non-route cluster. - Added validation for the SDS (Secret Discovery Service) cluster URI to ensure Unix Domain Socket (
unix://) URLs are well-formed, rejecting a host component and requiring a path, instead of silently producing an invalid or unintended socket address. - Fixed API key auth credential ordering to avoid unnecessary xDS updates.
- Fixed the CORS
allowedOriginsvalidation pattern inSecurityPolicyrejecting valid origins that use non-HTTP schemes; the pattern now allows all RFC 3986 compliant URL schemes (e.g.moz-extension://example.com). - Fixed the EnvoyProxy resource not allowing IPv6 ranges in loadBalancerSourceRanges when configuring the envoy service.
- Fixed egctl config commands hanging when Envoy pod port-forwarding fails.
- Fixed Helm chart install/render failure when
watch.namespacesis not set (default values) by wrapping the template check in awithblock. - Fixed BackendTLSPolicy selection to prefer section name over wildcard match on the same backend.
- Fixed missing deprecated field warning in ClientTrafficPolicy and SecurityPolicy.
- Fixed ClientTrafficPolicy TLS cipher validation rejecting supported IANA/RFC cipher suite names.
- Fixed Backend FQDN hostname validation to allow absolute domain names with a trailing dot.
- Fixed
egctl x status all/xroute/xpolicyfailing when a Gateway API CRD (e.g. TCPRoute) is not installed in the cluster; missing CRDs are now skipped silently, or reported on stderr with-v. - Fixed Kubernetes provider namespace-scoped watches to always include the controller namespace so Envoy Gateway can read its own infrastructure resources.
- Fixed HTTPRoute, GRPCRoute, TLSRoute, TCPRoute, and UDPRoute Accepted condition being set to False when an attached listener is not programmed due to a missing TLS certificate ref; listener programmed state is now correctly separated from route acceptance.
- Fixed Kubernetes Service and ServiceImport
appProtocolvalueskubernetes.io/wsandkubernetes.io/wssto force HTTP/1.1 upstream connections instead of negotiating HTTP/2, avoiding compatibility issues with WebSocket backends that do not support RFC 8441 extended CONNECT. - Fixed Backend TLS
alpnProtocols: []to disable upstream ALPN instead of inheriting EnvoyProxy BackendTLS defaults. - Fixed IPv6 literal hosts (e.g.
[::1],[2001:db8::1]) not being detected in OIDC token/JWKS endpoints, which caused them to be built as STRICT_DNS clusters instead of static ones and bypassed the IP-literal check on the SecurityPolicy token endpoint. - Fixed the generated
install.yamlcreating a duplicate ValidatingAdmissionPolicy and its binding which causedkustomize buildto fail with a duplicate resource error. - Fixed an
ExternalNameService referenced as a route backend producing an invalid xDS cluster (with an empty address) that failed IR validation and stalled config delivery for the whole snapshot.ExternalNameServices are now explicitly rejected as backends with aResolvedRefs: Falseroute condition; use an Envoy GatewayBackendresource with an FQDN endpoint instead. - Fixed ListenerSet hostname conflict resolution to apply listener precedence: Gateway-owned listeners win over ListenerSet listeners, and among ListenerSet listeners the first in processing order wins. Conflicted ListenerSet listeners now correctly report Accepted=False with the conflict reason. The Gateway’s AttachedListenerSets count now only reflects ListenerSets with at least one accepted listener.
- Fixed ListenerSet protocol-conflict precedence so that Gateway-owned listeners collectively win when they share a single protocol, and only ListenerSet listeners using a different protocol are marked Conflicted/Accepted=False/Programmed=False. Previously, all listeners on a port could incorrectly be marked conflicted even when the Gateway itself had a clear protocol winner.
- Fixed Gateway status reporting
Programmed: Falsewith reasonAddressNotAssignedwhen the Envoy LoadBalancer service has no load balancer ingress (e.g. bare-metal clusters without a load balancer controller) but has addresses configured inspec.externalIPs, such as via an EnvoyProxy service patch. The external IPs are now used as a fallback for the Gateway status addresses. - Fixed EnvoyGateway config hot-reload to apply defaults before validation, so validators always run against a fully-defaulted struct on both the startup and reload paths.
- Fixed an issue where, in GatewayNamespace mode, Envoy Gateway could take ownership of existing ServiceAccounts and ConfigMaps with colliding names; it now refuses to reconcile those resources unless they are already labeled as owned by the same Gateway.
- Fixed
ConsistentHashload balancer settings on non-route service clusters, such as SecurityPolicy extAuth backends, by emitting cluster-level HTTP hash policies. - Fixed upstream PROXY protocol clusters to preserve generated HTTP protocol options, including auto protocol detection for Backend TLS.
- Fixed HTTPRoute per-retry timeout (derived from
rule.timeouts.backendRequest) not being applied when no retry backoff was configured. - Fixed shared global rate limit rules with a
costfield not working as expected. - Fixed BackendTrafficPolicy global rate limits rejecting
requests: 0, allowing zero-request global rules to block matching traffic while local zero limits remain rejected. - Fixed the standalone offline controller used by the File provider to register the missing ListenerSet, ListenerSet-owned route, and ClusterTrustBundle EnvoyExtensionPolicy indexes so reconciliation no longer fails with unregistered index errors.
- Fixed Gateway TLS Secret validation rejecting valid ECDSA private keys when the
tls.keyincludes anEC PARAMETERSPEM block before the private key. - Fixed DaemonSet pod not using the configured custom ServiceAccount name.
- Fixed redirect port leaking across multiple listeners when an HTTPRoute with a redirect filter (without explicit port) is attached to multiple Gateway listeners with different ports; each listener now correctly derives its own redirect port instead of reusing the first listener’s port.
- Fixed cross-namespace targetSelectors for BackendTrafficPolicy RoutingType by using the target resource’s namespace in the index key instead of the policy’s namespace.
- Fixed backend (upstream) TLS connections being capped at TLS 1.2 by default; they now default to a max of TLS 1.3 as documented.
- Fixed a data race that could crash envoy-gateway with
panic: reflect: slice index out of rangewhen the watchable coalesce goroutine compared the xDS IR withreflect.DeepEqualwhile the translator concurrently mutated resource status in place; the translator now isolates status mutations by deep-copying only the status field of each resource at the start of translation. - Fixed TLS Secrets being pushed to Envoy and rejected by BoringSSL (KEY_VALUES_MISMATCH), which with mergeGateways enabled broke TLS for all Gateways sharing the proxy. A serving certificate chain that contains an expired (or malformed) certificate is now rejected during translation instead of having the expired member silently dropped (which corrupted the chain), and a Secret whose certificate and private key do not match is likewise rejected; both failures are isolated to the referencing listener. CA bundles used for client validation still drop expired CAs.
- Fixed unreferenced Secret events triggering a full reconciliation whenever the HTTPRouteFilter CRD is installed. Every Secret write in the cluster previously enqueued a reconcile, causing sustained reconcile storms on clusters with high-frequency Secret writers (secret sync controllers, certificate rotation).
- Fixed log timestamps regressing to Unix epoch floats (e.g.
1.784e+09) since v1.8.0 by explicitly settingISO8601TimeEncoderon the production zap encoder config, restoring the expected ISO 8601 format (e.g.2026-07-14T17:44:06.617Z). - Allow TLS v1.3 for remote JWKS fetching
- Fixed initial fetch timed out for type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret.
- Fixed route and policy status never being written under high watch-event churn. When the informer cache lagged behind the API server, the status updater’s cache-backed Get could return NotFound for a freshly-created object and silently skip the status write, leaving the object with an empty status until a controller restart. The status updater now confirms a NotFound against an uncached reader before dropping the update.
- Fixed a data race between config-reload and the standalone server’s shutdown/error logging by reading the logger through a new mutex-guarded
Loader.Logger()accessor instead of the sharedcfg.Loggerfield directly. - Fixed Envoy Gateway crash-looping at startup on clusters whose Gateway API CRD bundle omits ListenerSet, GRPCRoute or TLSRoute, such as GKE’s managed gateway-api-crds addon, by making those watches conditional on the CRD being present.
- Fixed Envoy Gateway overriding the replica count computed by an HPA. The proxy and rate limit Deployments are applied with server-side apply using
ForceOwnership, so renderingspec.replicasmadeenvoy-gatewaythe owner of that field and every subsequent reconciliation reset the replica count to the statically configured value. Thereplicasfield is now omitted from the generated Deployment when an HPA is configured (envoyHpa/rateLimitHpa), which is the behavior already documented for both. UseminReplicasto set a lower bound on the replica count instead. - Fixed NodePort Gateway Status.Addresses includes all nodes instead of only nodes with live Envoy pods when externalTrafficPolicy is Local.
- Allow mixing IP and Unix Domain Socket endpoints in non-xRoute backends (ext-proc, ext-auth, etc.).
- Fixed Envoy Gateway crash-looping at startup on clusters whose Gateway API CRD bundle omits BackendTLSPolicy, such as OpenShift’s Ingress-Operator-managed set, by making that watch conditional on the CRD being present. This completes the standard-channel guards added in #9583.
- Fixed ListenerSet not being reconciled when a referenced TLS Secret is created or updated after the ListenerSet. Secret watches previously only indexed Gateway certificateRefs, so cert-manager style late Secret creation left the ListenerSet stuck with Programmed=False until an unrelated reconcile.
- Fixed ConsistentHash load balancing not pinning a client to a single backend when a route splits traffic across multiple weighted backendRefs. Envoy Gateway now sets
use_hash_policyon the generated weighted clusters when a ConsistentHash load balancer is configured, so the request’s hash policy selects the weighted cluster deterministically instead of at random per request. - Fixed
mergeBackendsincorrectly sharing or splitting clusters when a route’sparentRefomittedsectionName, by checkingClusterSettingsmerge-eligibility against each listener the route actually attaches to instead of the route’s literalsectionName. - Fixed SecurityPolicy rejecting OIDC cookieDomain values that contain a single-character label anywhere after the first label, such as example.m.com, because the validation pattern required every label but the first to be at least two characters. This applies to cookieDomain the same fix made for Backend FQDN endpoint hostnames in #4803.
🚀 Performance Improvements
- Improved EndpointSlice lookup performance by using field indexes when processing backend references.
- Reduced inotify watch usage for
BackendTLSPolicywithWellKnownCACertificates: Systemby sharing a single SDS secret across all policies instead of creating one per policy. - Fixed translation latency growing quadratically when many policies share the same target by capping each policy’s
status.ancestorsat the CRD limit as ancestors are added, instead of only truncating during post-processing.
🛑 Deprecations
- The
disableLuafield inextensionApisis deprecated in favor ofenableLua.
📝 Other Changes
- Refactored BackendTrafficPolicy merging to use the field-owner pattern already used for SecurityPolicy, resolving the response override body reference against the owning policy’s namespace instead of mutating the shared policy’s
Specbefore merge. - Increased the maximum number of header matches allowed in
RateLimitSelectCondition.headersfrom 64 to 128.
📝 Upgrade Notes
- We encourage all users to upgrade to v1.9.0 to take advantage of the new features, security improvements, and performance gains. For full details, see the Release Notes and updated Documentation.
- Bumped the bundled Gateway API CRDs to v1.6.1. Envoy Gateway now reconciles
TCPRoute/UDPRouteviagateway.networking.k8s.io/v1, so the updated Gateway API CRDs must be installed before upgrading. - For upgrade instructions, see Helm or YAML.
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.