4 min • read

Rate limit service

Rate limiting is a powerful technique to improve the availability and resilience of your services. In Ambassador Edge Stack, each request can have one or more labels. These labels are exposed to a third-party service via a gRPC API. The third-party service can then rate limit requests based on the request labels.

Note that RateLimitService is only applicable to Emissary-ingress, and not Ambassador Edge Stack, as Ambassador Edge Stack includes a built-in rate limit service.

Request labels

See Attaching labels to requests for how to configure the labels that are attached to a request.

Domains

In Ambassador Edge Stack, each engineer (or team) can be assigned its own domain. A domain is a separate namespace for labels. By creating individual domains, each team can assign their own labels to a given request, and independently set the rate limits based on their own labels.

See Attaching labels to requests for how to labels under different domains.

External rate limit service

In order for Ambassador Edge Stack to rate limit, you need to implement a gRPC RateLimitService, as defined in Envoy's v3/rls.proto interface. If you do not have the time or resources to implement your own rate limit service, Ambassador Edge Stack integrates a high-performance rate limiting service.

Ambassador Edge Stack generates a gRPC request to the external rate limit service and provides a list of labels on which the rate limit service can base its decision to accept or reject the request:

shell
[
{"source_cluster", "<local service cluster>"},
{"destination_cluster", "<routed target cluster>"},
{"remote_address", "<trusted address from x-forwarded-for>"},
{"generic_key", "<descriptor_value>"},
{"<some_request_header>", "<header_value_queried_from_header>"}
]

If Ambassador Edge Stack cannot contact the rate limit service, it will allow the request to be processed as if there were no rate limit service configuration.

It is the external rate limit service's responsibility to determine whether rate limiting should take place, depending on custom business logic. The rate limit service must simply respond to the request with an OK or OVER_LIMIT code:

  • If Envoy receives an OK response from the rate limit service, then Ambassador Edge Stack allows the client request to resume being processed by the normal flow.
  • If Envoy receives an OVER_LIMIT response, then Ambassador Edge Stack will return an HTTP 429 response to the client and will end the transaction flow, preventing the request from reaching the backing service.

The headers injected by the AuthService can also be passed to the rate limit service since the AuthService is invoked before the RateLimitService.

Configuring the rate limit service

A RateLimitService manifest configures Ambassador Edge Stack to use an external service to check and enforce rate limits for incoming requests:

yaml
---
apiVersion: getambassador.io/v3alpha1
kind: RateLimitService
metadata:
name: ratelimit
spec:
service: 'example-rate-limit.default:5000'
protocol_version: # default is v2, if upgrading from 2.x then you must set this to v3.
  • service gives the URL of the rate limit service. If using a Kubernetes service, this should be the namespace-qualified DNS name of that service.
  • protocol_version Allowed values are v3 and v2(defualt). protocol_version was used in previous versions of Ambassador Edge Stack to control the protocol used by the gRPC service to communicate with the RateLimitService. Ambassador Edge Stack 3.x is running an updated version of Envoy that has dropped support for the v2 protocol, so starting in 3.x, if protocol_version is not specified, the default value of v2 will cause an error to be posted and a static response will be returned. Therefore, you must set it to protocol_version: v3. If upgrading from a previous version, you will want to set it to v3 and ensure it is working before upgrading to Emissary-ingress 3.Y. The default value for protocol_version remains v2 in the getambassador.io/v3alpha1 CRD specifications to avoid making breaking changes outside of a CRD version change. Future versions of CRD's will deprecate it.

You may only use a single RateLimitService manifest.

Rate limit service and TLS

You can tell Ambassador Edge Stack to use TLS to talk to your service by using a RateLimitService with an https:// prefix. However, you may also provide a tls attribute: if tls is present and true, Ambassador Edge Stack will originate TLS even if the service does not have the https:// prefix.

If tls is present with a value that is not true, the value is assumed to be the name of a defined TLS context, which will determine the certificate presented to the upstream service.

Example

The Emissary-ingress Rate Limiting Tutorial has a simple rate limiting example. For a more advanced example, read the advanced rate limiting tutorial, which uses the rate limit service that is integrated with Ambassador Edge Stack.

Further reading