Release Announcement TEG 1.9
Date: August 20, 2026
TEG v1.9.1 is supported until 1st August 2027. TEG 1.8.x is supported until 1st May 2027 — plan your upgrade before that date. See Support for the full support matrix.
New Feature Highlights
Tetrate Enterprise Gateway for Envoy (TEG) v1.9.1 is built on Envoy Gateway 1.9.0,
Envoy 1.39.0, and Gateway API v1.6.1. It introduces three distinct TEG editions (community,
enterprise, and enterprise FIPS), makes the Web Application Firewall available out of the box on a
publicly pullable data-plane image, and makes the chart's GatewayClass configurable so TEG can be
installed alongside an existing Envoy Gateway. Upstream brings native CSRF protection, CEL-based
authorization, ListenerSet as a policy target across all four xPolicy kinds, cluster deduplication
for shared backends, and a large set of correctness fixes across TLS secret handling, status
reporting, and CRD-optional clusters.
We recommend upgrading directly from TEG 1.8.x to v1.9.1. Platform teams running TEG 1.7.x should first upgrade to 1.8.x before proceeding.
Packaging and Editions
- Three TEG editions: TEG is now published as community, enterprise, and enterprise
FIPS. All three are built from the same source, ship the same Helm chart, and expose the same APIs;
they differ in where the images are published, whether the phone-home client reports by default, and
(for FIPS) the cryptographic libraries used. The community edition is the public default
(
docker.io/tetrate/teg-envoy-gateway) and includes an always-on phone-home client that reports version and component information used for CVE and update detection. The enterprise editions ship that client off by default — opt in withphoneHome.enabled=true— and are published to credentialed Tetrate registries, from which they also serve their own data-plane Envoy image. Select an edition by pointingdeployment.tegEnvoyGateway.image.repository— and, for the enterprise editions, the Envoy proxy image — at that edition's registry. See TEG Editions. - WAF works out of the box, from a public image: the default data-plane Envoy image bundles the WAF
dynamic module and is published to the public
docker.io/tetrate/teg-envoyrepository, soExtendedSecurityPolicyworks without overriding the Envoy image or holding Tetrate registry credentials. The enterprise and FIPS editions override the Envoy image with their own variant, which bundles the same module — the FIPS variant bundles the FIPS-compliant build of it — so the WAF works out of the box in every edition. - Single FIPS registry: every Tetrate-built FIPS image is now published to and consumed from
fips-containers.teg.tetratelabs.com. The FIPS data-plane Envoy image moved there from the former private registry and is tagged with the TEG release version, for exampleenvoy:distroless-v1.9.1. - Version-tagged Envoy images: because the dynamic modules are baked in, the data-plane Envoy
images are tagged with the TEG release version (
distroless-v1.9.0) rather than the upstream Envoy version, and are slightly larger as a result. dns-gatewaymodule bundled: the data-plane image now also carries thedns-gatewaydynamic module alongsidecomposer(WAF) andip-restriction.
Install and Operate
- Configurable GatewayClass: the GatewayClass created by the chart now derives its
controllerNamefromgateway-helm.config.envoyGateway.gateway.controllerName— the same key that configures the control plane — so the class and its controller can no longer drift apart. NewgatewayClass.nameandgatewayClass.enabledvalues let you rename the class or skip creating it entirely, which makes it possible to run TEG next to an existing Envoy Gateway or TEG installation without the two contending over the same GatewayClass, Gateways, and Envoy Deployments. Defaults are unchanged. commonLabelsacross chart resources: a singlecommonLabelsvalue applies labels to every resource the chart creates — Deployment, certgen Job, Service, ServiceAccount, RBAC, PodDisruptionBudget, EnvoyProxy, and Redis — for cost allocation, policy targeting, and inventory tooling.certgen.job.pod.labelscovers the certgen Job pods.- certgen Job scheduling:
certgen.job.nodeSelector,certgen.job.affinity, andcertgen.job.tolerationspin the certgen Job to compatible nodes, which matters on mixed-architecture clusters where the FIPS images arelinux/amd64only. - Customizable pod security context: the
teg-envoy-gatewaydeployment now applies a default security context and allows it to be customized. - Helm chart additions from upstream: a
startupProbeand configurable liveness/readiness probes on the envoy-gateway Deployment,deployment.envoyGateway.strategyfor the update strategy,crds.enabledto disable the CRD dependency, andunhealthyPodEvictionPolicyon the PodDisruptionBudget. - Redis guidance: the TEG-managed Redis is now explicitly documented as suitable for demos only —
a single, non-replicated instance with no persistence, no HA, and no backup. For production, set
redis.disabled=trueand point the rate limit backend at your own hardened Redis. See Bring your own Redis. - Redis-backed rate limiting fixed: the bundled Redis no longer attempts RDB snapshots into a read-only filesystem, which previously caused it to reject every write once a snapshot threshold was reached, breaking global rate limiting.
Security Controls
- Native CSRF protection:
SecurityPolicy.spec.csrfvalidates theOriginheader of mutating requests against the destination and anyadditionalOrigins, withshadowFractionfor gradual rollout. - CEL-based authorization: authorization rules in
SecurityPolicyaccept CEL expressions, and authorization can now match on request path. - Client IP detection for L4-transparent topologies:
ClientTrafficPolicy.spec.clientIPDetection.directSourceIPuses the downstream TCP source address as the client IP, which unlocksclientIPGeoLocationsbehind an AWS NLB withtarget-type: instanceandexternalTrafficPolicy: Local, or an Azure Standard Load Balancer.xForwardedFor.disableXForwardedForAppenddisables Envoy's automatic XFF append. - JWT and OIDC controls:
forwardIDTokenforwards the OIDC ID token upstream on a configurable header,failedRefetchDurationcontrols JWKS re-fetch backoff, andfailOpenallows requests with a missing or invalid JWT to pass authentication (pair it with an authorization policy). - mTLS with expired client certificates:
tls.clientValidation.allowExpiredCertificateaccepts expired client certificates while still validating the CA chain and signature. - Hardened control plane: the Envoy Gateway controller container runs with a read-only root
filesystem, the certgen Job runs with a restricted pod security context, ServiceAccount token
automounting is off unless a pod needs it, and an xDS authentication bypass in
GatewayNamespaceModeis fixed. - Go 1.26.6 picks up the latest upstream Go security fixes.
Traffic Handling
ListenerSetas a policy target:ClientTrafficPolicy,SecurityPolicy,BackendTrafficPolicy, andEnvoyExtensionPolicycan all attach to aListenerSet, so settings can be applied to a named group of listeners instead of a gateway-wide policy.- Cluster deduplication for shared backends:
EnvoyProxy.spec.mergeBackends(experimental, off by default) lets routes referencing the same backend share one Envoy cluster instead of one per route rule, cutting xDS size, active health-check traffic, and stats cardinality. Aselectoropts backends in gradually. - Rate limiting: limits can be sourced from per-request dynamic metadata with
fromMetadata, aWeekunit is available for global and local limits, the Redis URL can come from a Secret viarateLimit.backend.redis.urlRef, and header matches per rate limit condition were raised from 64 to 128. - Load balancing and health checks: out-of-band ORCA load reporting via
loadBalancer.backendUtilization.outOfBand, arequestBodyfor HTTP active health checks, and health check event logging inEnvoyProxyandBackendTrafficPolicy. - Routing and rewrites:
GRPCRouterules can reference anHTTPRouteFilterthrough anextensionReffilter,HTTPRouteFiltersupports PathRegex hostname rewrites, andresponseOverrideinBackendTrafficPolicycan match on response headers. - Backend TLS and dynamic proxying:
autoSNIFromEndpointHostnamederives backend SNI from the endpoint hostname, and aDynamicResolverBackendcan be referenced by aTLSRoutefor SNI-based dynamic forward proxying. - Client timeouts:
ConnectionInspectionTimeout,RequestHeadersReceivedTimeout, andTLSHandshakeTimeoutare now configurable, andheaders.host.stripTrailingHostDotnormalizes the Host header without anEnvoyPatchPolicy.
Observability and Extensibility
- xDS rejection metric: the new
xdsNACKTotalmetric counts NACKs from Envoy, labeled by node ID and resource type URL — a direct signal for alerting on configuration Envoy refused to accept. - Overlapping route detection: a
RouteRulesOverlapwarning condition surfaces routes silently shadowed by an identical match on the same listener. - Larger xDS messages:
xdsServer.maxReceiveMessageSizeis configurable and the default receive limit rose from 4MiB to 32MiB, so large delta xDS requests on reconnect no longer break the stream. - Extension servers reach further: extension server policies can target resources in other
namespaces through
ReferenceGrant, and can attach toHTTPRoute,GRPCRoute, and individual rules viasectionName, with the outcome reported instatus.ancestors. - Parameterized Lua:
filterContextlets a shared Lua script be parameterized per route throughrequest_handle:filterContext(). - Remote infrastructure provider: define your own infrastructure management strategy instead of the built-in Kubernetes provider.
Performance Improvements
- EndpointSlice lookups now use field indexes when processing backend references.
BackendTLSPolicywithWellKnownCACertificates: Systemshares a single SDS secret instead of one per policy, cutting inotify watch usage.- Translation latency no longer grows quadratically when many policies share one target.
Deprecations
- The
disableLuafield inextensionApisis deprecated in favor ofenableLua. Note that LuaEnvoyExtensionPolicyis now disabled by default — see Breaking Changes.
Summary
TEG v1.9.1 tracks Envoy Gateway 1.9.0, Envoy 1.39.0, and Gateway API v1.6.1. The release
splits TEG into community, enterprise, and enterprise FIPS editions, publishes a WAF-enabled data plane
that needs no credentials, makes the chart's GatewayClass configurable, and lands native CSRF
protection, CEL authorization, ListenerSet policy targets, and roughly sixty upstream bug fixes.
- Safe: native CSRF protection, CEL-based authorization,
directSourceIPclient IP detection, a read-only controller root filesystem, ServiceAccount token automounting off by default, theGatewayNamespaceModexDS authentication fix, and Go 1.26.6 harden the deployment without configuration changes. - Safe: TLS correctness fixes — canonical PEM re-encoding, per-listener rejection of mismatched or expired certificate chains, and cert-manager rotation picked up on every handshake — remove failure modes that previously took down TLS for every Gateway sharing a merged proxy.
- Fast:
mergeBackendscluster deduplication (experimental, off by default), EndpointSlice field indexes, shared system CA SDS secrets, and the ancestor-capping translation fix reduce xDS size and control-plane CPU on large clusters. - Profitable: three editions with a public, WAF-enabled data plane let teams evaluate and run TEG without registry credentials, while enterprise customers keep phone home off by default; a configurable GatewayClass allows TEG to be introduced alongside an existing Envoy Gateway instead of requiring a migration.
- Profitable:
commonLabels, certgen scheduling controls,urlReffor the rate limit Redis, and chart-level probe and strategy settings remove the most common reasons to fork the chart.
Upgrade Guidance
Be aware of the following breaking changes and behavioral differences when upgrading from TEG 1.8 to v1.9.1. Review each item against your current configuration before promoting to production.
Breaking Changes
- Gateway API CRDs must be upgraded to v1.6:
- Envoy Gateway now reconciles
TCPRouteandUDPRouteviagateway.networking.k8s.io/v1. Existingv1alpha2manifests keep working because both versions are served, but if the v1.6 CRDs are not installed, TCP and UDP routes are silently skipped. The stored version moves tov1; a storage-version migration will be required beforev1alpha2is removed. SessionPersistence.IdleTimeoutwas removed fromHTTPRoutein Gateway API v1.6. RemovesessionPersistence.idleTimeoutfrom your manifests before upgrading the CRDs.
- Envoy Gateway now reconciles
- Lua
EnvoyExtensionPolicyis disabled by default:- Set
enableLuainextensionApisto re-enable it. ThedisableLuafield is deprecated. Any existing Lua-basedEnvoyExtensionPolicystops taking effect until Lua is explicitly enabled.
- Set
- Safe-upgrades
ValidatingAdmissionPolicymoved into the chart templates:- If you install the Gateway API CRDs separately (for example with
teg-crds-helmplus--skip-crds), add Helm ownership metadata — themeta.helm.sh/release-nameandmeta.helm.sh/release-namespaceannotations and theapp.kubernetes.io/managed-by=Helmlabel — to the existingValidatingAdmissionPolicy/safe-upgrades.gateway.networking.k8s.ioand its binding before upgrading, so Helm can adopt them. - If those resources are managed outside the chart (a cloud provider's managed Gateway API CRDs, for
instance), note that
--skip-crdsdoes not skip chart-templated resources: disable them withcrds.gatewayAPI.safeUpgradePolicy.enabled=false.
- If you install the Gateway API CRDs separately (for example with
- FIPS images moved to a single registry:
- FIPS deployments must update the Envoy proxy image override to
fips-containers.teg.tetratelabs.com/envoy:distroless-v1.9.1. The formertetrate-envoy-gateway.containers.dl.tetrate.io/envoylocation is no longer used for FIPS, and the tag now follows the TEG release version rather than the upstream Envoy version.
- FIPS deployments must update the Envoy proxy image override to
- Data-plane Envoy image tags follow the TEG version:
- Automation that derives the Envoy image tag from the upstream Envoy version must be updated to use
distroless-v1.9.0.
- Automation that derives the Envoy image tag from the upstream Envoy version must be updated to use
clientIPDetectionrequires exactly one detection method:- An empty
clientIPDetection: {}is now rejected by CEL validation. Specify exactly one ofxForwardedFor,customHeader, ordirectSourceIP.
- An empty
mergeTyperestricted to xRoute targets:SecurityPolicyandBackendTrafficPolicyobjects that setmergeTypewhile targeting aGateway, a Gateway listener, aListenerSet, or aListenerSetlistener are rejected. RemovemergeTypefrom those policies before updating them after the CRD upgrade.
- Stricter
apiKeyAuth.extractFromvalidation:- The list must contain at least one entry, each entry must specify exactly one of
headers,params, orcookies, and source names must be non-empty. Policies that previously applied with an empty or ambiguousextractFromare now rejected.
- The list must contain at least one entry, each entry must specify exactly one of
- SDS reference secret URLs require the
unix://scheme:- Bare filesystem paths are rejected. Update any
urlvalue to, for example,unix:///var/run/secrets/workload-spiffe-uds/socket.
- Bare filesystem paths are rejected. Update any
- Shared system CA SDS secret:
BackendTLSPolicyandBackendresources usingWellKnownCACertificates: Systemnow share one SDS secret namedsystem_ca_certificatesinstead of one per resource. Brief traffic disruption is possible while the new secret warms.EnvoyPatchPolicyresources and extension servers referencing the old per-resource names must be updated; patchingsystem_ca_certificatesis not supported — useCACertificateRefsfor a per-backend CA bundle. ThePerResourceSystemCASecretruntime flag restores the old behavior.
- Tracing client sampling now defaults to 0%:
- Client-forced tracing is no longer honored unless
clientSamplingFractionis set explicitly. If you relied on clients forcing traces, set it before upgrading.
- Client-forced tracing is no longer honored unless
- EndpointSlice field indexing is on by default:
- The
EndpointSliceIndexruntime flag can increase controller memory usage on clusters with many EndpointSlices. Review the Envoy Gateway pod memory requests and limits, or opt out withruntimeFlags.disabled: [EndpointSliceIndex].
- The
- xDS naming and layout changes affecting
EnvoyPatchPolicyand extension servers:- JWT provider and requirement names are now content-derived rather than route-derived;
EnvoyExtensionPolicyLua source moved from per-routeLuaPerRouteoverrides to listener-level filters; shared-only global rate limit rules moved fromroute.rateLimitsintotypedPerFilterConfig; DNS clusters are generated with theenvoy.cluster.dnscluster extension instead ofdns_refresh_rate/respect_dns_ttl; and SDS clusters for Unix socket URLs carry a hash suffix. Audit everyEnvoyPatchPolicyand extension server that matches on generated xDS names.
- JWT provider and requirement names are now content-derived rather than route-derived;
ExternalNameServices are rejected as route backends:- Previously they produced an invalid cluster that stalled configuration delivery for the whole
snapshot. Replace
ExternalNameServices with aBackendresource.
- Previously they produced an invalid cluster that stalled configuration delivery for the whole
snapshot. Replace
- WebSocket backends forced to HTTP/1.1:
- Services with
appProtocol: kubernetes.io/wsorkubernetes.io/wssnow use HTTP/1.1 upstream instead of negotiating HTTP/2.
- Services with
Manual Migration Steps from 1.8 → v1.9.1
1. Update Gateway-API and Envoy Gateway CRDs
Pull the TEG v1.9.1 chart and apply the updated CRDs. Note that CRDs are packaged as a
sub-chart under charts/gateway-helm/charts/crds.
helm pull oci://docker.io/tetrate/teg-envoy-gateway-helm --version v1.9.1 --untar
kubectl apply --force-conflicts --server-side \
-f ./teg-envoy-gateway-helm/charts/gateway-helm/crds/gatewayapi-crds.yaml
kubectl apply --force-conflicts --server-side \
-f ./teg-envoy-gateway-helm/charts/gateway-helm/crds/generated
2. Upgrade Tetrate Enterprise Gateway
For the community edition, no image overrides are needed:
helm upgrade teg \
oci://docker.io/tetrate/teg-envoy-gateway-helm \
--version v1.9.1 \
-n envoy-gateway-system
For the enterprise or enterprise FIPS editions, pass the values file that pins the edition's images — see TEG Editions and Install FIPS-validated TEG:
helm upgrade teg \
oci://docker.io/tetrate/teg-envoy-gateway-helm \
--version v1.9.1 \
--values values.yaml \
-n envoy-gateway-system
3. Post-Upgrade Validation
- Confirm the control plane is running the edition you expect, and — for the enterprise editions — that
PHONE_HOME_ENABLEDreflects your intent. See Confirm which edition is running. - Verify the data-plane Envoy image is the version-tagged image (
distroless-v1.9.0), and for FIPS deployments that it is pulled fromfips-containers.teg.tetratelabs.com. Re-run the FIPS verification steps. - If you previously overrode the Envoy image solely to enable the WAF, remove that override and confirm
ExtendedSecurityPolicystill enforces as expected on the default image. - Check that TCP and UDP routes are still programmed after the Gateway API v1.6 CRD upgrade — a missing CRD upgrade makes them silently disappear.
- Re-enable Lua explicitly (
extensionApis.enableLua) if you use LuaEnvoyExtensionPolicy, and confirm the policies take effect. - Audit
EnvoyPatchPolicyresources and extension servers against the xDS naming changes (JWT providers, Lua filters, shared global rate limit rules, DNS clusters, SDS clusters, and the sharedsystem_ca_certificatessecret). - Review Envoy Gateway controller memory usage after the EndpointSlice indexing change, especially on clusters with many EndpointSlices.
- Set
clientSamplingFractionif you depend on client-forced tracing, which now defaults to 0%. - Validate global rate limiting end to end. If you use the bundled Redis, confirm counters survive normal operation now that persistence is disabled; for production, migrate to your own Redis.
- Confirm
SecurityPolicyandBackendTrafficPolicyobjects no longer setmergeTypeon Gateway, listener, orListenerSettargets, and thatclientIPDetectionspecifies exactly one method. - If you install the Gateway API CRDs separately, verify the safe-upgrades
ValidatingAdmissionPolicyis either adopted by Helm or disabled withcrds.gatewayAPI.safeUpgradePolicy.enabled=false.