Skip to content

Commit 9b35db1

Browse files
authored
feature: Add support to opt-out from zone aware routing via Ingress/RouteGroup (#4049)
Introduce the annotation `zalando.org/traffic-zone-aware: "false"` on Ingress and RouteGroup resources. When set, the resource receives all endpoints across all zones, bypassing zone filtering both at the dataclient layer (endpoint fetch) and at the routesrv layer (per-zone route serving). Usage: ``` metadata: annotations: zalando.org/traffic-zone-aware: "false" ``` Tasks 1. Define `zalando.org/traffic-zone-aware` annotation constant in the kubernetes package 2. Modify `GetEndpointSlicesByService` and `GetEndpointSlicesByTarget` in `clusterstate.go` to accept ing and rg context param respectively and skip zone filtering when value ing.disableZoneAwareness/rg.disableZoneAwareness is true 3. Add zoneAwarenessAnnotationFilter() helper that returns an annotate() filter when the zone-aware opt-out annotation is present 4. Modify Ingress v1 path rule conversion (`convertPathRuleV1`) and default backend conversion (`convertDefaultBackendV1`) to read the annotation, pass it to endpoint fetch and prepend the annotate() filter when annotation is set 5. Modify RouteGroup backend application (`applyServiceBackend`) to read the annotation, pass it to endpoint fetch and prepend the annotate() filter when annotation is set 6. Add isZoneAwarenessDisabled() in routesrv/polling.go to detect the opt-out by inspecting the route filter chain 7. Wire isZoneAwarenessDisabled() into getRouteForZone() to skip zone filtering for opted-out routes 8. Update makeRoute test helper to inject the annotate() filter when the opt-out flag is passed 9. Add integration test with two Ingresses in zone `eu-central-1a`: one opted out (expects all endpoints across zones), one default (expects only zone-local endpoints) 10. Add unit tests for `filterRoutesByZone` covering opt-out scenarios: both routes opted out, opt-out mixed with normal route, and opt-out with a below-threshold zone Tested the changes: The skipper-ingress with zone aware routing enabled was in Zone-A 1. Deployed ingress with 10 replicas, which means 10 endpoints are available ``` zkubectl -n gmapp1 get pods -L topology.kubernetes.io/zone NAME READY STATUS RESTARTS AGE ZONE app1-v8-5c5965f6d4-7h6zr 1/1 Running 0 69s eu-central-1a app1-v8-5c5965f6d4-7tnq4 1/1 Running 0 68s eu-central-1a app1-v8-5c5965f6d4-98mz7 1/1 Running 0 68s eu-central-1c app1-v8-5c5965f6d4-99n9p 1/1 Running 0 69s eu-central-1c app1-v8-5c5965f6d4-bvdst 1/1 Running 0 69s eu-central-1a app1-v8-5c5965f6d4-htn78 1/1 Running 0 68s eu-central-1b app1-v8-5c5965f6d4-q75b9 1/1 Running 0 69s eu-central-1b app1-v8-5c5965f6d4-wtgm5 1/1 Running 0 69s eu-central-1a app1-v8-5c5965f6d4-xhv9q 1/1 Running 0 69s eu-central-1c app1-v8-5c5965f6d4-zlz9x 1/1 Running 0 69s eu-central-1b ``` This meets the threshold to serve same zone endpoints, but since the ingress has the opt-out annotation, the route contains all the endpoints and not just zone filtered ``` kube_gmapp1__app1_v8_traffic_segment__gmapp1_pg9_test_zalan_do____app1_v8: Host(/^(gmapp1[.]pg9-test[.]zalan[.]do[.]?(:[0-9]+)?)$/) && TrafficSegment(0, 1) -> disableAccessLog(2, 3, 404, 429) -> fifo(2000, 20, "1s") -> annotate("zalando.org/traffic-zone-aware", "false") -> oauthTokeninfoValidate("{optOutAnnotations: [iam.zalando.org/public], optOutHosts: [\"^.*[.]ingress[.]cluster[.]local\"], unauthorizedResponse: \"Authentication required, see https://cloud.docs.zalando.net/howtos/authenticate-requests/#default-authentication\\n\"}") -> stateBagToTag("auth-user", "client.uid") -> <powerOfRandomNChoices, "http://[2a05:d024:90:1103:3e99::6]:8080", "http://[2a05:d024:90:1103:3e99::7]:8080", "http://[2a05:d024:90:1103:3e99::8]:8080", "http://[2a05:d024:90:1103:3e99::9]:8080", "http://[2a05:d024:90:1104:2396::a]:8080", "http://[2a05:d024:90:1104:2396::b]:8080", "http://[2a05:d024:90:1104:2396::c]:8080", "http://[2a05:d024:90:1105:4749::4]:8080", "http://[2a05:d024:90:1105:4749::6]:8080", "http://[2a05:d024:90:1105:4749::7]:8080">; ``` 2. Deployed a routegroup with 15 replicas, which means 15 endpoints are available ``` zkubectl -n gmapp2 get pods -L topology.kubernetes.io/zone NAME READY STATUS RESTARTS AGE ZONE app2-v2-c9694944-598mc 1/1 Running 0 7m6s eu-central-1c app2-v2-c9694944-6bcpm 1/1 Running 0 7m6s eu-central-1c app2-v2-c9694944-7jgpp 1/1 Running 0 7m7s eu-central-1b app2-v2-c9694944-88xzb 1/1 Running 0 7m7s eu-central-1a app2-v2-c9694944-8kl6q 1/1 Running 0 7m6s eu-central-1c app2-v2-c9694944-8wc97 1/1 Running 0 7m7s eu-central-1c app2-v2-c9694944-cv9g8 1/1 Running 0 7m7s eu-central-1c app2-v2-c9694944-dkh2h 1/1 Running 0 7m6s eu-central-1a app2-v2-c9694944-flnx9 1/1 Running 0 7m6s eu-central-1a app2-v2-c9694944-klk6r 1/1 Running 0 7m7s eu-central-1a app2-v2-c9694944-kwddv 1/1 Running 0 7m6s eu-central-1b app2-v2-c9694944-pjbtz 1/1 Running 0 7m6s eu-central-1a app2-v2-c9694944-q5xrh 1/1 Running 0 7m7s eu-central-1b app2-v2-c9694944-rs8hk 1/1 Running 0 7m7s eu-central-1a app2-v2-c9694944-t6crt 1/1 Running 0 7m6s eu-central-1b ``` This meets the threshold to serve same zone endpoints, but since the routegroup has the opt-out annotation, the route contains all the endpoints and not just zone filtered ``` kube_rg__gmapp2__app2_v2_traffic_segment__get__0_0: Path("/test") && Host(/^(app2[.]teapot[.]zalan[.]do[.]?(:[0-9]+)?)$/) && Method("GET") && TrafficSegment(0, 1) -> disableAccessLog(2, 3, 404, 429) -> fifo(2000, 20, "1s") -> annotate("zalando.org/traffic-zone-aware", "false") -> annotate("iam.zalando.org/public", "The application uses its own authentication logic, similar to using Partner IAM.") -> status(200) -> inlineContent("Hello from second backend!") -> oauthTokeninfoValidate("{optOutAnnotations: [iam.zalando.org/public], optOutHosts: [\"^.*[.]ingress[.]cluster[.]local\"], unauthorizedResponse: \"Authentication required, see https://cloud.docs.zalando.net/howtos/authenticate-requests/#default-authentication\\n\"}") -> stateBagToTag("auth-user", "client.uid") -> <powerOfRandomNChoices, "http://[2a05:d024:90:1103:3e99::10]:8080", "http://[2a05:d024:90:1103:3e99::11]:8080", "http://[2a05:d024:90:1103:3e99::12]:8080", "http://[2a05:d024:90:1103:3e99::13]:8080", "http://[2a05:d024:90:1103:3e99::14]:8080", "http://[2a05:d024:90:1103:3e99::f]:8080", "http://[2a05:d024:90:1104:2396::10]:8080", "http://[2a05:d024:90:1104:2396::d]:8080", "http://[2a05:d024:90:1104:2396::e]:8080", "http://[2a05:d024:90:1104:2396::f]:8080", "http://[2a05:d024:90:1105:4749::8]:8080", "http://[2a05:d024:90:1105:4749::9]:8080", "http://[2a05:d024:90:1105:4749::a]:8080", "http://[2a05:d024:90:1105:4749::b]:8080", "http://[2a05:d024:90:1105:4749::c]:8080">; ``` ref: #3971 --------- Signed-off-by: greeshma1196 <greeshma.mathew@gmail.com>
1 parent 048c71b commit 9b35db1

15 files changed

Lines changed: 548 additions & 41 deletions

dataclients/kubernetes/clusterstate.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (state *clusterState) GetEndpointsByService(namespace, name, protocol strin
7979
}
8080

8181
// GetEndpointSlicesByService returns the skipper endpointslices for kubernetes endpointslices.
82-
func (state *clusterState) GetEndpointSlicesByService(zone, namespace, name, protocol string, servicePort *servicePort) []skipperEndpoint {
82+
func (state *clusterState) GetEndpointSlicesByService(zone, namespace, name, protocol string, servicePort *servicePort, ic *ingressContext) []skipperEndpoint {
8383
epID := endpointID{
8484
ResourceID: newResourceID(namespace, name),
8585
Protocol: protocol,
@@ -105,6 +105,10 @@ func (state *clusterState) GetEndpointSlicesByService(zone, namespace, name, pro
105105
state.cachedEndpointSlices[epID] = targets
106106
}
107107

108+
if ic.disableZoneAwareness {
109+
return targets
110+
}
111+
108112
return filterByZone(zone, targets)
109113
}
110114

@@ -167,7 +171,7 @@ func (state *clusterState) GetEndpointsByTarget(namespace, name, protocol, schem
167171
}
168172

169173
// GetEndpointSlicesByTarget returns the skipper endpointslices for kubernetes endpointslices.
170-
func (state *clusterState) GetEndpointSlicesByTarget(zone, namespace, name, protocol, scheme string, target *definitions.BackendPort) []skipperEndpoint {
174+
func (state *clusterState) GetEndpointSlicesByTarget(zone, namespace, name, protocol, scheme string, target *definitions.BackendPort, rgc *routeGroupContext) []skipperEndpoint {
171175
epID := endpointID{
172176
ResourceID: newResourceID(namespace, name),
173177
Protocol: protocol,
@@ -192,6 +196,10 @@ func (state *clusterState) GetEndpointSlicesByTarget(zone, namespace, name, prot
192196
state.cachedEndpointSlices[epID] = targets
193197
}
194198

199+
if rgc.disableZoneAwareness {
200+
return targets
201+
}
202+
195203
return filterByZone(zone, targets)
196204
}
197205

dataclients/kubernetes/ingress.go

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,32 @@ const (
2424
skipperLoadBalancerAnnotationKey = "zalando.org/skipper-loadbalancer"
2525
skipperBackendProtocolAnnotationKey = "zalando.org/skipper-backend-protocol"
2626
pathModeAnnotationKey = "zalando.org/skipper-ingress-path-mode"
27+
trafficZoneAwareAnnotationKey = "zalando.org/traffic-zone-aware"
2728
ingressOriginName = "ingress"
2829
tlsSecretType = "kubernetes.io/tls"
2930
tlsSecretDataCrt = "tls.crt"
3031
tlsSecretDataKey = "tls.key"
3132
)
3233

3334
type ingressContext struct {
34-
state *clusterState
35-
ingressV1 *definitions.IngressV1Item
36-
logger *logger
37-
annotationFilters []*eskip.Filter
38-
annotationPredicate string
39-
annotationBackend string
40-
forwardBackendURL string
41-
enableExternalNames bool
42-
extraRoutes []*eskip.Route
43-
backendWeights map[string]float64
44-
pathMode PathMode
45-
redirect *redirectInfo
46-
hostRoutes map[string][]*eskip.Route
47-
defaultFilters defaultFilters
48-
certificateRegistry *certregistry.CertRegistry
49-
calculateTraffic func([]*weightedIngressBackend) map[string]backendTraffic
50-
zone string
35+
state *clusterState
36+
ingressV1 *definitions.IngressV1Item
37+
logger *logger
38+
annotationFilters []*eskip.Filter
39+
annotationPredicate string
40+
annotationBackend string
41+
forwardBackendURL string
42+
enableExternalNames bool
43+
extraRoutes []*eskip.Route
44+
backendWeights map[string]float64
45+
pathMode PathMode
46+
redirect *redirectInfo
47+
hostRoutes map[string][]*eskip.Route
48+
defaultFilters defaultFilters
49+
certificateRegistry *certregistry.CertRegistry
50+
calculateTraffic func([]*weightedIngressBackend) map[string]backendTraffic
51+
zone string
52+
disableZoneAwareness bool
5153
}
5254

5355
type ingress struct {
@@ -270,6 +272,16 @@ func countPathPredicates(r *eskip.Route) int {
270272
return i
271273
}
272274

275+
func zoneAwarenessAnnotationFilter(m *definitions.Metadata) *eskip.Filter {
276+
if m.Annotations[trafficZoneAwareAnnotationKey] == "false" {
277+
fs, err := eskip.ParseFilters(`annotate("` + trafficZoneAwareAnnotationKey + `", "false")`)
278+
if err == nil && len(fs) == 1 {
279+
return fs[0]
280+
}
281+
}
282+
return nil
283+
}
284+
273285
// parse filter and ratelimit annotation
274286
func annotationFilter(m *definitions.Metadata, logger *logger) []*eskip.Filter {
275287
var annotationFilter string

dataclients/kubernetes/ingressv1.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func convertPathRuleV1(
125125
}
126126

127127
if state.enableEndpointSlices {
128-
epSlices = state.GetEndpointSlicesByService(dataclientZone, ns, svcName, protocol, servicePort)
128+
epSlices = state.GetEndpointSlicesByService(dataclientZone, ns, svcName, protocol, servicePort, ic)
129129
for _, ep := range epSlices {
130130
eps = append(eps, ep.Address)
131131
}
@@ -179,6 +179,10 @@ func convertPathRuleV1(
179179
r.LBEndpoints = eskip.NewLBEndpoints(eps)
180180
}
181181

182+
if f := zoneAwarenessAnnotationFilter(metadata); f != nil {
183+
r.Filters = append([]*eskip.Filter{f}, r.Filters...)
184+
}
185+
182186
setPathV1(pathMode, r, prule.PathType, prule.Path)
183187
traffic.apply(r)
184188
return r, nil
@@ -407,7 +411,7 @@ func (ing *ingress) convertDefaultBackendV1(
407411
}
408412

409413
if state.enableEndpointSlices {
410-
epSlices = state.GetEndpointSlicesByService(dataclientZone, ns, svcName, protocol, servicePort)
414+
epSlices = state.GetEndpointSlicesByService(dataclientZone, ns, svcName, protocol, servicePort, ic)
411415
for _, ep := range epSlices {
412416
eps = append(eps, ep.Address)
413417
}
@@ -454,6 +458,10 @@ func (ing *ingress) convertDefaultBackendV1(
454458
r.LBEndpoints = eskip.NewLBEndpoints(eps)
455459
}
456460

461+
if f := zoneAwarenessAnnotationFilter(i.Metadata); f != nil {
462+
r.Filters = append([]*eskip.Filter{f}, r.Filters...)
463+
}
464+
457465
return r, true, nil
458466
}
459467

@@ -482,23 +490,24 @@ func (ing *ingress) ingressV1Route(
482490

483491
redirect.initCurrent(i.Metadata)
484492
ic := &ingressContext{
485-
state: state,
486-
ingressV1: i,
487-
logger: logger,
488-
annotationFilters: annotationFilter(i.Metadata, logger),
489-
annotationPredicate: annotationPredicate(i.Metadata),
490-
annotationBackend: annotationBackendString(i.Metadata),
491-
forwardBackendURL: ing.forwardBackendURL,
492-
enableExternalNames: ing.enableExternalNames,
493-
extraRoutes: extraRoutes(i.Metadata),
494-
backendWeights: backendWeights(i.Metadata, logger),
495-
pathMode: pathMode(i.Metadata, ing.pathMode, logger),
496-
redirect: redirect,
497-
hostRoutes: hostRoutes,
498-
defaultFilters: df,
499-
certificateRegistry: r,
500-
calculateTraffic: getBackendTrafficCalculator[*weightedIngressBackend](ing.backendTrafficAlgorithm),
501-
zone: ing.zone,
493+
state: state,
494+
ingressV1: i,
495+
logger: logger,
496+
annotationFilters: annotationFilter(i.Metadata, logger),
497+
annotationPredicate: annotationPredicate(i.Metadata),
498+
annotationBackend: annotationBackendString(i.Metadata),
499+
forwardBackendURL: ing.forwardBackendURL,
500+
enableExternalNames: ing.enableExternalNames,
501+
extraRoutes: extraRoutes(i.Metadata),
502+
backendWeights: backendWeights(i.Metadata, logger),
503+
pathMode: pathMode(i.Metadata, ing.pathMode, logger),
504+
redirect: redirect,
505+
hostRoutes: hostRoutes,
506+
defaultFilters: df,
507+
certificateRegistry: r,
508+
calculateTraffic: getBackendTrafficCalculator[*weightedIngressBackend](ing.backendTrafficAlgorithm),
509+
zone: ing.zone,
510+
disableZoneAwareness: i.Metadata.Annotations[trafficZoneAwareAnnotationKey] == "false",
502511
}
503512

504513
var route *eskip.Route

dataclients/kubernetes/routegroup.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type routeGroupContext struct {
4343
forwardBackendURL string
4444
certificateRegistry *certregistry.CertRegistry
4545
zone string
46+
disableZoneAwareness bool
4647
}
4748

4849
type routeContext struct {
@@ -178,6 +179,10 @@ func applyServiceBackend(ctx *routeGroupContext, backend *definitions.SkipperBac
178179
protocol = p
179180
}
180181

182+
if f := zoneAwarenessAnnotationFilter(ctx.routeGroup.Metadata); f != nil {
183+
r.Filters = append([]*eskip.Filter{f}, r.Filters...)
184+
}
185+
181186
s, err := getBackendService(ctx, backend)
182187
if err != nil {
183188
return err
@@ -197,7 +202,8 @@ func applyServiceBackend(ctx *routeGroupContext, backend *definitions.SkipperBac
197202
s.Meta.Name,
198203
"TCP",
199204
protocol,
200-
targetPort)
205+
targetPort,
206+
ctx)
201207
for _, epSlice := range epSlices {
202208
eps = append(eps, epSlice.Address)
203209
}
@@ -597,6 +603,7 @@ func (r *routeGroups) convert(s *clusterState, df defaultFilters, loggingEnabled
597603
forwardBackendURL: r.options.ForwardBackendURL,
598604
certificateRegistry: cr,
599605
zone: r.options.TopologyZone,
606+
disableZoneAwareness: rg.Metadata.Annotations[trafficZoneAwareAnnotationKey] == "false",
600607
}
601608

602609
ri, err := transformRouteGroup(ctx)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
kube_default__ingress_with_opt_out__with_example_org____svc_with_opt_out: Host("^(with[.]example[.]org[.]?(:[0-9]+)?)$")
2+
-> annotate("zalando.org/traffic-zone-aware", "false") -> <roundRobin,"http://10.3.0.3:8080", "http://10.3.0.4:8080", "http://10.3.0.5:8080", "http://10.3.1.3:8080", "http://10.3.1.4:8080", "http://10.3.1.5:8080">;
3+
kube_default__ingress_without_opt_out__without_example_org____svc_without_opt_out: Host("^(without[.]example[.]org[.]?(:[0-9]+)?)$")
4+
-> <roundRobin,"http://10.3.0.3:8080", "http://10.3.0.4:8080", "http://10.3.0.5:8080">;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
enable-kubernetes-endpointslices: true
2+
topology-zone: eu-central-1a
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
labels:
5+
app: app-with-opt-out
6+
name: svc-with-opt-out
7+
spec:
8+
clusterIP: 10.3.190.1
9+
ports:
10+
- name: web
11+
port: 80
12+
protocol: TCP
13+
targetPort: 8080
14+
selector:
15+
app: app-with-opt-out
16+
type: ClusterIP
17+
---
18+
apiVersion: v1
19+
kind: Service
20+
metadata:
21+
labels:
22+
app: app-without-opt-out
23+
name: svc-without-opt-out
24+
spec:
25+
clusterIP: 10.3.190.2
26+
ports:
27+
- name: web
28+
port: 80
29+
protocol: TCP
30+
targetPort: 8080
31+
selector:
32+
app: app-without-opt-out
33+
type: ClusterIP
34+
---
35+
apiVersion: networking.k8s.io/v1
36+
kind: Ingress
37+
metadata:
38+
labels:
39+
app: app-with-opt-out
40+
name: ingress-with-opt-out
41+
namespace: default
42+
annotations:
43+
zalando.org/traffic-zone-aware: "false"
44+
spec:
45+
rules:
46+
- host: with.example.org
47+
http:
48+
paths:
49+
- backend:
50+
service:
51+
name: svc-with-opt-out
52+
port:
53+
number: 80
54+
pathType: ImplementationSpecific
55+
---
56+
apiVersion: networking.k8s.io/v1
57+
kind: Ingress
58+
metadata:
59+
labels:
60+
app: app-without-opt-out
61+
name: ingress-without-opt-out
62+
namespace: default
63+
spec:
64+
rules:
65+
- host: without.example.org
66+
http:
67+
paths:
68+
- backend:
69+
service:
70+
name: svc-without-opt-out
71+
port:
72+
number: 80
73+
pathType: ImplementationSpecific
74+
---
75+
# svc-with-opt-out: 3 endpoints in eu-central-1a — meets minEndpointsByZone, but with opt-out; should return all endpoints
76+
apiVersion: v1
77+
kind: EndpointSlice
78+
metadata:
79+
labels:
80+
app: app-with-opt-out
81+
kubernetes.io/service-name: svc-with-opt-out
82+
name: svc-with-opt-out-eps
83+
namespace: default
84+
endpoints:
85+
- addresses:
86+
- 10.3.0.3
87+
zone: eu-central-1a
88+
- addresses:
89+
- 10.3.0.4
90+
zone: eu-central-1a
91+
- addresses:
92+
- 10.3.0.5
93+
zone: eu-central-1a
94+
- addresses:
95+
- 10.3.1.3
96+
zone: eu-central-1b
97+
- addresses:
98+
- 10.3.1.4
99+
zone: eu-central-1b
100+
- addresses:
101+
- 10.3.1.5
102+
zone: eu-central-1b
103+
ports:
104+
- name: web
105+
port: 8080
106+
protocol: TCP
107+
apiVersion: v1
108+
---
109+
# svc-without-opt-out: only 3 endpoints in eu-central-1a — meets minEndpointsByZone
110+
apiVersion: v1
111+
kind: EndpointSlice
112+
metadata:
113+
labels:
114+
app: app-without-opt-out
115+
kubernetes.io/service-name: svc-without-opt-out
116+
name: svc-without-opt-out-eps
117+
namespace: default
118+
endpoints:
119+
- addresses:
120+
- 10.3.0.3
121+
zone: eu-central-1a
122+
- addresses:
123+
- 10.3.0.4
124+
zone: eu-central-1a
125+
- addresses:
126+
- 10.3.0.5
127+
zone: eu-central-1a
128+
- addresses:
129+
- 10.4.1.4
130+
zone: eu-central-1b
131+
ports:
132+
- name: web
133+
port: 8080
134+
protocol: TCP
135+
apiVersion: v1
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
kube_rg__default__ingress_with_opt_out__all__0_0: Host("^(with[.]example[.]org[.]?(:[0-9]+)?)$")
2+
-> annotate("zalando.org/traffic-zone-aware", "false") -> <roundRobin,"http://10.3.0.3:8080", "http://10.3.0.4:8080", "http://10.3.0.5:8080", "http://10.3.1.3:8080", "http://10.3.1.4:8080", "http://10.3.1.5:8080">;
3+
kube_rg__default__ingress_without_opt_out__all__0_0: Host("^(without[.]example[.]org[.]?(:[0-9]+)?)$")
4+
-> <roundRobin,"http://10.3.0.3:8080", "http://10.3.0.4:8080", "http://10.3.0.5:8080">;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
enable-kubernetes-endpointslices: true
2+
topology-zone: eu-central-1a

0 commit comments

Comments
 (0)