Skip to content

Commit 141e2e6

Browse files
committed
Add Remote Infrastructure documentation
Signed-off-by: Zachary Nixon <nixozach@amazon.com>
1 parent e4b57e6 commit 141e2e6

7 files changed

Lines changed: 423 additions & 3 deletions

File tree

api/v1alpha1/envoygateway_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,7 @@ type RateLimit struct {
639639
Telemetry *RateLimitTelemetry `json:"telemetry,omitempty"`
640640

641641
// URL of the RateLimit Service.
642+
// Must be a grpc:// URL with an explicit host and port, e.g. grpc://example.com:50051.
642643
// The default is the Kubernetes service deployed by the Kubernetes Infrastructure manager.
643644
// +optional
644645
URL *string `json:"url"`

api/v1alpha1/validation/envoygateway_validate.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package validation
88
import (
99
"fmt"
1010
"net/url"
11+
"strconv"
1112
"strings"
1213
"time"
1314

@@ -245,10 +246,25 @@ func validateEnvoyGatewayCustomRateLimit(rateLimit *egv1a1.RateLimit) error {
245246
if rateLimit.URL == nil {
246247
return fmt.Errorf("empty ratelimit url settings")
247248
}
248-
_, err := url.Parse(*rateLimit.URL)
249+
u, err := url.Parse(*rateLimit.URL)
249250
if err != nil {
250251
return fmt.Errorf("unknown ratelimit url format: %w", err)
251252
}
253+
// The xDS translator expects a grpc:// URL with an explicit port so it can
254+
// build the rate limit service cluster. Reject anything else here so that
255+
// configuration validation fails instead of the translator panicking.
256+
if u.Scheme != "grpc" {
257+
return fmt.Errorf("ratelimit url must use the grpc:// scheme, got %q", *rateLimit.URL)
258+
}
259+
if u.Hostname() == "" {
260+
return fmt.Errorf("ratelimit url must include a host, got %q", *rateLimit.URL)
261+
}
262+
if u.Port() == "" {
263+
return fmt.Errorf("ratelimit url must include an explicit port, got %q", *rateLimit.URL)
264+
}
265+
if _, err := strconv.ParseUint(u.Port(), 10, 32); err != nil {
266+
return fmt.Errorf("ratelimit url has invalid port %q: %w", u.Port(), err)
267+
}
252268
return nil
253269
}
254270

api/v1alpha1/validation/envoygateway_validate_test.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,126 @@ func TestValidateEnvoyGateway(t *testing.T) {
433433
},
434434
expect: false,
435435
},
436+
{
437+
name: "ratelimit url without scheme for custom provider",
438+
eg: &egv1a1.EnvoyGateway{
439+
EnvoyGatewaySpec: egv1a1.EnvoyGatewaySpec{
440+
Gateway: egv1a1.DefaultGateway(),
441+
Provider: new(egv1a1.EnvoyGatewayProvider{
442+
Type: egv1a1.ProviderTypeCustom,
443+
Custom: new(egv1a1.EnvoyGatewayCustomProvider{
444+
Resource: egv1a1.EnvoyGatewayResourceProvider{
445+
Type: egv1a1.ResourceProviderTypeKubernetes,
446+
},
447+
Infrastructure: new(egv1a1.EnvoyGatewayInfrastructureProvider{
448+
Type: egv1a1.InfrastructureProviderTypeRemote,
449+
Remote: new(egv1a1.EnvoyGatewayRemoteInfrastructureProvider{
450+
Service: new(egv1a1.ExtensionService{
451+
BackendEndpoint: egv1a1.BackendEndpoint{
452+
IP: new(egv1a1.IPEndpoint{Address: "127.0.0.1", Port: 50051}),
453+
},
454+
}),
455+
}),
456+
}),
457+
}),
458+
}),
459+
RateLimit: &egv1a1.RateLimit{
460+
URL: new("cool-rate-limiter.com:50051"),
461+
},
462+
},
463+
},
464+
expect: false,
465+
},
466+
{
467+
name: "ratelimit url with non-grpc scheme for custom provider",
468+
eg: &egv1a1.EnvoyGateway{
469+
EnvoyGatewaySpec: egv1a1.EnvoyGatewaySpec{
470+
Gateway: egv1a1.DefaultGateway(),
471+
Provider: new(egv1a1.EnvoyGatewayProvider{
472+
Type: egv1a1.ProviderTypeCustom,
473+
Custom: new(egv1a1.EnvoyGatewayCustomProvider{
474+
Resource: egv1a1.EnvoyGatewayResourceProvider{
475+
Type: egv1a1.ResourceProviderTypeKubernetes,
476+
},
477+
Infrastructure: new(egv1a1.EnvoyGatewayInfrastructureProvider{
478+
Type: egv1a1.InfrastructureProviderTypeRemote,
479+
Remote: new(egv1a1.EnvoyGatewayRemoteInfrastructureProvider{
480+
Service: new(egv1a1.ExtensionService{
481+
BackendEndpoint: egv1a1.BackendEndpoint{
482+
IP: new(egv1a1.IPEndpoint{Address: "127.0.0.1", Port: 50051}),
483+
},
484+
}),
485+
}),
486+
}),
487+
}),
488+
}),
489+
RateLimit: &egv1a1.RateLimit{
490+
URL: new("https://cool-rate-limiter.com:50051"),
491+
},
492+
},
493+
},
494+
expect: false,
495+
},
496+
{
497+
name: "ratelimit url without port for custom provider",
498+
eg: &egv1a1.EnvoyGateway{
499+
EnvoyGatewaySpec: egv1a1.EnvoyGatewaySpec{
500+
Gateway: egv1a1.DefaultGateway(),
501+
Provider: new(egv1a1.EnvoyGatewayProvider{
502+
Type: egv1a1.ProviderTypeCustom,
503+
Custom: new(egv1a1.EnvoyGatewayCustomProvider{
504+
Resource: egv1a1.EnvoyGatewayResourceProvider{
505+
Type: egv1a1.ResourceProviderTypeKubernetes,
506+
},
507+
Infrastructure: new(egv1a1.EnvoyGatewayInfrastructureProvider{
508+
Type: egv1a1.InfrastructureProviderTypeRemote,
509+
Remote: new(egv1a1.EnvoyGatewayRemoteInfrastructureProvider{
510+
Service: new(egv1a1.ExtensionService{
511+
BackendEndpoint: egv1a1.BackendEndpoint{
512+
IP: new(egv1a1.IPEndpoint{Address: "127.0.0.1", Port: 50051}),
513+
},
514+
}),
515+
}),
516+
}),
517+
}),
518+
}),
519+
RateLimit: &egv1a1.RateLimit{
520+
URL: new("grpc://cool-rate-limiter.com"),
521+
},
522+
},
523+
},
524+
expect: false,
525+
},
526+
{
527+
name: "ratelimit url without host for custom provider",
528+
eg: &egv1a1.EnvoyGateway{
529+
EnvoyGatewaySpec: egv1a1.EnvoyGatewaySpec{
530+
Gateway: egv1a1.DefaultGateway(),
531+
Provider: new(egv1a1.EnvoyGatewayProvider{
532+
Type: egv1a1.ProviderTypeCustom,
533+
Custom: new(egv1a1.EnvoyGatewayCustomProvider{
534+
Resource: egv1a1.EnvoyGatewayResourceProvider{
535+
Type: egv1a1.ResourceProviderTypeKubernetes,
536+
},
537+
Infrastructure: new(egv1a1.EnvoyGatewayInfrastructureProvider{
538+
Type: egv1a1.InfrastructureProviderTypeRemote,
539+
Remote: new(egv1a1.EnvoyGatewayRemoteInfrastructureProvider{
540+
Service: new(egv1a1.ExtensionService{
541+
BackendEndpoint: egv1a1.BackendEndpoint{
542+
IP: new(egv1a1.IPEndpoint{Address: "127.0.0.1", Port: 50051}),
543+
},
544+
}),
545+
}),
546+
}),
547+
}),
548+
}),
549+
RateLimit: &egv1a1.RateLimit{
550+
URL: new("grpc://:50051"),
551+
},
552+
},
553+
},
554+
expect: false,
555+
},
436556
{
437557
name: "happy extension settings",
438558
eg: &egv1a1.EnvoyGateway{

internal/provider/kubernetes/status.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,6 @@ func mergeRouteParentStatus(ns string, old, new []gwapiv1.RouteParentStatus) []g
733733
return merged
734734
}
735735

736-
// This has to get updated.
737736
func (r *gatewayAPIReconciler) updateStatusForGateway(ctx context.Context, gtw *gwapiv1.Gateway) {
738737
// nil check for unit tests.
739738
if r.statusUpdater == nil {

site/content/en/latest/api/extension_types.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5156,7 +5156,7 @@ _Appears in:_
51565156
| `timeout` | _[Duration](https://gateway-api.sigs.k8s.io/reference/api-spec/1.5/spec/#duration)_ | false | | Timeout specifies the timeout period for the proxy to access the ratelimit server<br />If not set, timeout is 20ms. |
51575157
| `failClosed` | _boolean_ | true | | FailClosed is a switch used to control the flow of traffic<br />when the response from the ratelimit server cannot be obtained.<br />If FailClosed is false, let the traffic pass,<br />otherwise, don't let the traffic pass and return 500.<br />If not set, FailClosed is False. |
51585158
| `telemetry` | _[RateLimitTelemetry](#ratelimittelemetry)_ | false | | Telemetry defines telemetry configuration for RateLimit. |
5159-
| `url` | _string_ | false | | URL of the RateLimit Service.<br />The default is the Kubernetes service deployed by the Kubernetes Infrastructure manager. |
5159+
| `url` | _string_ | false | | URL of the RateLimit Service.<br />Must be a grpc:// URL with an explicit host and port, e.g. grpc://example.com:50051.<br />The default is the Kubernetes service deployed by the Kubernetes Infrastructure manager. |
51605160

51615161

51625162
#### RateLimitCost

site/content/en/latest/tasks/extensibility/_index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ Envoy Gateway provides several ways to extend its functionality beyond the built
1717
- [External Processing](ext-proc) - Call external gRPC services during request processing
1818
- [Lua Extensions](lua) - Write lightweight scripting extensions
1919
- [Dynamic Modules](dynamic-modules) - Load custom C++ modules at runtime for advanced extensibility
20+
- [Remote Infrastructure Provider](remote-infrastructure-provider) - Defer Envoy data plane management to a custom infrastructure provider.

0 commit comments

Comments
 (0)