What happened:
The gloo-proxy source (source/gloo_proxy.go) only reads domains from Proxy.spec.listeners[].httpListener.virtualHosts[].domains. When a Gloo Edge Gateway is configured with isolateVirtualHostsBySslConfig: true (observed since Gloo Edge 1.22.0), Gloo translates the Proxy CR to use aggregateListener instead of httpListener for that listener. Since the proxySpecListener struct has no AggregateListener field, Go's JSON unmarshalling silently drops that part of the object, listener.HTTPListener.VirtualHosts ends up empty, and generateEndpointsFromProxy produces zero endpoints for that listener — with no error or warning logged.
DNS records silently stop being created/updated for any VirtualService domain served by an aggregateListener-backed listener, even though the Proxy CR is valid and Envoy is serving the domain correctly.
What you expected to happen:
gloo-proxy source should also parse aggregateListener.httpResources.virtualHosts (a map[string]VirtualHost, referenced via httpFilterChains[].virtualHostRefs), in addition to the classic httpListener.virtualHosts[], so domains aren't silently dropped when a Gateway uses isolateVirtualHostsBySslConfig: true.
How to reproduce it (as minimally and precisely as possible):
- Deploy Gloo Edge (1.22.0+) with a
Gateway that has isolateVirtualHostsBySslConfig: true (this causes Gloo to use aggregateListener for SNI-based filter chain splitting).
- Confirm the generated
Proxy CR uses spec.listeners[].aggregateListener.httpResources.virtualHosts instead of spec.listeners[].httpListener.virtualHosts.
- Run external-dns with
--source=gloo-proxy.
- Observe that no DNS records are created for domains on that listener, with no error/warning in the debug logs.
Trimmed/anonymized Proxy CR for the same VirtualService/domain, before and after enabling isolateVirtualHostsBySslConfig on the Gateway. Only the listener-shape fields relevant to this bug are kept.
Before (isolateVirtualHostsBySslConfig: false) — parsed correctly today:
apiVersion: gloo.solo.io/v1
kind: Proxy
metadata:
name: example-gateway-proxy
namespace: gloo-system
spec:
listeners:
- bindAddress: '::'
bindPort: 8443
httpListener:
virtualHosts:
- domains:
- app.example.com
metadataStatic:
sources:
- resourceKind: '*v1.VirtualService'
resourceRef:
name: example-vs
namespace: example-ns
name: example-ns.example-vs
After (isolateVirtualHostsBySslConfig: true) — silently produces zero endpoints:
apiVersion: gloo.solo.io/v1
kind: Proxy
metadata:
name: example-gateway-proxy
namespace: gloo-system
spec:
listeners:
- bindAddress: '::'
bindPort: 8443
aggregateListener:
httpFilterChains:
- httpOptionsRef: "1234567890"
virtualHostRefs:
- example-ns.example-vs
httpResources:
virtualHosts:
example-ns.example-vs:
domains:
- app.example.com
metadataStatic:
sources:
- resourceKind: '*v1.VirtualService'
resourceRef:
name: example-vs
namespace: example-ns
name: example-ns.example-vs
Same domain, same source VirtualService — but the domain now lives under spec.listeners[].aggregateListener.httpResources.virtualHosts (a map keyed by virtual host name, referenced indirectly via httpFilterChains[].virtualHostRefs) instead of spec.listeners[].httpListener.virtualHosts[].
Full status block from the live Proxy object (identical shape in both the httpListener and aggregateListener cases):
status:
statuses:
gloo-system:
reportedBy: gloo
state: 1
state: 1 indicates the Proxy was accepted/processed successfully by Gloo — i.e. this isn't a case of Gloo itself rejecting or failing to translate the config; the Proxy CR is valid and healthy, only external-dns's parser fails to read the aggregateListener shape.
Anything else we need to know?:
Confirmed via direct source inspection of source/gloo_proxy.go on both the v0.15.1 release tag and current master — proxySpecListener struct only defines HTTPListener, no AggregateListener field, and the endpoint-generation loop in generateEndpointsFromProxy only walks listener.HTTPListener.VirtualHosts. So this is not version-specific — the gap exists on master as well as the release we're running.
Debug logs confirm the proxy is found and a target is resolved, but zero endpoints are generated — with no error or warning anywhere in between:
time="2026-08-13T09:25:33Z" level=debug msg="Gloo: Find external-gateway-proxy proxy"
time="2026-08-13T09:25:33Z" level=debug msg="Gloo[external-gateway-proxy]: Find 1 target(s) (ext-gateway-proxy-xxxxxxxxxxxxxxxx.elb.eu-west-1.amazonaws.com)"
time="2026-08-13T09:25:33Z" level=debug msg="Gloo[external-gateway-proxy]: Generate 0 endpoint(s)"
time="2026-08-13T09:25:33Z" level=debug msg="Gloo: Find internal-gateway-proxy proxy"
time="2026-08-13T09:25:33Z" level=debug msg="Gloo[internal-gateway-proxy]: Find 1 target(s) (int-gateway-proxy-xxxxxxxxxxxxxxxx.elb.eu-west-1.amazonaws.com)"
time="2026-08-13T09:25:33Z" level=debug msg="Gloo[internal-gateway-proxy]: Generate 0 endpoint(s)"
This matches the code path exactly: the Proxy object and its LoadBalancer target are both found successfully, but since the listener is aggregateListener-shaped, listener.HTTPListener.VirtualHosts is empty and the domain loop never executes — hence "Generate 0 endpoint(s)" with no error.
Environment:
- External-DNS version (use
external-dns --version): v0.15.1 — not the latest release; gap confirmed present via source inspection on master as well (see below), but not reproduced against a live newer/staging build
- DNS provider: aws
- Others: Gloo Edge 1.22.0,
--source=gloo-proxy
Checklist
What happened:
The
gloo-proxysource (source/gloo_proxy.go) only reads domains fromProxy.spec.listeners[].httpListener.virtualHosts[].domains. When a Gloo EdgeGatewayis configured withisolateVirtualHostsBySslConfig: true(observed since Gloo Edge 1.22.0), Gloo translates theProxyCR to useaggregateListenerinstead ofhttpListenerfor that listener. Since theproxySpecListenerstruct has noAggregateListenerfield, Go's JSON unmarshalling silently drops that part of the object,listener.HTTPListener.VirtualHostsends up empty, andgenerateEndpointsFromProxyproduces zero endpoints for that listener — with no error or warning logged.DNS records silently stop being created/updated for any VirtualService domain served by an
aggregateListener-backed listener, even though theProxyCR is valid and Envoy is serving the domain correctly.What you expected to happen:
gloo-proxysource should also parseaggregateListener.httpResources.virtualHosts(amap[string]VirtualHost, referenced viahttpFilterChains[].virtualHostRefs), in addition to the classichttpListener.virtualHosts[], so domains aren't silently dropped when aGatewayusesisolateVirtualHostsBySslConfig: true.How to reproduce it (as minimally and precisely as possible):
Gatewaythat hasisolateVirtualHostsBySslConfig: true(this causes Gloo to useaggregateListenerfor SNI-based filter chain splitting).ProxyCR usesspec.listeners[].aggregateListener.httpResources.virtualHostsinstead ofspec.listeners[].httpListener.virtualHosts.--source=gloo-proxy.Trimmed/anonymized
ProxyCR for the same VirtualService/domain, before and after enablingisolateVirtualHostsBySslConfigon theGateway. Only the listener-shape fields relevant to this bug are kept.Before (
isolateVirtualHostsBySslConfig: false) — parsed correctly today:After (
isolateVirtualHostsBySslConfig: true) — silently produces zero endpoints:Same domain, same source VirtualService — but the domain now lives under
spec.listeners[].aggregateListener.httpResources.virtualHosts(a map keyed by virtual host name, referenced indirectly viahttpFilterChains[].virtualHostRefs) instead ofspec.listeners[].httpListener.virtualHosts[].Full
statusblock from the liveProxyobject (identical shape in both thehttpListenerandaggregateListenercases):state: 1indicates theProxywas accepted/processed successfully by Gloo — i.e. this isn't a case of Gloo itself rejecting or failing to translate the config; theProxyCR is valid and healthy, only external-dns's parser fails to read theaggregateListenershape.Anything else we need to know?:
Confirmed via direct source inspection of
source/gloo_proxy.goon both thev0.15.1release tag and currentmaster—proxySpecListenerstruct only definesHTTPListener, noAggregateListenerfield, and the endpoint-generation loop ingenerateEndpointsFromProxyonly walkslistener.HTTPListener.VirtualHosts. So this is not version-specific — the gap exists onmasteras well as the release we're running.Debug logs confirm the proxy is found and a target is resolved, but zero endpoints are generated — with no error or warning anywhere in between:
This matches the code path exactly: the
Proxyobject and its LoadBalancer target are both found successfully, but since the listener isaggregateListener-shaped,listener.HTTPListener.VirtualHostsis empty and the domain loop never executes — hence "Generate 0 endpoint(s)" with no error.Environment:
external-dns --version): v0.15.1 — not the latest release; gap confirmed present via source inspection onmasteras well (see below), but not reproduced against a live newer/staging build--source=gloo-proxyChecklist
masterby readingsource/gloo_proxy.godirectly, but have not run a newer/staging build against the cluster to confirm livekubectl get <resource> -o yamloutput includingstatus