diff --git a/api/v1alpha1/loadbalancer_types.go b/api/v1alpha1/loadbalancer_types.go
index 5d997df169..e89a883902 100644
--- a/api/v1alpha1/loadbalancer_types.go
+++ b/api/v1alpha1/loadbalancer_types.go
@@ -237,35 +237,37 @@ type BackendUtilization struct {
// carried in response headers/trailers.
//
// The backend must implement OpenRcaService for this to take effect.
+ //
// +optional
- // +notImplementedHide
OutOfBand *OutOfBandReporting `json:"outOfBand,omitempty"`
}
// OutOfBandReporting configures out-of-band ORCA load reporting for the
// BackendUtilization load balancer.
-//
-// +notImplementedHide
type OutOfBandReporting struct {
// ReportingPeriod is how often Envoy requests load reports from the server.
- // If omitted, uses Envoy's default of 10s.
+ // Must be greater than 0. Defaults to 10s.
+ //
+ // +kubebuilder:validation:XValidation:rule="duration(self) > duration('0s')",message="reportingPeriod must be greater than 0"
// +optional
- // +notImplementedHide
ReportingPeriod *gwapiv1.Duration `json:"reportingPeriod,omitempty"`
// Port overrides the port used for the OutOfBand reporting connection, e.g. to
// reach a separate reporting sidecar. Defaults to the endpoint's port.
+ //
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=65535
// +optional
- // +notImplementedHide
Port *int32 `json:"port,omitempty"`
// Authority overrides the :authority header on the OutOfBand gRPC stream.
+ // If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ // the cluster name.
//
+ // +kubebuilder:validation:MinLength=1
+ // +kubebuilder:validation:MaxLength=259
// +kubebuilder:validation:Pattern=`^[^\x00\n\r]*$`
// +optional
- // +notImplementedHide
Authority *string `json:"authority,omitempty"`
}
diff --git a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml
index 4339f2d25d..2f2653c307 100644
--- a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml
+++ b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml
@@ -1113,8 +1113,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority header
- on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1128,9 +1132,12 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported load metrics
diff --git a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml
index 4c2ab56c4f..226dfac0f4 100644
--- a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml
+++ b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml
@@ -988,8 +988,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1003,9 +1007,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than
+ 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyproxies.yaml b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyproxies.yaml
index 59a008c27a..3c0de62b12 100644
--- a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyproxies.yaml
+++ b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyproxies.yaml
@@ -12330,9 +12330,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -12346,9 +12349,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -13940,9 +13947,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -13956,9 +13966,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -15716,9 +15730,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -15732,9 +15749,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must
+ be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has
@@ -17440,8 +17461,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -17455,9 +17480,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_securitypolicies.yaml b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_securitypolicies.yaml
index 7f33b38a97..77c2382a36 100644
--- a/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_securitypolicies.yaml
+++ b/charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_securitypolicies.yaml
@@ -1694,8 +1694,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1709,9 +1713,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -3169,8 +3177,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -3184,9 +3196,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -4952,9 +4968,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the
- :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -4968,9 +4987,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not
@@ -6755,8 +6778,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -6770,9 +6797,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml
index 843f4cca62..46e1d1ea12 100644
--- a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml
+++ b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_backendtrafficpolicies.yaml
@@ -1112,8 +1112,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority header
- on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1127,9 +1131,12 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported load metrics
diff --git a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml
index 0c2a075728..ea10065d6d 100644
--- a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml
+++ b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml
@@ -987,8 +987,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1002,9 +1006,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than
+ 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyproxies.yaml b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyproxies.yaml
index 9cc3ea54f3..9fe1b15eea 100644
--- a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyproxies.yaml
+++ b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyproxies.yaml
@@ -12329,9 +12329,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -12345,9 +12348,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -13939,9 +13946,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -13955,9 +13965,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -15715,9 +15729,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -15731,9 +15748,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must
+ be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has
@@ -17439,8 +17460,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -17454,9 +17479,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_securitypolicies.yaml b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_securitypolicies.yaml
index 964b149323..d6a028741a 100644
--- a/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_securitypolicies.yaml
+++ b/charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_securitypolicies.yaml
@@ -1693,8 +1693,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1708,9 +1712,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -3168,8 +3176,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -3183,9 +3195,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -4951,9 +4967,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the
- :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -4967,9 +4986,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not
@@ -6754,8 +6777,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -6769,9 +6796,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/examples/backend-utilization/go.mod b/examples/backend-utilization/go.mod
index 53826f4c6f..419765b31d 100644
--- a/examples/backend-utilization/go.mod
+++ b/examples/backend-utilization/go.mod
@@ -1,3 +1,17 @@
module github.com/envoyproxy/gateway-backend-utilization
go 1.26.5
+
+require (
+ github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2
+ google.golang.org/grpc v1.82.1
+ google.golang.org/protobuf v1.36.11
+)
+
+require (
+ github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
+ golang.org/x/net v0.53.0 // indirect
+ golang.org/x/sys v0.43.0 // indirect
+ golang.org/x/text v0.36.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
+)
diff --git a/examples/backend-utilization/go.sum b/examples/backend-utilization/go.sum
index e69de29bb2..d11d749568 100644
--- a/examples/backend-utilization/go.sum
+++ b/examples/backend-utilization/go.sum
@@ -0,0 +1,42 @@
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik=
+github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4=
+github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
+github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
+go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
+go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
+go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
+go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
+go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
+go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
+go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
+go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
+go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
+go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
+go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
+golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
+golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
+golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
+golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
+golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
+gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
+gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
+google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE=
+google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
+google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
+google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
diff --git a/examples/backend-utilization/main.go b/examples/backend-utilization/main.go
index abaa36b555..a346d04ee8 100644
--- a/examples/backend-utilization/main.go
+++ b/examples/backend-utilization/main.go
@@ -10,8 +10,24 @@ import (
"fmt"
"log"
"maps"
+ "net"
"net/http"
"os"
+ "strconv"
+ "time"
+
+ orcadata "github.com/cncf/xds/go/xds/data/orca/v3"
+ orcaservice "github.com/cncf/xds/go/xds/service/orca/v3"
+ "google.golang.org/grpc"
+)
+
+const (
+ // Interval used when Envoy does not ask for a specific report_interval on the
+ // OOB stream.
+ defaultReportInterval = 10 * time.Second
+ // Floor on the requested interval, so a misconfigured reporting period cannot
+ // turn the example into a busy loop.
+ minReportInterval = 100 * time.Millisecond
)
type response struct {
@@ -25,20 +41,103 @@ type response struct {
ServiceName string `json:"service_name"`
}
+// orcaService implements xds.service.orca.v3.OpenRcaService, the out-of-band
+// (OOB) side of ORCA reporting. Envoy opens one StreamCoreMetrics stream per
+// endpoint and receives a report every report_interval, independent of request
+// traffic.
+type orcaService struct {
+ orcaservice.UnimplementedOpenRcaServiceServer
+ report *orcadata.OrcaLoadReport
+}
+
+func (s *orcaService) StreamCoreMetrics(req *orcaservice.OrcaLoadReportRequest, stream grpc.ServerStreamingServer[orcadata.OrcaLoadReport]) error {
+ interval := defaultReportInterval
+ if d := req.GetReportInterval().AsDuration(); d > 0 {
+ interval = d
+ }
+ interval = max(interval, minReportInterval)
+
+ log.Printf("OOB stream opened, reporting every %s", interval)
+ defer log.Printf("OOB stream closed")
+
+ // Report once up front so Envoy does not have to wait a full period for the
+ // first sample.
+ if err := stream.Send(s.report); err != nil {
+ return err
+ }
+
+ ticker := time.NewTicker(interval)
+ defer ticker.Stop()
+ for {
+ select {
+ case <-stream.Context().Done():
+ return stream.Context().Err()
+ case <-ticker.C:
+ if err := stream.Send(s.report); err != nil {
+ return err
+ }
+ }
+ }
+}
+
+func newORCAServer(cpuUtil float64) *grpc.Server {
+ srv := grpc.NewServer()
+ orcaservice.RegisterOpenRcaServiceServer(srv, &orcaService{
+ report: &orcadata.OrcaLoadReport{
+ CpuUtilization: cpuUtil,
+ RpsFractional: 1000,
+ },
+ })
+ return srv
+}
+
+func serveORCA(addr string, cpuUtil float64) error {
+ lis, err := net.Listen("tcp", addr)
+ if err != nil {
+ return fmt.Errorf("listen on %s: %w", addr, err)
+ }
+ log.Printf("Starting ORCA OpenRcaService on %s", addr)
+ return newORCAServer(cpuUtil).Serve(lis)
+}
+
func main() {
podName := os.Getenv("POD_NAME")
namespace := os.Getenv("NAMESPACE")
serviceName := os.Getenv("SERVICE_NAME")
+
cpuUtil := os.Getenv("ORCA_CPU_UTILIZATION")
if cpuUtil == "" {
cpuUtil = "0.0"
}
+ cpuUtilValue, err := strconv.ParseFloat(cpuUtil, 64)
+ if err != nil {
+ log.Fatalf("invalid ORCA_CPU_UTILIZATION %q: %v", cpuUtil, err)
+ }
+
+ // In-band reporting is on by default. Set ORCA_INBAND=false to report only
+ // out-of-band, which is how the OOB path is exercised in isolation.
+ inBand := true
+ if v := os.Getenv("ORCA_INBAND"); v != "" {
+ if inBand, err = strconv.ParseBool(v); err != nil {
+ log.Fatalf("invalid ORCA_INBAND %q: %v", v, err)
+ }
+ }
+
+ grpcPort := os.Getenv("ORCA_GRPC_PORT")
+ if grpcPort == "" {
+ grpcPort = "3001"
+ }
+ go func() {
+ log.Fatal(serveORCA(net.JoinHostPort("", grpcPort), cpuUtilValue))
+ }()
orcaHeader := fmt.Sprintf(`JSON {"cpu_utilization": %s, "rps_fractional": 1000}`, cpuUtil)
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
- w.Header().Set("endpoint-load-metrics", orcaHeader)
+ if inBand {
+ w.Header().Set("endpoint-load-metrics", orcaHeader)
+ }
headers := make(map[string][]string, len(r.Header))
maps.Copy(headers, r.Header)
@@ -59,6 +158,6 @@ func main() {
}
})
- log.Printf("Starting ORCA backend on :3000 (cpu_utilization=%s)", cpuUtil)
+ log.Printf("Starting ORCA backend on :3000 (cpu_utilization=%s, in-band=%t)", cpuUtil, inBand)
log.Fatal(http.ListenAndServe(":3000", nil))
}
diff --git a/examples/backend-utilization/main_test.go b/examples/backend-utilization/main_test.go
new file mode 100644
index 0000000000..b2c0a5d5ce
--- /dev/null
+++ b/examples/backend-utilization/main_test.go
@@ -0,0 +1,63 @@
+// Copyright Envoy Gateway Authors
+// SPDX-License-Identifier: Apache-2.0
+// The full text of the Apache license is available in the LICENSE file at
+// the root of the repo.
+
+package main
+
+import (
+ "context"
+ "net"
+ "testing"
+ "time"
+
+ orcaservice "github.com/cncf/xds/go/xds/service/orca/v3"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+ "google.golang.org/protobuf/types/known/durationpb"
+)
+
+// TestStreamCoreMetrics exercises the same OpenRcaService stream that Envoy opens
+// for out-of-band ORCA reporting, so the OOB path can be checked without a cluster.
+func TestStreamCoreMetrics(t *testing.T) {
+ lis, err := net.Listen("tcp", "127.0.0.1:0")
+ if err != nil {
+ t.Fatalf("listen: %v", err)
+ }
+ srv := newORCAServer(0.9)
+ go func() {
+ if err := srv.Serve(lis); err != nil {
+ t.Logf("server stopped: %v", err)
+ }
+ }()
+ t.Cleanup(srv.Stop)
+
+ conn, err := grpc.NewClient(lis.Addr().String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
+ if err != nil {
+ t.Fatalf("dial: %v", err)
+ }
+ t.Cleanup(func() { _ = conn.Close() })
+
+ ctx, cancel := context.WithTimeout(t.Context(), 30*time.Second)
+ defer cancel()
+
+ stream, err := orcaservice.NewOpenRcaServiceClient(conn).StreamCoreMetrics(ctx,
+ &orcaservice.OrcaLoadReportRequest{ReportInterval: durationpb.New(minReportInterval)})
+ if err != nil {
+ t.Fatalf("StreamCoreMetrics: %v", err)
+ }
+
+ // One report is sent immediately, the rest on the requested interval.
+ for i := range 3 {
+ report, err := stream.Recv()
+ if err != nil {
+ t.Fatalf("recv report %d: %v", i, err)
+ }
+ if got := report.GetCpuUtilization(); got != 0.9 {
+ t.Errorf("report %d: cpu_utilization = %v, want 0.9", i, got)
+ }
+ if got := report.GetRpsFractional(); got != 1000 {
+ t.Errorf("report %d: rps_fractional = %v, want 1000", i, got)
+ }
+ }
+}
diff --git a/examples/extension-server/go.mod b/examples/extension-server/go.mod
index 7491183d93..bb23fa2ac4 100644
--- a/examples/extension-server/go.mod
+++ b/examples/extension-server/go.mod
@@ -4,8 +4,8 @@ go 1.26.5
require (
github.com/envoyproxy/gateway v1.3.1
- github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff
- github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff
+ github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908
+ github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908
github.com/urfave/cli/v2 v2.27.7
google.golang.org/grpc v1.82.1
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
diff --git a/examples/extension-server/go.sum b/examples/extension-server/go.sum
index 969c36c1e8..4196b48ac4 100644
--- a/examples/extension-server/go.sum
+++ b/examples/extension-server/go.sum
@@ -21,10 +21,10 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff h1:tDxhbFOO5qR1vgixjuOI5RBxASCvac4Ki3EgC4dBDPI=
-github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff/go.mod h1:H3lDamtuGa0Y80VmchcmbutXMYNPDr0j+JrLlsgyEyo=
-github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff h1:stwP9x94QfAFs+RF+YFkSrSuTxBuVrj6Sv+PJXJkXzo=
-github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff/go.mod h1:RgJXVdNtBhId0AeGnDEqPRSejRMoz//JumYvSTcJTvM=
+github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908 h1:Ymr4e9UMtsAYCBiuHV2JF8BxaMZu49yEFpTXBqgaqUE=
+github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908/go.mod h1:rcDQvjX9fwNQvh7l9pxwfGBufBWU6xQ0zK5mcsH8/Lg=
+github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908 h1:yp1HVjmLFpwwN3Ik82LUTAZ6giMb6NAuhA3fralKvRQ=
+github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908/go.mod h1:rYoRI6N8FcjZVmmeKqH8/ykAhfro9Bg8+of2IpBseyQ=
github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w=
diff --git a/examples/kubernetes/backend-utilization.yaml b/examples/kubernetes/backend-utilization.yaml
index 0d175caea3..5a2b51efd7 100644
--- a/examples/kubernetes/backend-utilization.yaml
+++ b/examples/kubernetes/backend-utilization.yaml
@@ -37,7 +37,10 @@ spec:
image: envoyproxy/gateway-backend-utilization:latest
imagePullPolicy: IfNotPresent
ports:
- - containerPort: 3000
+ - name: http
+ containerPort: 3000
+ - name: orca-grpc
+ containerPort: 3001
env:
- name: POD_NAME
valueFrom:
@@ -79,7 +82,10 @@ spec:
image: envoyproxy/gateway-backend-utilization:latest
imagePullPolicy: IfNotPresent
ports:
- - containerPort: 3000
+ - name: http
+ containerPort: 3000
+ - name: orca-grpc
+ containerPort: 3001
env:
- name: POD_NAME
valueFrom:
diff --git a/go.mod b/go.mod
index 9e77a3c550..829bdc0bef 100644
--- a/go.mod
+++ b/go.mod
@@ -12,10 +12,10 @@ require (
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
github.com/docker/cli v29.6.2+incompatible
github.com/dominikbraun/graph v0.23.0
- github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff
- github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260627225610-70ff85c381ff
- github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff
- github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260627225610-70ff85c381ff
+ github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908
+ github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260729145720-a2d8c7492908
+ github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908
+ github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260729145720-a2d8c7492908
github.com/envoyproxy/ratelimit v1.4.1-0.20260122083618-3fb702589d36
github.com/evanphx/json-patch v5.9.11+incompatible
github.com/evanphx/json-patch/v5 v5.9.11
diff --git a/go.sum b/go.sum
index c143c159d7..d1c2cfdc89 100644
--- a/go.sum
+++ b/go.sum
@@ -147,14 +147,14 @@ github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/
github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
-github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff h1:tDxhbFOO5qR1vgixjuOI5RBxASCvac4Ki3EgC4dBDPI=
-github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff/go.mod h1:H3lDamtuGa0Y80VmchcmbutXMYNPDr0j+JrLlsgyEyo=
-github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260627225610-70ff85c381ff h1:uPvDnxeo1yGkZS0DKq28GprxMhfNZogPTi0+u6K8Kd0=
-github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260627225610-70ff85c381ff/go.mod h1:v21y1Uq30hmHbNsT2JOGMJG9cF+Ls7zTfIVOBLAU1TE=
-github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff h1:stwP9x94QfAFs+RF+YFkSrSuTxBuVrj6Sv+PJXJkXzo=
-github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff/go.mod h1:RgJXVdNtBhId0AeGnDEqPRSejRMoz//JumYvSTcJTvM=
-github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260627225610-70ff85c381ff h1:Co6W1/F/z5JehSpnO4GLI8xkeJzO851Y5fQ7Bfxc48M=
-github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260627225610-70ff85c381ff/go.mod h1:YySqCcozu0HwklKZzeX6N98q+TyqEkgX2sg7DQqiJfU=
+github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908 h1:Ymr4e9UMtsAYCBiuHV2JF8BxaMZu49yEFpTXBqgaqUE=
+github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908/go.mod h1:rcDQvjX9fwNQvh7l9pxwfGBufBWU6xQ0zK5mcsH8/Lg=
+github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260729145720-a2d8c7492908 h1:+7FtQqQ7Yfo5dgsAyTAIe8OhmUtWUw6VjeQ3by2Xdm4=
+github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260729145720-a2d8c7492908/go.mod h1:pdjA+146jsWRsJ0M1jgfRrvJq1HPWeyvaT/Va+nV2OY=
+github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908 h1:yp1HVjmLFpwwN3Ik82LUTAZ6giMb6NAuhA3fralKvRQ=
+github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908/go.mod h1:rYoRI6N8FcjZVmmeKqH8/ykAhfro9Bg8+of2IpBseyQ=
+github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260729145720-a2d8c7492908 h1:dNsOk1pDOqRl4SzUdAWDPXQ05VASaD5CYYaVpfZr7os=
+github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260729145720-a2d8c7492908/go.mod h1:kFrXkz+a+gF/F56IcDXtBE0QfpZfFTyf92okqDzIBu0=
github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
github.com/envoyproxy/ratelimit v1.4.1-0.20260122083618-3fb702589d36 h1:nEi1OH2qhE8NtcuBgO/uKpTw/P0nVu4i8mZvL6oD9CQ=
diff --git a/internal/gatewayapi/clustersettings.go b/internal/gatewayapi/clustersettings.go
index 199c8ba820..d442c2414d 100644
--- a/internal/gatewayapi/clustersettings.go
+++ b/internal/gatewayapi/clustersettings.go
@@ -391,6 +391,20 @@ func buildLoadBalancer(policy *egv1a1.ClusterSettings) (*ir.LoadBalancer, error)
lb.BackendUtilization.MetricNamesForComputingUtilization = append([]string(nil), backendUtilization.MetricNamesForComputingUtilization...)
}
lb.BackendUtilization.KeepResponseHeaders = new(ptr.Deref(backendUtilization.KeepResponseHeaders, false))
+ if backendUtilization.OutOfBand != nil {
+ oob := &ir.OutOfBandReporting{
+ Port: backendUtilization.OutOfBand.Port,
+ Authority: backendUtilization.OutOfBand.Authority,
+ }
+ if backendUtilization.OutOfBand.ReportingPeriod != nil {
+ d, err := time.ParseDuration(string(*backendUtilization.OutOfBand.ReportingPeriod))
+ if err != nil {
+ return nil, fmt.Errorf("invalid OutOfBand ReportingPeriod value %s: %w", *backendUtilization.OutOfBand.ReportingPeriod, err)
+ }
+ oob.ReportingPeriod = ir.MetaV1DurationPtr(d)
+ }
+ lb.BackendUtilization.OutOfBand = oob
+ }
}
if policy.LoadBalancer.SlowStart != nil && policy.LoadBalancer.SlowStart.Window != nil {
d, err := time.ParseDuration(string(*policy.LoadBalancer.SlowStart.Window))
diff --git a/internal/gatewayapi/testdata/backendtrafficpolicy-with-backend-utilization-out-of-band.in.yaml b/internal/gatewayapi/testdata/backendtrafficpolicy-with-backend-utilization-out-of-band.in.yaml
new file mode 100644
index 0000000000..10432fadd0
--- /dev/null
+++ b/internal/gatewayapi/testdata/backendtrafficpolicy-with-backend-utilization-out-of-band.in.yaml
@@ -0,0 +1,87 @@
+gateways:
+- apiVersion: gateway.networking.k8s.io/v1
+ kind: Gateway
+ metadata:
+ namespace: envoy-gateway
+ name: gateway-1
+ spec:
+ gatewayClassName: envoy-gateway-class
+ listeners:
+ - name: http
+ protocol: HTTP
+ port: 80
+ allowedRoutes:
+ namespaces:
+ from: All
+httpRoutes:
+- apiVersion: gateway.networking.k8s.io/v1
+ kind: HTTPRoute
+ metadata:
+ namespace: default
+ name: httproute-1
+ spec:
+ hostnames:
+ - gateway.envoyproxy.io
+ parentRefs:
+ - namespace: envoy-gateway
+ name: gateway-1
+ sectionName: http
+ rules:
+ - matches:
+ - path:
+ value: "/"
+ backendRefs:
+ - name: service-1
+ port: 8080
+- apiVersion: gateway.networking.k8s.io/v1
+ kind: HTTPRoute
+ metadata:
+ namespace: default
+ name: httproute-2
+ spec:
+ hostnames:
+ - gateway.envoyproxy.io
+ parentRefs:
+ - namespace: envoy-gateway
+ name: gateway-1
+ sectionName: http
+ rules:
+ - matches:
+ - path:
+ value: "/defaults"
+ backendRefs:
+ - name: service-1
+ port: 8080
+backendTrafficPolicies:
+- apiVersion: gateway.envoyproxy.io/v1alpha1
+ kind: BackendTrafficPolicy
+ metadata:
+ namespace: default
+ name: policy-for-route
+ spec:
+ targetRef:
+ group: gateway.networking.k8s.io
+ kind: HTTPRoute
+ name: httproute-1
+ loadBalancer:
+ type: BackendUtilization
+ backendUtilization:
+ blackoutPeriod: 10s
+ outOfBand:
+ reportingPeriod: 5s
+ port: 9001
+ authority: orca.example.com
+- apiVersion: gateway.envoyproxy.io/v1alpha1
+ kind: BackendTrafficPolicy
+ metadata:
+ namespace: default
+ name: policy-for-route-2
+ spec:
+ targetRef:
+ group: gateway.networking.k8s.io
+ kind: HTTPRoute
+ name: httproute-2
+ loadBalancer:
+ type: BackendUtilization
+ backendUtilization:
+ outOfBand: {}
diff --git a/internal/gatewayapi/testdata/backendtrafficpolicy-with-backend-utilization-out-of-band.out.yaml b/internal/gatewayapi/testdata/backendtrafficpolicy-with-backend-utilization-out-of-band.out.yaml
new file mode 100644
index 0000000000..19ecbd417c
--- /dev/null
+++ b/internal/gatewayapi/testdata/backendtrafficpolicy-with-backend-utilization-out-of-band.out.yaml
@@ -0,0 +1,342 @@
+backendTrafficPolicies:
+- apiVersion: gateway.envoyproxy.io/v1alpha1
+ kind: BackendTrafficPolicy
+ metadata:
+ name: policy-for-route
+ namespace: default
+ spec:
+ loadBalancer:
+ backendUtilization:
+ blackoutPeriod: 10s
+ outOfBand:
+ authority: orca.example.com
+ port: 9001
+ reportingPeriod: 5s
+ type: BackendUtilization
+ targetRef:
+ group: gateway.networking.k8s.io
+ kind: HTTPRoute
+ name: httproute-1
+ status:
+ ancestors:
+ - ancestorRef:
+ group: gateway.networking.k8s.io
+ kind: Gateway
+ name: gateway-1
+ namespace: envoy-gateway
+ sectionName: http
+ conditions:
+ - lastTransitionTime: null
+ message: Policy has been accepted.
+ reason: Accepted
+ status: "True"
+ type: Accepted
+ - lastTransitionTime: null
+ message: spec.targetRef is deprecated, use spec.targetRefs instead
+ reason: DeprecatedField
+ status: "True"
+ type: Warning
+ controllerName: gateway.envoyproxy.io/gatewayclass-controller
+- apiVersion: gateway.envoyproxy.io/v1alpha1
+ kind: BackendTrafficPolicy
+ metadata:
+ name: policy-for-route-2
+ namespace: default
+ spec:
+ loadBalancer:
+ backendUtilization:
+ outOfBand: {}
+ type: BackendUtilization
+ targetRef:
+ group: gateway.networking.k8s.io
+ kind: HTTPRoute
+ name: httproute-2
+ status:
+ ancestors:
+ - ancestorRef:
+ group: gateway.networking.k8s.io
+ kind: Gateway
+ name: gateway-1
+ namespace: envoy-gateway
+ sectionName: http
+ conditions:
+ - lastTransitionTime: null
+ message: Policy has been accepted.
+ reason: Accepted
+ status: "True"
+ type: Accepted
+ - lastTransitionTime: null
+ message: spec.targetRef is deprecated, use spec.targetRefs instead
+ reason: DeprecatedField
+ status: "True"
+ type: Warning
+ controllerName: gateway.envoyproxy.io/gatewayclass-controller
+gateways:
+- apiVersion: gateway.networking.k8s.io/v1
+ kind: Gateway
+ metadata:
+ name: gateway-1
+ namespace: envoy-gateway
+ spec:
+ gatewayClassName: envoy-gateway-class
+ listeners:
+ - allowedRoutes:
+ namespaces:
+ from: All
+ name: http
+ port: 80
+ protocol: HTTP
+ status:
+ listeners:
+ - attachedRoutes: 2
+ conditions:
+ - lastTransitionTime: null
+ message: Sending translated listener configuration to the data plane
+ reason: Programmed
+ status: "True"
+ type: Programmed
+ - lastTransitionTime: null
+ message: Listener has been successfully translated
+ reason: Accepted
+ status: "True"
+ type: Accepted
+ - lastTransitionTime: null
+ message: Listener references have been resolved
+ reason: ResolvedRefs
+ status: "True"
+ type: ResolvedRefs
+ name: http
+ supportedKinds:
+ - group: gateway.networking.k8s.io
+ kind: HTTPRoute
+ - group: gateway.networking.k8s.io
+ kind: GRPCRoute
+httpRoutes:
+- apiVersion: gateway.networking.k8s.io/v1
+ kind: HTTPRoute
+ metadata:
+ name: httproute-1
+ namespace: default
+ spec:
+ hostnames:
+ - gateway.envoyproxy.io
+ parentRefs:
+ - name: gateway-1
+ namespace: envoy-gateway
+ sectionName: http
+ rules:
+ - backendRefs:
+ - name: service-1
+ port: 8080
+ matches:
+ - path:
+ value: /
+ status:
+ parents:
+ - conditions:
+ - lastTransitionTime: null
+ message: Route is accepted
+ reason: Accepted
+ status: "True"
+ type: Accepted
+ - lastTransitionTime: null
+ message: Resolved all the Object references for the Route
+ reason: ResolvedRefs
+ status: "True"
+ type: ResolvedRefs
+ controllerName: gateway.envoyproxy.io/gatewayclass-controller
+ parentRef:
+ name: gateway-1
+ namespace: envoy-gateway
+ sectionName: http
+- apiVersion: gateway.networking.k8s.io/v1
+ kind: HTTPRoute
+ metadata:
+ name: httproute-2
+ namespace: default
+ spec:
+ hostnames:
+ - gateway.envoyproxy.io
+ parentRefs:
+ - name: gateway-1
+ namespace: envoy-gateway
+ sectionName: http
+ rules:
+ - backendRefs:
+ - name: service-1
+ port: 8080
+ matches:
+ - path:
+ value: /defaults
+ status:
+ parents:
+ - conditions:
+ - lastTransitionTime: null
+ message: Route is accepted
+ reason: Accepted
+ status: "True"
+ type: Accepted
+ - lastTransitionTime: null
+ message: Resolved all the Object references for the Route
+ reason: ResolvedRefs
+ status: "True"
+ type: ResolvedRefs
+ controllerName: gateway.envoyproxy.io/gatewayclass-controller
+ parentRef:
+ name: gateway-1
+ namespace: envoy-gateway
+ sectionName: http
+infraIR:
+ envoy-gateway/gateway-1:
+ proxy:
+ listeners:
+ - name: envoy-gateway/gateway-1/http
+ ports:
+ - containerPort: 10080
+ name: http-80
+ protocol: HTTP
+ servicePort: 80
+ metadata:
+ labels:
+ gateway.envoyproxy.io/owning-gateway-name: gateway-1
+ gateway.envoyproxy.io/owning-gateway-namespace: envoy-gateway
+ ownerReference:
+ kind: GatewayClass
+ name: envoy-gateway-class
+ name: envoy-gateway/gateway-1
+ namespace: envoy-gateway-system
+xdsIR:
+ envoy-gateway/gateway-1:
+ accessLog:
+ json:
+ - path: /dev/stdout
+ globalResources:
+ proxyServiceCluster:
+ metadata:
+ kind: Service
+ name: envoy-envoy-gateway-gateway-1-196ae069
+ namespace: envoy-gateway-system
+ sectionName: "8080"
+ name: envoy-gateway/gateway-1
+ settings:
+ - addressType: IP
+ endpoints:
+ - host: 7.6.5.4
+ port: 8080
+ zone: zone1
+ metadata:
+ kind: Service
+ name: envoy-envoy-gateway-gateway-1-196ae069
+ namespace: envoy-gateway-system
+ sectionName: "8080"
+ name: envoy-gateway/gateway-1
+ protocol: TCP
+ http:
+ - address: 0.0.0.0
+ externalPort: 80
+ hostnames:
+ - '*'
+ metadata:
+ kind: Gateway
+ name: gateway-1
+ namespace: envoy-gateway
+ sectionName: http
+ name: envoy-gateway/gateway-1/http
+ path:
+ escapedSlashesAction: UnescapeAndRedirect
+ mergeSlashes: true
+ port: 10080
+ routes:
+ - destination:
+ metadata:
+ kind: HTTPRoute
+ name: httproute-2
+ namespace: default
+ name: httproute/default/httproute-2/rule/0
+ settings:
+ - addressType: IP
+ endpoints:
+ - host: 7.7.7.7
+ port: 8080
+ metadata:
+ kind: Service
+ name: service-1
+ namespace: default
+ sectionName: "8080"
+ name: httproute/default/httproute-2/rule/0/backend/0
+ protocol: HTTP
+ weight: 1
+ hostname: gateway.envoyproxy.io
+ isHTTP2: false
+ metadata:
+ kind: HTTPRoute
+ name: httproute-2
+ namespace: default
+ policies:
+ - kind: BackendTrafficPolicy
+ name: policy-for-route-2
+ namespace: default
+ name: httproute/default/httproute-2/rule/0/match/0/gateway_envoyproxy_io
+ pathMatch:
+ distinct: false
+ name: ""
+ prefix: /defaults
+ removeResponseHeaders:
+ - endpoint-load-metrics
+ - endpoint-load-metrics-bin
+ traffic:
+ loadBalancer:
+ backendUtilization:
+ keepResponseHeaders: false
+ outOfBand: {}
+ - destination:
+ metadata:
+ kind: HTTPRoute
+ name: httproute-1
+ namespace: default
+ name: httproute/default/httproute-1/rule/0
+ settings:
+ - addressType: IP
+ endpoints:
+ - host: 7.7.7.7
+ port: 8080
+ metadata:
+ kind: Service
+ name: service-1
+ namespace: default
+ sectionName: "8080"
+ name: httproute/default/httproute-1/rule/0/backend/0
+ protocol: HTTP
+ weight: 1
+ hostname: gateway.envoyproxy.io
+ isHTTP2: false
+ metadata:
+ kind: HTTPRoute
+ name: httproute-1
+ namespace: default
+ policies:
+ - kind: BackendTrafficPolicy
+ name: policy-for-route
+ namespace: default
+ name: httproute/default/httproute-1/rule/0/match/0/gateway_envoyproxy_io
+ pathMatch:
+ distinct: false
+ name: ""
+ prefix: /
+ removeResponseHeaders:
+ - endpoint-load-metrics
+ - endpoint-load-metrics-bin
+ traffic:
+ loadBalancer:
+ backendUtilization:
+ blackoutPeriod: 10s
+ keepResponseHeaders: false
+ outOfBand:
+ authority: orca.example.com
+ port: 9001
+ reportingPeriod: 5s
+ readyListener:
+ address: 0.0.0.0
+ ipFamily: IPv4
+ path: /ready
+ port: 19003
diff --git a/internal/ir/xds.go b/internal/ir/xds.go
index 7837b300cd..9d3e377fa2 100644
--- a/internal/ir/xds.go
+++ b/internal/ir/xds.go
@@ -3152,13 +3152,26 @@ type Random struct{}
// BackendUtilization load balancer settings
// +k8s:deepcopy-gen=true
type BackendUtilization struct {
- BlackoutPeriod *metav1.Duration `json:"blackoutPeriod,omitempty" yaml:"blackoutPeriod,omitempty"`
- WeightExpirationPeriod *metav1.Duration `json:"weightExpirationPeriod,omitempty" yaml:"weightExpirationPeriod,omitempty"`
- WeightUpdatePeriod *metav1.Duration `json:"weightUpdatePeriod,omitempty" yaml:"weightUpdatePeriod,omitempty"`
- ErrorUtilizationPenaltyPercent *uint32 `json:"errorUtilizationPenaltyPercent,omitempty" yaml:"errorUtilizationPenaltyPercent,omitempty"`
- MetricNamesForComputingUtilization []string `json:"metricNamesForComputingUtilization,omitempty" yaml:"metricNamesForComputingUtilization,omitempty"`
- SlowStart *SlowStart `json:"slowStart,omitempty" yaml:"slowStart,omitempty"`
- KeepResponseHeaders *bool `json:"keepResponseHeaders,omitempty" yaml:"keepResponseHeaders,omitempty"`
+ BlackoutPeriod *metav1.Duration `json:"blackoutPeriod,omitempty" yaml:"blackoutPeriod,omitempty"`
+ WeightExpirationPeriod *metav1.Duration `json:"weightExpirationPeriod,omitempty" yaml:"weightExpirationPeriod,omitempty"`
+ WeightUpdatePeriod *metav1.Duration `json:"weightUpdatePeriod,omitempty" yaml:"weightUpdatePeriod,omitempty"`
+ ErrorUtilizationPenaltyPercent *uint32 `json:"errorUtilizationPenaltyPercent,omitempty" yaml:"errorUtilizationPenaltyPercent,omitempty"`
+ MetricNamesForComputingUtilization []string `json:"metricNamesForComputingUtilization,omitempty" yaml:"metricNamesForComputingUtilization,omitempty"`
+ SlowStart *SlowStart `json:"slowStart,omitempty" yaml:"slowStart,omitempty"`
+ KeepResponseHeaders *bool `json:"keepResponseHeaders,omitempty" yaml:"keepResponseHeaders,omitempty"`
+ OutOfBand *OutOfBandReporting `json:"outOfBand,omitempty" yaml:"outOfBand,omitempty"`
+}
+
+// OutOfBandReporting configures out-of-band ORCA load reporting for the
+// BackendUtilization load balancer.
+// +k8s:deepcopy-gen=true
+type OutOfBandReporting struct {
+ // ReportingPeriod is how often Envoy requests load reports from the server.
+ ReportingPeriod *metav1.Duration `json:"reportingPeriod,omitempty" yaml:"reportingPeriod,omitempty"`
+ // Port overrides the port used for the out-of-band reporting connection.
+ Port *int32 `json:"port,omitempty" yaml:"port,omitempty"`
+ // Authority overrides the :authority header on the out-of-band gRPC stream.
+ Authority *string `json:"authority,omitempty" yaml:"authority,omitempty"`
}
// ConsistentHash load balancer settings
diff --git a/internal/ir/zz_generated.deepcopy.go b/internal/ir/zz_generated.deepcopy.go
index cfbfc5a62d..a781e3c334 100644
--- a/internal/ir/zz_generated.deepcopy.go
+++ b/internal/ir/zz_generated.deepcopy.go
@@ -601,6 +601,11 @@ func (in *BackendUtilization) DeepCopyInto(out *BackendUtilization) {
*out = new(bool)
**out = **in
}
+ if in.OutOfBand != nil {
+ in, out := &in.OutOfBand, &out.OutOfBand
+ *out = new(OutOfBandReporting)
+ (*in).DeepCopyInto(*out)
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackendUtilization.
@@ -3425,6 +3430,36 @@ func (in *OpenTelemetryAccessLog) DeepCopy() *OpenTelemetryAccessLog {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *OutOfBandReporting) DeepCopyInto(out *OutOfBandReporting) {
+ *out = *in
+ if in.ReportingPeriod != nil {
+ in, out := &in.ReportingPeriod, &out.ReportingPeriod
+ *out = new(metav1.Duration)
+ **out = **in
+ }
+ if in.Port != nil {
+ in, out := &in.Port, &out.Port
+ *out = new(int32)
+ **out = **in
+ }
+ if in.Authority != nil {
+ in, out := &in.Authority, &out.Authority
+ *out = new(string)
+ **out = **in
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OutOfBandReporting.
+func (in *OutOfBandReporting) DeepCopy() *OutOfBandReporting {
+ if in == nil {
+ return nil
+ }
+ out := new(OutOfBandReporting)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OutlierDetection) DeepCopyInto(out *OutlierDetection) {
*out = *in
diff --git a/internal/xds/extensions/extensions.gen.go b/internal/xds/extensions/extensions.gen.go
index 921699699e..4a38cf546a 100644
--- a/internal/xds/extensions/extensions.gen.go
+++ b/internal/xds/extensions/extensions.gen.go
@@ -121,8 +121,10 @@ import (
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/a2a/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/adaptive_concurrency/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/admission_control/v3"
+ _ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/ai_protocol_manager/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/alternate_protocols_cache/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/api_key_auth/v3"
+ _ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/aws_eventstream_parser/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/aws_lambda/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/aws_request_signing/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/bandwidth_limit/v3"
@@ -233,6 +235,7 @@ import (
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/udp/dns_filter/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/udp/dynamic_modules/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/udp/udp_proxy/session/dynamic_forward_proxy/v3"
+ _ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/udp/udp_proxy/session/ext_authz/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/udp/udp_proxy/session/http_capsule/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/udp/udp_proxy/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/formatter/cel/v3"
@@ -256,6 +259,7 @@ import (
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/grpc_service/channel_credentials/tls/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/grpc_service/channel_credentials/xds/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/health_check/event_sinks/file/v3"
+ _ "github.com/envoyproxy/go-control-plane/envoy/extensions/health_checkers/dynamic_modules/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/health_checkers/redis/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/health_checkers/thrift/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/http/cache/file_system_http_cache/v3"
@@ -312,6 +316,7 @@ import (
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/network/dns_resolver/cares/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/network/dns_resolver/getaddrinfo/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/network/dns_resolver/hickory/v3"
+ _ "github.com/envoyproxy/go-control-plane/envoy/extensions/network/socket_interface/sockmap/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/network/socket_interface/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/outlier_detection_monitors/common/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/outlier_detection_monitors/consecutive_errors/v3"
@@ -372,12 +377,14 @@ import (
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/dynamic_modules/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/generic/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/http/v3"
+ _ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/reverse_tunnel/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/tcp/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/udp/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/tcp/generic/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/tcp/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/wasm/v3"
+ _ "github.com/envoyproxy/go-control-plane/envoy/extensions/watchdog/backtrace_action/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/watchdog/profile_action/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/service/accesslog/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"
diff --git a/internal/xds/translator/cluster.go b/internal/xds/translator/cluster.go
index a4138d3ddd..03b938b899 100644
--- a/internal/xds/translator/cluster.go
+++ b/internal/xds/translator/cluster.go
@@ -1679,6 +1679,22 @@ func buildBackendUtilizationLoadBalancingPolicy(loadBalancer *ir.LoadBalancer) (
if len(v.MetricNamesForComputingUtilization) > 0 {
cswrr.MetricNamesForComputingUtilization = append([]string(nil), v.MetricNamesForComputingUtilization...)
}
+ if v.OutOfBand != nil {
+ cswrr.EnableOobLoadReport = wrapperspb.Bool(true)
+ if v.OutOfBand.ReportingPeriod != nil {
+ cswrr.OobReportingPeriod = durationpb.New(v.OutOfBand.ReportingPeriod.Duration)
+ }
+ if v.OutOfBand.Port != nil || v.OutOfBand.Authority != nil {
+ oobConfig := &commonv3.OrcaOobReportingConfig{}
+ if v.OutOfBand.Port != nil {
+ oobConfig.PortValue = uint32(*v.OutOfBand.Port)
+ }
+ if v.OutOfBand.Authority != nil {
+ oobConfig.Authority = *v.OutOfBand.Authority
+ }
+ cswrr.OobReportingConfig = oobConfig
+ }
+ }
typedCSWRR, err := proto.ToAnyWithValidation(cswrr)
if err != nil {
return nil, err
diff --git a/internal/xds/translator/testdata/in/xds-ir/load-balancer-backend-utilization-out-of-band.yaml b/internal/xds/translator/testdata/in/xds-ir/load-balancer-backend-utilization-out-of-band.yaml
new file mode 100644
index 0000000000..3394994f56
--- /dev/null
+++ b/internal/xds/translator/testdata/in/xds-ir/load-balancer-backend-utilization-out-of-band.yaml
@@ -0,0 +1,39 @@
+http:
+- name: "first-listener"
+ address: "::"
+ port: 10080
+ hostnames:
+ - "*"
+ routes:
+ - name: "backend-utilization-oob-route"
+ hostname: "*"
+ destination:
+ name: "backend-utilization-oob-dest"
+ settings:
+ - endpoints:
+ - host: "5.6.7.8"
+ port: 8080
+ name: "backend-utilization-oob-dest/backend/0"
+ weight: 1
+ traffic:
+ loadBalancer:
+ backendUtilization:
+ blackoutPeriod: 10s
+ outOfBand:
+ reportingPeriod: 5s
+ port: 9001
+ authority: orca.example.com
+ - name: "backend-utilization-oob-defaults-route"
+ hostname: "*"
+ destination:
+ name: "backend-utilization-oob-defaults-dest"
+ settings:
+ - endpoints:
+ - host: "5.6.7.9"
+ port: 8080
+ name: "backend-utilization-oob-defaults-dest/backend/0"
+ weight: 1
+ traffic:
+ loadBalancer:
+ backendUtilization:
+ outOfBand: {}
diff --git a/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.clusters.yaml b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.clusters.yaml
new file mode 100644
index 0000000000..eff6f7a004
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.clusters.yaml
@@ -0,0 +1,49 @@
+- circuitBreakers:
+ thresholds:
+ - maxRetries: 1024
+ commonLbConfig: {}
+ connectTimeout: 10s
+ dnsLookupFamily: V4_PREFERRED
+ edsClusterConfig:
+ edsConfig:
+ ads: {}
+ resourceApiVersion: V3
+ serviceName: backend-utilization-oob-dest
+ ignoreHealthOnHostRemoval: true
+ loadBalancingPolicy:
+ policies:
+ - typedExtensionConfig:
+ name: envoy.load_balancing_policies.client_side_weighted_round_robin
+ typedConfig:
+ '@type': type.googleapis.com/envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3.ClientSideWeightedRoundRobin
+ blackoutPeriod: 10s
+ enableOobLoadReport: true
+ oobReportingConfig:
+ authority: orca.example.com
+ portValue: 9001
+ oobReportingPeriod: 5s
+ name: backend-utilization-oob-dest
+ perConnectionBufferLimitBytes: 32768
+ type: EDS
+- circuitBreakers:
+ thresholds:
+ - maxRetries: 1024
+ commonLbConfig: {}
+ connectTimeout: 10s
+ dnsLookupFamily: V4_PREFERRED
+ edsClusterConfig:
+ edsConfig:
+ ads: {}
+ resourceApiVersion: V3
+ serviceName: backend-utilization-oob-defaults-dest
+ ignoreHealthOnHostRemoval: true
+ loadBalancingPolicy:
+ policies:
+ - typedExtensionConfig:
+ name: envoy.load_balancing_policies.client_side_weighted_round_robin
+ typedConfig:
+ '@type': type.googleapis.com/envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3.ClientSideWeightedRoundRobin
+ enableOobLoadReport: true
+ name: backend-utilization-oob-defaults-dest
+ perConnectionBufferLimitBytes: 32768
+ type: EDS
diff --git a/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.endpoints.yaml b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.endpoints.yaml
new file mode 100644
index 0000000000..157a858d05
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.endpoints.yaml
@@ -0,0 +1,24 @@
+- clusterName: backend-utilization-oob-dest
+ endpoints:
+ - lbEndpoints:
+ - endpoint:
+ address:
+ socketAddress:
+ address: 5.6.7.8
+ portValue: 8080
+ loadBalancingWeight: 1
+ loadBalancingWeight: 1
+ locality:
+ region: backend-utilization-oob-dest/backend/0
+- clusterName: backend-utilization-oob-defaults-dest
+ endpoints:
+ - lbEndpoints:
+ - endpoint:
+ address:
+ socketAddress:
+ address: 5.6.7.9
+ portValue: 8080
+ loadBalancingWeight: 1
+ loadBalancingWeight: 1
+ locality:
+ region: backend-utilization-oob-defaults-dest/backend/0
diff --git a/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.listeners.yaml b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.listeners.yaml
new file mode 100644
index 0000000000..5c7db41545
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.listeners.yaml
@@ -0,0 +1,33 @@
+- address:
+ socketAddress:
+ address: '::'
+ portValue: 10080
+ defaultFilterChain:
+ filters:
+ - name: envoy.filters.network.http_connection_manager
+ typedConfig:
+ '@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
+ commonHttpProtocolOptions:
+ headersWithUnderscoresAction: REJECT_REQUEST
+ http2ProtocolOptions:
+ initialConnectionWindowSize: 1048576
+ initialStreamWindowSize: 65536
+ maxConcurrentStreams: 100
+ httpFilters:
+ - name: envoy.filters.http.router
+ typedConfig:
+ '@type': type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
+ suppressEnvoyHeaders: true
+ normalizePath: true
+ rds:
+ configSource:
+ ads: {}
+ resourceApiVersion: V3
+ routeConfigName: first-listener
+ serverHeaderTransformation: PASS_THROUGH
+ statPrefix: http-10080
+ useRemoteAddress: true
+ name: first-listener
+ maxConnectionsToAcceptPerSocketEvent: 1
+ name: first-listener
+ perConnectionBufferLimitBytes: 32768
diff --git a/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.routes.yaml b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.routes.yaml
new file mode 100644
index 0000000000..3bf1ff17d3
--- /dev/null
+++ b/internal/xds/translator/testdata/out/xds-ir/load-balancer-backend-utilization-out-of-band.routes.yaml
@@ -0,0 +1,21 @@
+- ignorePortInHostMatching: true
+ name: first-listener
+ virtualHosts:
+ - domains:
+ - '*'
+ name: first-listener/*
+ routes:
+ - match:
+ prefix: /
+ name: backend-utilization-oob-route
+ route:
+ cluster: backend-utilization-oob-dest
+ upgradeConfigs:
+ - upgradeType: websocket
+ - match:
+ prefix: /
+ name: backend-utilization-oob-defaults-route
+ route:
+ cluster: backend-utilization-oob-defaults-dest
+ upgradeConfigs:
+ - upgradeType: websocket
diff --git a/release-notes/current/new_features/9593-backend-utilization-out-of-band.md b/release-notes/current/new_features/9593-backend-utilization-out-of-band.md
new file mode 100644
index 0000000000..0cb12f1988
--- /dev/null
+++ b/release-notes/current/new_features/9593-backend-utilization-out-of-band.md
@@ -0,0 +1 @@
+Added `loadBalancer.backendUtilization.outOfBand` to BackendTrafficPolicy, enabling out-of-band ORCA load reporting. Envoy opens a server-streaming gRPC connection to each endpoint's `xds.service.orca.v3.OpenRcaService/StreamCoreMetrics` and pulls load reports on a schedule, independent of request traffic. This supplements in-band ORCA metrics carried in response headers and trailers rather than replacing them — reports from either source feed the same endpoint weights. `reportingPeriod` controls how often reports are requested, while `port` and `authority` allow reaching a dedicated reporting sidecar. The backend must implement `OpenRcaService` for this to take effect.
diff --git a/site/content/en/latest/api/extension_types.md b/site/content/en/latest/api/extension_types.md
index 26b24d9946..17bf0ec22b 100644
--- a/site/content/en/latest/api/extension_types.md
+++ b/site/content/en/latest/api/extension_types.md
@@ -643,6 +643,7 @@ _Appears in:_
| `errorUtilizationPenaltyPercent` | _integer_ | false | | ErrorUtilizationPenaltyPercent adjusts endpoint weights based on the error rate (eps/qps).
This is expressed as a percentage-based integer where 100 represents 1.0, 150 represents 1.5, etc.
For example:
- 100 => 1.0x
- 120 => 1.2x
- 200 => 2.0x
Must be non-negative. |
| `metricNamesForComputingUtilization` | _string array_ | false | | Metric names used to compute utilization if application_utilization is not set.
For map fields in ORCA proto, use the form ".", e.g., "named_metrics.foo". |
| `keepResponseHeaders` | _boolean_ | false | false | KeepResponseHeaders keeps the ORCA load report headers/trailers before sending the response to the client.
Defaults to false. |
+| `outOfBand` | _[OutOfBandReporting](#outofbandreporting)_ | false | | OutOfBand enables out-of-band ORCA load reporting. When set, Envoy opens a
server-streaming gRPC connection to each endpoint's
xds.service.orca.v3.OpenRcaService/StreamCoreMetrics and pulls load
reports periodically, instead of relying on in-band ORCA metrics
carried in response headers/trailers.
The backend must implement OpenRcaService for this to take effect. |
#### BandwidthLimitRequestConfig
@@ -4599,6 +4600,9 @@ _Appears in:_
| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
+| `reportingPeriod` | _[Duration](https://gateway-api.sigs.k8s.io/reference/api-spec/1.5/spec/#duration)_ | false | | ReportingPeriod is how often Envoy requests load reports from the server.
Must be greater than 0. Defaults to 10s. |
+| `port` | _integer_ | false | | Port overrides the port used for the OutOfBand reporting connection, e.g. to
reach a separate reporting sidecar. Defaults to the endpoint's port. |
+| `authority` | _string_ | false | | Authority overrides the :authority header on the OutOfBand gRPC stream.
If unset, Envoy uses the endpoint hostname, then the dialed address, then
the cluster name. |
#### PassiveHealthCheck
diff --git a/site/content/en/latest/tasks/traffic/backend-utilization.md b/site/content/en/latest/tasks/traffic/backend-utilization.md
index adbd19f787..448c0eb3d2 100644
--- a/site/content/en/latest/tasks/traffic/backend-utilization.md
+++ b/site/content/en/latest/tasks/traffic/backend-utilization.md
@@ -10,13 +10,15 @@ See the [Load Balancing concepts page][concepts-lb] for a deeper explanation of
## Prerequisites
-* Your backend (or a sidecar in front of it) must emit ORCA load metrics as response headers or trailers. See [Backend instrumentation](#backend-instrumentation) below.
+* Your backend (or a sidecar in front of it) must report ORCA load metrics — either **in-band** as response headers or trailers, or **out-of-band** by implementing the `OpenRcaService` gRPC stream. See [Backend instrumentation](#backend-instrumentation) and [Out-of-Band (OOB) Reporting](#out-of-band-oob-reporting) below.
* {{< boilerplate prerequisites >}}
## Build and Deploy the Example Backend
The Envoy Gateway repository includes a small HTTP server under `examples/backend-utilization/` that emits a fixed ORCA `cpu_utilization` value (set via the `ORCA_CPU_UTILIZATION` environment variable) on every response. The example manifest deploys two sets of pods — one reporting `0.1` (idle) and one reporting `0.9` (hot) — behind a single Service. This lets you observe the weighting effect without wiring real load into a backend.
+The same server also implements the `OpenRcaService` gRPC stream on port `3001` for [out-of-band reporting](#out-of-band-oob-reporting), and accepts `ORCA_INBAND=false` to turn the response headers off so that OOB is the only source of metrics.
+
**Note:** The `envoyproxy/gateway-backend-utilization` image is not published to a public registry — you need to build it locally from a checkout of the Envoy Gateway repository.
* Build the example backend image
@@ -121,6 +123,7 @@ All fields on `backendUtilization` are optional.
| `errorUtilizationPenaltyPercent` | `0` | Multiplier (as `percent × 100`) applied to an endpoint's effective utilization based on its error rate (eps/qps). `100` = 1.0×, `150` = 1.5×, `200` = 2.0×. Higher values push errant endpoints out of rotation faster. |
| `metricNamesForComputingUtilization` | _unset_ | Custom ORCA metric keys to feed into the weight formula when `application_utilization` isn't reported. Use `named_metrics.` for keys inside the ORCA proto's `named_metrics` map. |
| `keepResponseHeaders` | `false` | By default Envoy strips the ORCA headers/trailers before forwarding the response. Set to `true` to let downstream clients see them (useful for chained load balancers or debugging). |
+| `outOfBand` | _unset_ | Enables [out-of-band ORCA reporting](#out-of-band-oob-reporting) — Envoy also streams load reports from the endpoint's `OpenRcaService` on a schedule, in addition to any in-band metrics carried in response headers/trailers. |
### Example: Tuned for a Bursty Backend
@@ -164,6 +167,66 @@ Your backend must emit ORCA load metrics. Envoy accepts metrics in three formats
For gRPC backends, the [xDS ORCA][grpc-orca] libraries emit these automatically via the `orca_load_report` service. For HTTP backends, add a response middleware that measures and serializes your CPU/memory/custom metrics on each response.
+## Out-of-Band (OOB) Reporting
+
+By default Envoy reads ORCA metrics **in-band** — from the response headers or trailers of regular requests (see [Backend Instrumentation](#backend-instrumentation) above). With out-of-band (OOB) reporting, Envoy additionally opens a dedicated server-streaming gRPC connection to each endpoint's [`OpenRcaService`][open-rca] (`xds.service.orca.v3.OpenRcaService/StreamCoreMetrics`) and receives load reports on a fixed schedule, independent of request traffic.
+
+OOB reporting is useful when:
+
+* Request volume is low or bursty, so in-band samples arrive too infrequently to weight endpoints well.
+* You want load signals even for endpoints that are currently idle.
+* A separate reporting sidecar exposes the ORCA stream on its own port.
+
+Enable it by adding an `outOfBand` block. Its presence turns OOB on; an empty `outOfBand: {}` enables it with Envoy's defaults.
+
+OOB **supplements** in-band reporting, it does not replace it: Envoy keeps consuming ORCA metrics from response headers/trailers (and `keepResponseHeaders` still applies), and reports from either source feed the same endpoint weight table. Enabling OOB is therefore safe for a backend that already reports in-band — it only adds a second, traffic-independent source of samples.
+
+```yaml
+loadBalancer:
+ type: BackendUtilization
+ backendUtilization:
+ outOfBand:
+ reportingPeriod: 5s # how often Envoy requests a report (default 10s)
+ port: 9001 # optional: reach a reporting sidecar on a different port
+ authority: orca.example.com # optional: :authority header for the OOB gRPC stream
+```
+
+| Field | Default | Purpose |
+|---|---|---|
+| `outOfBand.reportingPeriod` | `10s` | How often Envoy requests a load report from the endpoint. The server may report less frequently than requested. Must be greater than `0`. |
+| `outOfBand.port` | endpoint port | Alternative port for the OOB reporting connection, e.g. a dedicated reporting sidecar. Must be between `1` and `65535`. Ignored for non-IP (pipe/UDS) endpoint addresses. |
+| `outOfBand.authority` | _unset_ | Overrides the `:authority` header on the OOB gRPC stream. When unset, Envoy uses the endpoint hostname, then the dialed address, then the cluster name. Must be 1–259 characters and contain no NUL, CR or LF. |
+
+### Choosing a Reporting Period
+
+`reportingPeriod` interacts with two of the fields above, and neither interaction is validated for you:
+
+* Keep it comfortably **below `weightExpirationPeriod`** (default `3m`). Weights are discarded once an endpoint has gone that long without reporting, so a `reportingPeriod` at or above the expiration window leaves endpoints sitting at their fallback weight for most of their life — `BackendUtilization` quietly degrades to plain round-robin.
+* Compare it against **`blackoutPeriod`** (default `10s`). An endpoint's weight is not used until it has been reporting continuously for the blackout period, so a `reportingPeriod` larger than `blackoutPeriod` delays the first weighted routing decision by at least one full period after startup.
+
+Envoy caps nothing here: a `reportingPeriod` of `10m` against the default `3m` expiration is accepted by both the API and Envoy, and simply produces unweighted round-robin between reports.
+
+### Trying It With the Example Backend
+
+The [example backend](#build-and-deploy-the-example-backend) serves `OpenRcaService` on port `3001`, so point `outOfBand.port` at it:
+
+```yaml
+loadBalancer:
+ type: BackendUtilization
+ backendUtilization:
+ blackoutPeriod: 1ms
+ weightUpdatePeriod: 100ms
+ outOfBand:
+ reportingPeriod: 1s
+ port: 3001
+```
+
+Set `ORCA_INBAND=false` on the example Deployments if you want to confirm the traffic skew is coming from the OOB stream rather than from response headers.
+
+Your backend must implement the `OpenRcaService` streaming RPC for OOB to take effect. gRPC backends can use the [xDS ORCA][grpc-orca] server libraries; the same [`OrcaLoadReport`][orca-proto] message carries both in-band and OOB reports.
+
+The reporting stream reuses the transport socket Envoy already uses for that endpoint, so upstream TLS (from a [BackendTLSPolicy][backend-tls]) applies to the OOB connection as well. If you point `port` at a separate reporting sidecar, that sidecar is dialed with the same transport socket and must therefore accept the same TLS configuration.
+
## Combining With Zone-Aware Routing
`BackendUtilization` composes with `weightedZones` to produce locality-aware weighted round-robin (Envoy's `wrr_locality` policy). See the [WeightedZones example][zone-aware-weighted] on the zone-aware routing page.
@@ -212,6 +275,8 @@ kubectl delete -f https://raw.githubusercontent.com/envoyproxy/gateway/latest/ex
[orca-proto]: https://www.envoyproxy.io/docs/envoy/latest/xds/data/orca/v3/orca_load_report.proto
[client-side-wrr]: https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.proto
[grpc-orca]: https://github.com/grpc/proposal/blob/master/A51-custom-backend-metrics.md
+[open-rca]: https://github.com/cncf/xds/blob/main/xds/service/orca/v3/orca.proto
+[backend-tls]: ../../security/backend-tls
[concepts-lb]: ../../../concepts/load-balancing#backend-utilization-orca
[zone-aware-weighted]: ../zone-aware-routing#weightedzones
[BackendTrafficPolicy]: ../../../api/extension_types#backendtrafficpolicy
diff --git a/test/cel-validation/backendtrafficpolicy_test.go b/test/cel-validation/backendtrafficpolicy_test.go
index 582e5a8a6b..422396efff 100644
--- a/test/cel-validation/backendtrafficpolicy_test.go
+++ b/test/cel-validation/backendtrafficpolicy_test.go
@@ -1038,7 +1038,10 @@ func TestBackendTrafficPolicyTarget(t *testing.T) {
},
}
},
- wantErrors: []string{"spec.loadBalancer.backendUtilization.outOfBand.port"},
+ wantErrors: []string{
+ "spec.loadBalancer.backendUtilization.outOfBand.port: Invalid value:",
+ ": spec.loadBalancer.backendUtilization.outOfBand.port in body should be greater than or equal to 1",
+ },
},
{
desc: "backendUtilization OutOfBand port above max is rejected",
@@ -1063,7 +1066,66 @@ func TestBackendTrafficPolicyTarget(t *testing.T) {
},
}
},
- wantErrors: []string{"spec.loadBalancer.backendUtilization.outOfBand.port"},
+ wantErrors: []string{
+ "spec.loadBalancer.backendUtilization.outOfBand.port: Invalid value:",
+ ": spec.loadBalancer.backendUtilization.outOfBand.port in body should be less than or equal to 65535",
+ },
+ },
+ {
+ desc: "backendUtilization OutOfBand reportingPeriod of zero is rejected",
+ mutate: func(btp *egv1a1.BackendTrafficPolicy) {
+ btp.Spec = egv1a1.BackendTrafficPolicySpec{
+ PolicyTargetReferences: egv1a1.PolicyTargetReferences{
+ TargetRef: &gwapiv1.LocalPolicyTargetReferenceWithSectionName{
+ LocalPolicyTargetReference: gwapiv1.LocalPolicyTargetReference{
+ Group: gwapiv1.Group("gateway.networking.k8s.io"),
+ Kind: gwapiv1.Kind("Gateway"),
+ Name: gwapiv1.ObjectName("eg"),
+ },
+ },
+ },
+ ClusterSettings: egv1a1.ClusterSettings{
+ LoadBalancer: &egv1a1.LoadBalancer{
+ Type: egv1a1.BackendUtilizationLoadBalancerType,
+ BackendUtilization: &egv1a1.BackendUtilization{
+ OutOfBand: &egv1a1.OutOfBandReporting{ReportingPeriod: new(gwapiv1.Duration("0s"))},
+ },
+ },
+ },
+ }
+ },
+ wantErrors: []string{
+ "spec.loadBalancer.backendUtilization.outOfBand.reportingPeriod: Invalid value:",
+ ": reportingPeriod must be greater than 0",
+ },
+ },
+ {
+ desc: "backendUtilization OutOfBand empty authority is rejected",
+ mutate: func(btp *egv1a1.BackendTrafficPolicy) {
+ btp.Spec = egv1a1.BackendTrafficPolicySpec{
+ PolicyTargetReferences: egv1a1.PolicyTargetReferences{
+ TargetRef: &gwapiv1.LocalPolicyTargetReferenceWithSectionName{
+ LocalPolicyTargetReference: gwapiv1.LocalPolicyTargetReference{
+ Group: gwapiv1.Group("gateway.networking.k8s.io"),
+ Kind: gwapiv1.Kind("Gateway"),
+ Name: gwapiv1.ObjectName("eg"),
+ },
+ },
+ },
+ ClusterSettings: egv1a1.ClusterSettings{
+ LoadBalancer: &egv1a1.LoadBalancer{
+ Type: egv1a1.BackendUtilizationLoadBalancerType,
+ BackendUtilization: &egv1a1.BackendUtilization{
+ OutOfBand: &egv1a1.OutOfBandReporting{Authority: new("")},
+ },
+ },
+ },
+ }
+ },
+ wantErrors: []string{
+ "spec.loadBalancer.backendUtilization.outOfBand.authority: Invalid value:",
+ ": spec.loadBalancer.backendUtilization.outOfBand.authority in body should be at least 1 chars long",
+ },
},
{
desc: "backendUtilization OutOfBand authority with newline is rejected",
@@ -1088,7 +1150,10 @@ func TestBackendTrafficPolicyTarget(t *testing.T) {
},
}
},
- wantErrors: []string{"spec.loadBalancer.backendUtilization.outOfBand.authority"},
+ wantErrors: []string{
+ "spec.loadBalancer.backendUtilization.outOfBand.authority: Invalid value:",
+ `: spec.loadBalancer.backendUtilization.outOfBand.authority in body should match '^[^\x00\n\r]*$'`,
+ },
},
{
desc: "backendUtilization field nil when type is BackendUtilization",
diff --git a/test/e2e/testdata/load_balancing_backend_utilization_out_of_band.yaml b/test/e2e/testdata/load_balancing_backend_utilization_out_of_band.yaml
new file mode 100644
index 0000000000..0ee8cfcc99
--- /dev/null
+++ b/test/e2e/testdata/load_balancing_backend_utilization_out_of_band.yaml
@@ -0,0 +1,148 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: lb-backend-utilization-oob
+ namespace: gateway-conformance-infra
+spec:
+ selector:
+ app: lb-backend-utilization-oob
+ ports:
+ - name: http
+ protocol: TCP
+ port: 8080
+ targetPort: 3000
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: lb-backend-oob-low-util
+ namespace: gateway-conformance-infra
+ labels:
+ app: lb-backend-utilization-oob
+ util: low
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: lb-backend-utilization-oob
+ util: low
+ template:
+ metadata:
+ labels:
+ app: lb-backend-utilization-oob
+ util: low
+ spec:
+ containers:
+ - name: backend
+ image: envoyproxy/gateway-backend-utilization:latest
+ imagePullPolicy: IfNotPresent
+ ports:
+ - name: http
+ containerPort: 3000
+ - name: orca-grpc
+ containerPort: 3001
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: SERVICE_NAME
+ value: lb-backend-utilization-oob
+ - name: ORCA_CPU_UTILIZATION
+ value: "0.1"
+ # Report only out-of-band, so the weighting below can only come from the
+ # OpenRcaService stream.
+ - name: ORCA_INBAND
+ value: "false"
+ resources:
+ requests:
+ cpu: 10m
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: lb-backend-oob-high-util
+ namespace: gateway-conformance-infra
+ labels:
+ app: lb-backend-utilization-oob
+ util: high
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: lb-backend-utilization-oob
+ util: high
+ template:
+ metadata:
+ labels:
+ app: lb-backend-utilization-oob
+ util: high
+ spec:
+ containers:
+ - name: backend
+ image: envoyproxy/gateway-backend-utilization:latest
+ imagePullPolicy: IfNotPresent
+ ports:
+ - name: http
+ containerPort: 3000
+ - name: orca-grpc
+ containerPort: 3001
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: SERVICE_NAME
+ value: lb-backend-utilization-oob
+ - name: ORCA_CPU_UTILIZATION
+ value: "0.9"
+ - name: ORCA_INBAND
+ value: "false"
+ resources:
+ requests:
+ cpu: 10m
+---
+apiVersion: gateway.envoyproxy.io/v1alpha1
+kind: BackendTrafficPolicy
+metadata:
+ name: backend-utilization-oob-policy
+ namespace: gateway-conformance-infra
+spec:
+ targetRefs:
+ - group: gateway.networking.k8s.io
+ kind: HTTPRoute
+ name: backend-utilization-oob-route
+ loadBalancer:
+ type: BackendUtilization
+ backendUtilization:
+ blackoutPeriod: 1ms
+ weightUpdatePeriod: 100ms
+ outOfBand:
+ reportingPeriod: 1s
+ # The example backend serves OpenRcaService on its own port.
+ port: 3001
+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: backend-utilization-oob-route
+ namespace: gateway-conformance-infra
+spec:
+ parentRefs:
+ - name: same-namespace
+ rules:
+ - matches:
+ - path:
+ type: PathPrefix
+ value: /backend-utilization-oob
+ backendRefs:
+ - name: lb-backend-utilization-oob
+ port: 8080
diff --git a/test/e2e/tests/load_balancing.go b/test/e2e/tests/load_balancing.go
index bbd40f102b..c4a70a1d04 100644
--- a/test/e2e/tests/load_balancing.go
+++ b/test/e2e/tests/load_balancing.go
@@ -47,6 +47,7 @@ func init() {
MultiHeaderConsistentHashHeaderLoadBalancing,
QueryParamsBasedConsistentHashLoadBalancing,
BackendUtilizationLoadBalancingTest,
+ BackendUtilizationOutOfBandLoadBalancingTest,
BackendUtilizationWeightedZonesLoadBalancingTest,
)
}
@@ -134,6 +135,94 @@ var BackendUtilizationLoadBalancingTest = suite.ConformanceTest{
},
}
+var BackendUtilizationOutOfBandLoadBalancingTest = suite.ConformanceTest{
+ ShortName: "BackendUtilizationOutOfBandLoadBalancing",
+ Description: "Test that BackendUtilization shifts traffic using out-of-band ORCA reports pulled from the endpoint's OpenRcaService",
+ Manifests: []string{
+ "testdata/load_balancing_backend_utilization_out_of_band.yaml",
+ },
+ Test: func(t *testing.T, suite *suite.ConformanceTestSuite) {
+ const (
+ warmupRequests = 20
+ sendRequests = 100
+ lowUtilMinPct = 80 // ORCA utilization split is 90:10 but gives a 10% buffer
+ // The policy asks for a report every 1s and Envoy delays the first
+ // stream by a random fraction of that period, so allow a few periods
+ // before expecting weights to be in effect.
+ reportSettleTime = 5 * time.Second
+ )
+
+ ns := "gateway-conformance-infra"
+ routeNN := types.NamespacedName{Name: "backend-utilization-oob-route", Namespace: ns}
+ gwNN := types.NamespacedName{Name: SameNamespaceGateway.Name, Namespace: ns}
+
+ ancestorRef := gwapiv1.ParentReference{
+ Group: gatewayapi.GroupPtr(gwapiv1.GroupName),
+ Kind: gatewayapi.KindPtr(resource.KindGateway),
+ Namespace: gatewayapi.NamespacePtr(gwNN.Namespace),
+ Name: gwapiv1.ObjectName(gwNN.Name),
+ }
+ BackendTrafficPolicyMustBeAccepted(t, suite.Client, types.NamespacedName{Name: "backend-utilization-oob-policy", Namespace: ns}, suite.ControllerName, ancestorRef)
+ WaitForPods(t, suite.Client, ns, map[string]string{"app": "lb-backend-utilization-oob"}, corev1.PodRunning, &PodReady)
+
+ gwAddr := kubernetes.GatewayAndRoutesMustBeAccepted(t, suite.Client, suite.TimeoutConfig, suite.ControllerName, kubernetes.NewGatewayRef(gwNN), &gwapiv1.HTTPRoute{}, false, routeNN)
+
+ expectedResponse := http.ExpectedResponse{
+ Request: http.Request{
+ Path: "/backend-utilization-oob",
+ },
+ Response: http.Response{
+ StatusCodes: []int{200},
+ },
+ Namespace: ns,
+ }
+ req := http.MakeRequest(t, &expectedResponse, gwAddr, "HTTP", "http")
+
+ // Identify which pod is low-util vs high-util by deployment name prefix.
+ isLowUtil := func(podName string) bool {
+ return strings.Contains(podName, "lb-backend-oob-low-util")
+ }
+
+ t.Run("warmup until both backends are hit", func(t *testing.T) {
+ if err := wait.PollUntilContextTimeout(t.Context(), time.Second, 60*time.Second, true, func(_ context.Context) (bool, error) {
+ return runTrafficTest(t, suite, &req, &expectedResponse, warmupRequests, func(trafficMap map[string]int) bool {
+ return len(trafficMap) >= 2
+ }), nil
+ }); err != nil {
+ tlog.Errorf(t, "failed to hit both backends during warmup: %v", err)
+ }
+ })
+
+ // The backends report only out-of-band (ORCA_INBAND=false), so any skew
+ // below can only come from the OpenRcaService stream.
+ time.Sleep(reportSettleTime)
+
+ t.Run("traffic should skew toward low-utilization backend", func(t *testing.T) {
+ if err := wait.PollUntilContextTimeout(t.Context(), time.Second, 60*time.Second, true, func(_ context.Context) (bool, error) {
+ return runTrafficTest(t, suite, &req, &expectedResponse, sendRequests, func(trafficMap map[string]int) bool {
+ lowCount := 0
+ total := 0
+ for podName, count := range trafficMap {
+ total += count
+ if isLowUtil(podName) {
+ lowCount += count
+ }
+ }
+ if total == 0 {
+ return false
+ }
+ lowPct := (lowCount * 100) / total
+ tlog.Logf(t, "oob traffic distribution: low-util=%d/%d (%d%%), high-util=%d/%d",
+ lowCount, total, lowPct, total-lowCount, total)
+ return lowPct >= lowUtilMinPct
+ }), nil
+ }); err != nil {
+ tlog.Errorf(t, "failed to run out-of-band backend utilization load balancing test: %v", err)
+ }
+ })
+ },
+}
+
var BackendUtilizationWeightedZonesLoadBalancingTest = suite.ConformanceTest{
ShortName: "BackendUtilizationWeightedZones",
Description: "Test that weighted zones take precedence over backend utilization across localities",
diff --git a/test/go.mod b/test/go.mod
index 2a3955df5e..513ae56655 100644
--- a/test/go.mod
+++ b/test/go.mod
@@ -106,10 +106,10 @@ require (
github.com/dominikbraun/graph v0.23.0 // indirect
github.com/ebitengine/purego v0.10.1 // indirect
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
- github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff // indirect
- github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260627225610-70ff85c381ff // indirect
- github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff // indirect
- github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260627225610-70ff85c381ff // indirect
+ github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908 // indirect
+ github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260729145720-a2d8c7492908 // indirect
+ github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908 // indirect
+ github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260729145720-a2d8c7492908 // indirect
github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
github.com/envoyproxy/ratelimit v1.4.1-0.20260122083618-3fb702589d36 // indirect
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
diff --git a/test/go.sum b/test/go.sum
index ee23bf8740..8828fd77f3 100644
--- a/test/go.sum
+++ b/test/go.sum
@@ -177,14 +177,14 @@ github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/
github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
-github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff h1:tDxhbFOO5qR1vgixjuOI5RBxASCvac4Ki3EgC4dBDPI=
-github.com/envoyproxy/go-control-plane v0.14.1-0.20260627225610-70ff85c381ff/go.mod h1:H3lDamtuGa0Y80VmchcmbutXMYNPDr0j+JrLlsgyEyo=
-github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260627225610-70ff85c381ff h1:uPvDnxeo1yGkZS0DKq28GprxMhfNZogPTi0+u6K8Kd0=
-github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260627225610-70ff85c381ff/go.mod h1:v21y1Uq30hmHbNsT2JOGMJG9cF+Ls7zTfIVOBLAU1TE=
-github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff h1:stwP9x94QfAFs+RF+YFkSrSuTxBuVrj6Sv+PJXJkXzo=
-github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff/go.mod h1:RgJXVdNtBhId0AeGnDEqPRSejRMoz//JumYvSTcJTvM=
-github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260627225610-70ff85c381ff h1:Co6W1/F/z5JehSpnO4GLI8xkeJzO851Y5fQ7Bfxc48M=
-github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260627225610-70ff85c381ff/go.mod h1:YySqCcozu0HwklKZzeX6N98q+TyqEkgX2sg7DQqiJfU=
+github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908 h1:Ymr4e9UMtsAYCBiuHV2JF8BxaMZu49yEFpTXBqgaqUE=
+github.com/envoyproxy/go-control-plane v0.14.1-0.20260729145720-a2d8c7492908/go.mod h1:rcDQvjX9fwNQvh7l9pxwfGBufBWU6xQ0zK5mcsH8/Lg=
+github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260729145720-a2d8c7492908 h1:+7FtQqQ7Yfo5dgsAyTAIe8OhmUtWUw6VjeQ3by2Xdm4=
+github.com/envoyproxy/go-control-plane/contrib v1.36.1-0.20260729145720-a2d8c7492908/go.mod h1:pdjA+146jsWRsJ0M1jgfRrvJq1HPWeyvaT/Va+nV2OY=
+github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908 h1:yp1HVjmLFpwwN3Ik82LUTAZ6giMb6NAuhA3fralKvRQ=
+github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260729145720-a2d8c7492908/go.mod h1:rYoRI6N8FcjZVmmeKqH8/ykAhfro9Bg8+of2IpBseyQ=
+github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260729145720-a2d8c7492908 h1:dNsOk1pDOqRl4SzUdAWDPXQ05VASaD5CYYaVpfZr7os=
+github.com/envoyproxy/go-control-plane/ratelimit v0.1.1-0.20260729145720-a2d8c7492908/go.mod h1:kFrXkz+a+gF/F56IcDXtBE0QfpZfFTyf92okqDzIBu0=
github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
github.com/envoyproxy/ratelimit v1.4.1-0.20260122083618-3fb702589d36 h1:nEi1OH2qhE8NtcuBgO/uKpTw/P0nVu4i8mZvL6oD9CQ=
diff --git a/test/helm/gateway-crds-helm/all.out.yaml b/test/helm/gateway-crds-helm/all.out.yaml
index 842211b364..25574c3981 100644
--- a/test/helm/gateway-crds-helm/all.out.yaml
+++ b/test/helm/gateway-crds-helm/all.out.yaml
@@ -25730,8 +25730,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority header
- on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -25745,9 +25749,12 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported load metrics
@@ -31610,8 +31617,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -31625,9 +31636,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than
+ 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -46158,9 +46173,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -46174,9 +46192,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -47768,9 +47790,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -47784,9 +47809,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -49544,9 +49573,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -49560,9 +49592,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must
+ be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has
@@ -51268,8 +51304,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -51283,9 +51323,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -54484,8 +54528,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -54499,9 +54547,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -55959,8 +56011,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -55974,9 +56030,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -57742,9 +57802,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the
- :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -57758,9 +57821,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not
@@ -59545,8 +59612,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -59560,9 +59631,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/test/helm/gateway-crds-helm/e2e.out.yaml b/test/helm/gateway-crds-helm/e2e.out.yaml
index acdc45ba6a..082e3b5d32 100644
--- a/test/helm/gateway-crds-helm/e2e.out.yaml
+++ b/test/helm/gateway-crds-helm/e2e.out.yaml
@@ -1668,8 +1668,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority header
- on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1683,9 +1687,12 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported load metrics
@@ -7548,8 +7555,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -7563,9 +7574,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than
+ 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -22096,9 +22111,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -22112,9 +22130,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -23706,9 +23728,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -23722,9 +23747,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -25482,9 +25511,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -25498,9 +25530,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must
+ be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has
@@ -27206,8 +27242,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -27221,9 +27261,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -30422,8 +30466,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -30437,9 +30485,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -31897,8 +31949,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -31912,9 +31968,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -33680,9 +33740,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the
- :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -33696,9 +33759,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not
@@ -35483,8 +35550,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -35498,9 +35569,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
diff --git a/test/helm/gateway-crds-helm/envoy-gateway-crds.out.yaml b/test/helm/gateway-crds-helm/envoy-gateway-crds.out.yaml
index e44adaad8f..e2cc13b2f7 100644
--- a/test/helm/gateway-crds-helm/envoy-gateway-crds.out.yaml
+++ b/test/helm/gateway-crds-helm/envoy-gateway-crds.out.yaml
@@ -1668,8 +1668,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority header
- on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -1683,9 +1687,12 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported load metrics
@@ -7548,8 +7555,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -7563,9 +7574,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater than
+ 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -22096,9 +22111,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -22112,9 +22130,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -23706,9 +23728,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on
- the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -23722,9 +23747,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod
+ must be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint
@@ -25482,9 +25511,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides
- the :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -25498,9 +25530,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must
+ be greater than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has
@@ -27206,8 +27242,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -27221,9 +27261,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -30422,8 +30466,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -30437,9 +30485,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -31897,8 +31949,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -31912,9 +31968,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported
@@ -33680,9 +33740,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the
- :authority header on the OutOfBand
- gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -33696,9 +33759,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not
@@ -35483,8 +35550,12 @@ spec:
The backend must implement OpenRcaService for this to take effect.
properties:
authority:
- description: Authority overrides the :authority
- header on the OutOfBand gRPC stream.
+ description: |-
+ Authority overrides the :authority header on the OutOfBand gRPC stream.
+ If unset, Envoy uses the endpoint hostname, then the dialed address, then
+ the cluster name.
+ maxLength: 259
+ minLength: 1
pattern: ^[^\x00\n\r]*$
type: string
port:
@@ -35498,9 +35569,13 @@ spec:
reportingPeriod:
description: |-
ReportingPeriod is how often Envoy requests load reports from the server.
- If omitted, uses Envoy's default of 10s.
+ Must be greater than 0. Defaults to 10s.
pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$
type: string
+ x-kubernetes-validations:
+ - message: reportingPeriod must be greater
+ than 0
+ rule: duration(self) > duration('0s')
type: object
weightExpirationPeriod:
description: If a given endpoint has not reported