Skip to content

Commit 85a0ccd

Browse files
committed
UDP GEP: add explicit conformance tests, provisional TODOs
1 parent f9a4ed4 commit 85a0ccd

1 file changed

Lines changed: 172 additions & 6 deletions

File tree

geps/gep-2645/index.md

Lines changed: 172 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,14 +235,171 @@ spec:
235235
port: 53
236236
```
237237
238-
## Conformance
238+
## Conformance Details
239239
240-
UDPRoute will be part of the Gateway API conformance suite with the following requirements:
240+
The following Gateway Conformance features will be added:
241241
242-
- Implementations MUST support routing UDP traffic to Kubernetes Service backends
243-
- Implementations MUST respect backend weights for traffic distribution
244-
- Implementations MUST properly handle invalid backend references
245-
- Implementations MUST update route status conditions appropriately
242+
```
243+
// SupportUDPRoute option indicates support for UDPRoute
244+
SupportUDPRoute FeatureName = "UDPRoute"
245+
```
246+
247+
They will validate the following scenarios:
248+
249+
1. UDPRoute attaches to a UDP listener by port specified
250+
- A Gateway has a UDP listener on port 5300
251+
- A UDPRoute specifies a `parentRef` with `port: 5300`
252+
253+
- The UDPRoute is accepted with the following status:
254+
255+
```
256+
parents:
257+
- parentRef:
258+
group: gateway.networking.k8s.io
259+
kind: Gateway
260+
name: udp-gateway
261+
port: 5300
262+
conditions:
263+
- type: Accepted
264+
status: "True"
265+
reason: Accepted
266+
```
267+
268+
- UDP traffic sent to port 5300 is forwarded to the backend.
269+
270+
1. UDPRoute attaches to a UDP listener by sectionName
271+
- A Gateway has a UDP listener named `coredns` on port 5300
272+
- A UDPRoute specifies a `parentRef` with `sectionName: coredns`
273+
274+
- The UDPRoute is accepted with the following status:
275+
276+
```
277+
parents:
278+
- parentRef:
279+
group: gateway.networking.k8s.io
280+
kind: Gateway
281+
name: udp-gateway
282+
sectionName: coredns
283+
conditions:
284+
- type: Accepted
285+
status: "True"
286+
reason: Accepted
287+
```
288+
289+
- UDP traffic sent to the `coredns` listener is forwarded to the backend.
290+
291+
1. UDPRoute attaches to a UDP listener by sectionName and port
292+
- A Gateway has a UDP listener named `coredns` on port 5300
293+
- A UDPRoute specifies a `parentRef` with `sectionName: coredns` and `port: 5300`
294+
295+
- The UDPRoute is accepted with the following status:
296+
297+
```
298+
parents:
299+
- parentRef:
300+
group: gateway.networking.k8s.io
301+
kind: Gateway
302+
name: udp-gateway
303+
sectionName: coredns
304+
port: 5300
305+
conditions:
306+
- type: Accepted
307+
status: "True"
308+
reason: Accepted
309+
```
310+
311+
- UDP traffic sent to port 5300 on the `coredns` listener is forwarded to the backend.
312+
313+
1. UDPRoute attaches to all UDP listeners in a Gateway when sectionName and port are omitted
314+
- A Gateway has multiple UDP listeners: `dns` on port 5300 and `game` on port 7777
315+
- A UDPRoute specifies a `parentRef` with only the Gateway name (no `sectionName` or `port`)
316+
317+
- The UDPRoute is accepted with the following status:
318+
319+
```
320+
parents:
321+
- parentRef:
322+
group: gateway.networking.k8s.io
323+
kind: Gateway
324+
name: udp-gateway
325+
conditions:
326+
- type: Accepted
327+
status: "True"
328+
reason: Accepted
329+
```
330+
331+
- The UDPRoute attaches to all UDP listeners on the Gateway.
332+
333+
1. UDPRoute fails attachment to a non-UDP listener when port or sectionName is specified
334+
- A Gateway has a TCP listener named `tcp-listener` on port 5300 and no UDP listeners on that port/name
335+
- A UDPRoute specifies a `parentRef` targeting the TCP listener via `sectionName: tcp-listener`
336+
337+
- The UDPRoute is not accepted with the following status:
338+
339+
```
340+
parents:
341+
- parentRef:
342+
group: gateway.networking.k8s.io
343+
kind: Gateway
344+
name: mixed-gateway
345+
sectionName: tcp-listener
346+
conditions:
347+
- type: Accepted
348+
status: "False"
349+
reason: NotAllowedByListeners
350+
```
351+
352+
- No UDP traffic is routed through the TCP listener.
353+
354+
1. UDPRoute references a backend Service that does not exist
355+
- A Gateway has a UDP listener named `coredns` on port 5300
356+
- A UDPRoute specifies a `parentRef` with `sectionName: coredns` and a `backendRef` pointing to a Service `nonexistent-service` that does not exist
357+
358+
- The UDPRoute has the following status:
359+
360+
```
361+
parents:
362+
- parentRef:
363+
group: gateway.networking.k8s.io
364+
kind: Gateway
365+
name: udp-gateway
366+
sectionName: coredns
367+
conditions:
368+
- type: Accepted
369+
status: "False"
370+
reason: BackendNotFound
371+
- type: ResolvedRefs
372+
status: "False"
373+
reason: BackendNotFound
374+
```
375+
376+
- No UDP traffic is forwarded for this route.
377+
378+
1. UDPRoute with multiple weighted backends distributes flows according to configured weights
379+
- A Gateway has a UDP listener named `game` on port 7777
380+
- A UDPRoute specifies a `parentRef` with `sectionName: game` and multiple `backendRefs`:
381+
- `game-server-1` with `weight: 70`
382+
- `game-server-2` with `weight: 30`
383+
384+
- The UDPRoute is accepted with the following status:
385+
386+
```
387+
parents:
388+
- parentRef:
389+
group: gateway.networking.k8s.io
390+
kind: Gateway
391+
name: udp-gateway
392+
sectionName: game
393+
conditions:
394+
- type: Accepted
395+
status: "True"
396+
reason: Accepted
397+
- type: ResolvedRefs
398+
status: "True"
399+
reason: ResolvedRefs
400+
```
401+
402+
- UDP flows are sent to port 7777 is distributed across backends respecting the configured weights (approximately 70% to `game-server-1` and 30% to `game-server-2`).
246403
247404
Conformance Level: **Core**
248405
@@ -251,3 +408,12 @@ Conformance Level: **Core**
251408
- [TCPRoute Specification](https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1alpha2.TCPRoute)
252409
- [GEP-735: TCP and UDP addresses matching](../gep-735/index.md) (Declined, but relevant context)
253410
- [Gateway API Use Cases](https://gateway-api.sigs.k8s.io/concepts/use-cases/)
411+
412+
## Provisional TODOs
413+
414+
- Define behavior for multiple UDP routes attaching to same listener [Do we merge? reject?]
415+
- Declare optional behaviors
416+
- Client IP perservation
417+
- Flow management [flow timeout]
418+
- Routing options [5 tuple, 3 tuple]
419+
- Port range support

0 commit comments

Comments
 (0)