BackendTrafficPolicy¶
Experimental Channel since v1.3.0
The BackendTrafficPolicy
resource is a part of the Experimental Channel
since v1.3.0
. For more information on release channels, refer to our
versioning guide.
BackendTrafficPolicy is a Gateway API type to configure the behavior of clients when targeting a valid backend resource.
Background¶
BackendTrafficPolicy
is used to configure the behavior of clients when making
requests targeting a backend, a grouping of like endpoints. Currently, this
policy includes the ability to configure a RetryConstraint
, which can
dynamically limit the number of active retries targeting the specified backend,
by defining a "retry budget". Additional features may be added in the future.
Retry Constraint¶
While client-side retries are important for allowing requests to be
successfully retried in
periods of intermittent failure, excessive retries can quickly overwhelm a
system, leading to cascading failures such as retry storms. Specifying a
RetryConstraint
within BackendTrafficPolicy
allows application
developers to dynamically calculate a limit on active client-side retries as a percentage of
the overall active request volume. While the retry stanza within the
HTTPRouteRule resource allows specifying whether a request
should be retried, as well as the maximum number of
retries that may be performed for a failed request, budgeted
retries instead act as a
fail-safe in order to ensure that the targeted backend will not be overwhelmed
by the overall volume of retries from the client.
The retry budget is calculated based on the percentage of incoming traffic
composed of retries over a given time interval. Retrying the same original
request multiple times within the retry budget interval will lead to each retry
being counted towards calculating the budget. Once the budget is exceeded,
additional retries to the backend will be rejected and MUST return a 503
response to the client. The parameters of the retry budget calculation can be
configured within RetryConstraint
.
BackendTrafficPolicy is a Direct PolicyAttachment. All Gateway API Routes that target the referenced Backend should respect a configured BackendTrafficPolicy. Additional configurations for defining a constraint on retries MAY be defined in the future.
Spec¶
The specification of a BackendTrafficPolicy consists of:
- TargetRefs - Defines the targeted API object(s) of the policy. Backends (A grouping of like endpoints such as Service, ServiceImport, or any implementation-specific backendRef) are the only valid API target references.
- RetryConstraint - Defines the configuration for how a retry budget should be calculated, by specifying BudgetDetails and MinRetryRate.
- SessionPersistence - Defines the session persistence for the backend.
The following chart outlines the object definitions and relationship:
flowchart LR
backendTrafficPolicy[["<b>backendTrafficPolicy</b> <hr><align=left>BackendTrafficPolicySpec: spec<br>PolicyStatus: status</align>"]]
spec[["<b>spec</b><hr>LocalPolicyTargetReference: targetRefs <br> RetryConstraint: retryConstraint" <br> SessionPersistence: sessionPersistence]]
status[["<b>status</b><hr>[ ]PolicyAncestorStatus: ancestors"]]
budget[["<b>budget</b><hr>int: budgetPercent<br>Duration: budgetInterval"]]
retryConstraint[["<b>retryConstraint</b><hr>BudgetDetails: budget<br>MinRetryRate: RequestRate"]]
ancestorStatus[["<b>ancestors</b><hr>AncestorRef: parentReference<br>GatewayController: controllerName<br>[]Condition: conditions"]]
targetRefs[[<b>targetRefs</b><hr>]]
backendRef["one of:<hr>" Service OR ServiceImport OR an implementation-specific backendRef]
backendTrafficPolicy -->spec
backendTrafficPolicy -->status
spec -->targetRefs & retryConstraint
retryConstraint -->budget
status -->ancestorStatus
targetRefs -->backendRef
Targeting backends¶
BackendTrafficPolicy
targets a group of backend Pods via one or more
TargetRefs such as Service, ServiceImport, or implementation-specific
backendRef. TargetRefs is a required object reference, specifying a Backend via
its Name, Kind, and Group. Currently, TargetRefs can not be scoped to
specific ports on a service.