# kubernetes-sigs/external-dns

**Attribution required: if you use, quote, or summarise this content, you must credit and link back to [awesome-repositories.com](https://awesome-repositories.com/repository/kubernetes-sigs-external-dns).**

8,999 stars · 2,884 forks · Go · Apache-2.0

## Links

- GitHub: https://github.com/kubernetes-sigs/external-dns
- Homepage: https://kubernetes-sigs.github.io/external-dns/
- awesome-repositories: https://awesome-repositories.com/repository/kubernetes-sigs-external-dns.md

## Topics

`aws` `clouddns` `dns` `dns-controller` `dns-providers` `dns-record` `dns-servers` `external-dns` `gcp` `ingress` `k8s-sig-network` `kubernetes` `route53`

## Description

ExternalDNS is a controller that automatically synchronizes Kubernetes resource states with external DNS providers. It monitors cluster resources such as services, ingresses, and gateway APIs to dynamically create and update DNS records, enabling automated service discovery and external traffic management.

The project features a provider-agnostic interface that supports a wide array of cloud-managed vendors and on-premises providers, as well as an extension system for custom providers via webhooks and sidecars. It implements a reconciliation loop that uses resource annotations and custom resource definitions for declarative DNS management, ensuring that records are synchronized based on the desired state of the cluster.

To maintain stability and security, the controller utilizes leader election for high availability and tracks record ownership through TXT records or external databases like DynamoDB. It optimizes provider API usage through in-memory caching and batching of record changes. The system also supports advanced traffic management, including split-horizon DNS and routing policies, while exposing operational metrics via Prometheus.

## Tags

### DevOps & Infrastructure

- [Automated DNS Record Synchronization](https://awesome-repositories.com/f/devops-infrastructure/automated-dns-record-synchronization.md) — ExternalDNS tracks native services, ingresses, and gateway routes to automatically update external DNS providers. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/))
- [Behavioral Overrides](https://awesome-repositories.com/f/devops-infrastructure/configuration-management/application-settings-management/application-behavior-configurations/behavioral-overrides.md) — Allows overriding global controller settings on a per-resource basis using Kubernetes resource metadata. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/configuration-precedence/))
- [Control Loops](https://awesome-repositories.com/f/devops-infrastructure/control-loops.md) — Implements a continuous reconciliation loop to synchronize cluster state with external DNS providers.
- [Hostname Configurations](https://awesome-repositories.com/f/devops-infrastructure/hostname-configurations/hostname-configurations.md) — Assigns additional or overriding domain names to resources via annotations to support multi-host configurations. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/annotations/annotations/))
- [Annotation-Driven Configurations](https://awesome-repositories.com/f/devops-infrastructure/ingress-controllers/annotation-driven-configurations.md) — Uses resource annotations to pass provider-specific configuration options directly to the external DNS API. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/webhook-provider/))
- [Ingress-Based DNS Generation](https://awesome-repositories.com/f/devops-infrastructure/kubernetes-traffic-controllers/ingress-gateways/ingress-based-dns-generation.md) — Generates DNS entries based on the host keys specified within ingress resources. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws/))
- [Resource-Based DNS Generation](https://awesome-repositories.com/f/devops-infrastructure/resource-based-dns-generation.md) — Generates DNS entries from any cluster resource using templates to map object fields to hostnames. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/unstructured/))
- [External Traffic Routing](https://awesome-repositories.com/f/devops-infrastructure/virtual-cluster-orchestration/external-traffic-routing.md) — Directs external users to Kubernetes load balancers and gateways by synchronizing A and CNAME records.
- [Node DNS Synchronization](https://awesome-repositories.com/f/devops-infrastructure/cluster-node-management/node-dns-synchronization.md) — Creates A and AAAA records for cluster nodes based on their internal or external IP addresses. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/nodes/))
- [CRD-Based Synchronization](https://awesome-repositories.com/f/devops-infrastructure/custom-resource-definitions/crd-based-synchronization.md) — Synchronizes DNS records based on targets defined within Kubernetes Custom Resource Definitions. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/flags/))
- [Endpoint Extraction from CRDs](https://awesome-repositories.com/f/devops-infrastructure/custom-resource-definitions/endpoint-extraction-from-crds.md) — Watches user-defined Custom Resource Definitions to extract endpoints and synchronize them as DNS records. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/crd/))
- [Resource Mapping Logic](https://awesome-repositories.com/f/devops-infrastructure/custom-resource-definitions/resource-mapping-logic.md) — Translates custom resource definitions into standard DNS record types for declarative management.
- [High Availability Deployments](https://awesome-repositories.com/f/devops-infrastructure/high-availability-deployments.md) — Coordinates high availability to ensure only one instance actively manages DNS records. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/proposal/001-leader-election/))
- [Leader Election](https://awesome-repositories.com/f/devops-infrastructure/high-availability-systems/leader-election.md) — Utilizes leader election to ensure high availability and prevent conflicting DNS record updates.
- [Sidecar](https://awesome-repositories.com/f/devops-infrastructure/provider-integrations/sidecar.md) — Connects to external DNS services via custom sidecar programs using HTTP APIs. ([source](https://cdn.jsdelivr.net/gh/kubernetes-sigs/external-dns@master/README.md))
- [Resource Label Filtering](https://awesome-repositories.com/f/devops-infrastructure/resource-visibility-filters/resource-label-filtering.md) — Limits which cluster resources are synchronized using label selectors or annotation filters. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/flags/))
- [Reconciliation Workload Distribution](https://awesome-repositories.com/f/devops-infrastructure/workload-orchestration/validation-workload-distribution/reconciliation-workload-distribution.md) — Deploys multiple instances scoped to specific zones or namespaces to reduce reconciliation cycle times. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/operational-best-practices/))

### Networking & Communication

- [Automated DNS Managers](https://awesome-repositories.com/f/networking-communication/automated-dns-managers.md) — Provides automated synchronization of DNS records across external providers based on Kubernetes service and ingress resources. ([source](https://kubernetes-sigs.github.io/external-dns/))
- [DNS Record Updaters](https://awesome-repositories.com/f/networking-communication/dns-record-updaters.md) — Synchronizes DNS records with external providers automatically based on service and ingress definitions. ([source](https://kubernetes-sigs.github.io/external-dns/))
- [Cloud DNS Services](https://awesome-repositories.com/f/networking-communication/authoritative-dns-hosting/cloud-dns-services.md) — Synchronizes internal cluster endpoints with managed cloud DNS services like Route53, Google Cloud DNS, and Azure DNS. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/anexia-engine/))
- [Decoupled Record Management](https://awesome-repositories.com/f/networking-communication/dns-record-management/decoupled-record-management.md) — Manages DNS records declaratively using Kubernetes custom resources to decouple definitions from application logic. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws-localstack/))
- [Ingress Record Management](https://awesome-repositories.com/f/networking-communication/dns-record-management/ingress-record-management.md) — Creates and manages DNS entries automatically based on the hostnames defined in Ingress resources. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/ingress/))
- [Metadata Record Storage](https://awesome-repositories.com/f/networking-communication/dns-record-management/metadata-record-storage.md) — Saves DNS record ownership and metadata in TXT records to track managing resources. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/registry/txt/))
- [Ownership Tracking](https://awesome-repositories.com/f/networking-communication/dns-record-management/ownership-tracking.md) — Uses TXT entries to tag managed records, ensuring only automatically created records are modified. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/initial-design/))
- [Record Ownership Persistence](https://awesome-repositories.com/f/networking-communication/dns-record-management/record-ownership-persistence.md) — Stores ownership and tracking information for DNS records in a registry to prevent modification conflicts. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/registry/registry/))
- [Declarative Record Management](https://awesome-repositories.com/f/networking-communication/dns-record-updaters/declarative-record-management.md) — Creates and updates DNS records using custom resource definitions to specify desired record types and targets. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/crd/))
- [DNS-Based Service Discovery](https://awesome-repositories.com/f/networking-communication/dns-servers/dns-based-service-discovery.md) — Implements DNS-based service discovery by creating records from Kubernetes Service resources. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/service/))
- [Dynamic DNS Synchronization](https://awesome-repositories.com/f/networking-communication/dynamic-dns-synchronization.md) — Automatically updates DNS records for pods, services, and ingresses to maintain consistent external access. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/kops-dns-controller/))
- [Dynamic Service Discovery](https://awesome-repositories.com/f/networking-communication/dynamic-service-discovery.md) — Maps changing Kubernetes pod and service IP addresses to stable hostnames in external DNS systems.
- [API Pressure Mitigation](https://awesome-repositories.com/f/networking-communication/dns-management-apis/api-pressure-mitigation.md) — Uses in-memory caching and update batching to minimize API requests and avoid rate limits. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/rate-limits/))
- [Split-Horizon Views](https://awesome-repositories.com/f/networking-communication/dns-management/split-horizon-views.md) — Serves different DNS responses based on client location by running multiple instances with unique prefixes. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/split-horizon/))
- [DNS Record Management](https://awesome-repositories.com/f/networking-communication/dns-record-management.md) — Manages A, AAAA, and CNAME records within Pi-hole via its internal API. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/pihole/))
- [Alias Record Support](https://awesome-repositories.com/f/networking-communication/dns-record-management/alias-record-support.md) — Converts standard CNAME records into ALIAS records for supported providers to optimize resolution. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/annotations/annotations/))
- [Custom Record Definitions](https://awesome-repositories.com/f/networking-communication/dns-record-management/custom-record-definitions.md) — Creates specific DNS records by mapping hostnames to IP addresses using dedicated resources. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/proposal/003-dnsendpoint-graduation-to-beta/))
- [DNS Transaction Authentication](https://awesome-repositories.com/f/networking-communication/dns-record-management/dns-transaction-authentication.md) — ExternalDNS authenticates DNS updates using TSIG, GSS-TSIG, or mutual TLS certificate verification. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/rfc2136/))
- [Domain-Based Synchronization Filtering](https://awesome-repositories.com/f/networking-communication/dns-record-management/domain-based-synchronization-filtering.md) — Controls which DNS records are synchronized using suffix matches or regular expressions. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/domain-filter/))
- [Dualstack Synchronization](https://awesome-repositories.com/f/networking-communication/dns-record-management/dualstack-synchronization.md) — Creates both A and AAAA alias DNS records to support IPv4 and IPv6 traffic. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws-load-balancer-controller/))
- [Individual Pod Record Management](https://awesome-repositories.com/f/networking-communication/dns-record-management/individual-pod-record-management.md) — Generates unique DNS entries for individual pods in a headless service. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/service/))
- [IPv6 Record Generation](https://awesome-repositories.com/f/networking-communication/dns-record-management/ipv6-record-generation.md) — Generates AAAA records for clusters configured with IPv6 support. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws-sd/))
- [PTR Record Mapping](https://awesome-repositories.com/f/networking-communication/dns-record-management/ptr-record-mapping.md) — Generates PTR records for IPv4 and IPv6 endpoints when the provider has authority over reverse zones. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/ptr-records/))
- [Record Adoption](https://awesome-repositories.com/f/networking-communication/dns-record-management/record-adoption.md) — Allows the controller to take ownership of existing DNS records by identifying matching markers in TXT records. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/import-records/))
- [Record Type Control](https://awesome-repositories.com/f/networking-communication/dns-record-management/record-type-control.md) — Controls the creation of specific record types, such as opting in or out of PTR records. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/annotations/annotations/))
- [Route53 Alias Management](https://awesome-repositories.com/f/networking-communication/dns-record-management/route53-alias-management.md) — Creates Route53 ALIAS records for IPv4 and IPv6 targets to point to AWS load balancers. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws/))
- [TTL Configuration](https://awesome-repositories.com/f/networking-communication/dns-record-management/ttl-configuration.md) — Sets the time-to-live duration for a resource's DNS records to control cache expiration. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/annotations/annotations/))
- [TTL Control](https://awesome-repositories.com/f/networking-communication/dns-record-management/ttl-control.md) — Sets the time-to-live duration for DNS records to control how long resolvers cache information. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws-sd/))
- [TTL Definition](https://awesome-repositories.com/f/networking-communication/dns-record-management/ttl-definition.md) — Defines how long DNS records are cached via global configuration or per-resource annotations. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/rfc2136/))
- [TTL Management](https://awesome-repositories.com/f/networking-communication/dns-record-management/ttl-management.md) — Controls the Time-To-Live for DNS records via annotations or global flags. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/ttl/))
- [TTL Overrides](https://awesome-repositories.com/f/networking-communication/dns-record-management/ttl-overrides.md) — Overrides the default time-to-live for DNS records via resource annotations to minimize propagation delay. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws/))
- [Batch Request Optimizations](https://awesome-repositories.com/f/networking-communication/dns-record-updaters/batch-request-optimizations.md) — Groups multiple record changes into single API calls to prevent provider rate limit exhaustion. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/operational-best-practices/))
- [Transactional Batching](https://awesome-repositories.com/f/networking-communication/dns-record-updaters/transactional-batching.md) — Groups multiple record changes into transactional batch calls to reduce the volume of API requests to DNS providers. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/cloudflare/))
- [Internal DNS Resolvers](https://awesome-repositories.com/f/networking-communication/dns-resolution-managers/internal-dns-resolvers.md) — Creates DNS records specifically for internal network use, such as mapping services to their internal IP. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/annotations/annotations/))
- [Annotation-Driven Discovery](https://awesome-repositories.com/f/networking-communication/dns-servers/dns-based-service-discovery/annotation-driven-discovery.md) — Generates DNS entries based on hostnames defined in Kubernetes service annotations. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws/))
- [Service-Specific Sync Filtering](https://awesome-repositories.com/f/networking-communication/dns-servers/dns-based-service-discovery/service-specific-sync-filtering.md) — Restricts which Service resources trigger DNS updates based on specific labels or types. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/service/))
- [Zone Management](https://awesome-repositories.com/f/networking-communication/dns-zone-discovery/zone-management.md) — Manages DNS records across both public and private zones for the same domain to route traffic. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws-public-private-route53/))
- [Pattern-Based Zone Filtering](https://awesome-repositories.com/f/networking-communication/dns-zone-discovery/zone-management/pattern-based-zone-filtering.md) — Restricts synchronization to specific zones using suffixes, regex patterns, or tags. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws-filters/))
- [Zone-Based Synchronization Filtering](https://awesome-repositories.com/f/networking-communication/dns-zone-discovery/zone-management/zone-based-synchronization-filtering.md) — Restricts the synchronization process to specific zones based on domain names or contract identifiers. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/akamai-edgedns/))
- [Gateway API Integrations](https://awesome-repositories.com/f/networking-communication/gateway-api-integrations.md) — Creates and updates DNS records based on hostnames defined in Gateway API Route specifications. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/proposal/004-gateway-api-annotation-placement/))
- [Headless Service DNS Publication](https://awesome-repositories.com/f/networking-communication/headless-service-dns-publication.md) — Publishes DNS records for pods backing a headless service using pod, host, or node IPs. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/hostport/))
- [DNS-Based Load Balancing](https://awesome-repositories.com/f/networking-communication/load-balancers/dns-based-load-balancing.md) — Distributes updates across multiple DNS hosts using round-robin or failover strategies to balance traffic. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/rfc2136/))
- [Load Balancer Alias Records](https://awesome-repositories.com/f/networking-communication/load-balancers/dns-based-load-balancing/load-balancer-alias-records.md) — Creates and maintains A and AAAA alias records specifically for cloud load balancers. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/kube-ingress-aws/))
- [Pod-Level DNS Discovery](https://awesome-repositories.com/f/networking-communication/pod-level-dns-discovery.md) — Generates unique DNS entries for individual pods to make them discoverable within the network. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/pod/))
- [DNS-Based Routing](https://awesome-repositories.com/f/networking-communication/traffic-routing/dns-based-routing.md) — Implements weighted, latency-based, or geolocation routing using resource annotations for traffic steering. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws/))

### Security & Cryptography

- [Record Ownership Tracking](https://awesome-repositories.com/f/security-cryptography/dns-security/authenticated-record-retrievers/domain-ownership-verification/record-ownership-tracking.md) — Tracks record ownership through TXT records to ensure only the managing controller modifies specific entries.
- [Record Ownership Isolation](https://awesome-repositories.com/f/security-cryptography/record-ownership-isolation.md) — ExternalDNS prevents overlapping records in a shared store by restricting operations to a specific owner identifier. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/coredns/))
- [Source Resource Filtering](https://awesome-repositories.com/f/security-cryptography/dns-filtering/source-resource-filtering.md) — Restricts which services, pods, or nodes are watched using type, label, or annotation filters. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/advanced/operational-best-practices/))
- [DNS Provider API Integrations](https://awesome-repositories.com/f/security-cryptography/dns-validation-providers/dns-provider-api-integrations.md) — Extends DNS vendor support through a webhook-based integration system. ([source](https://kubernetes-sigs.github.io/external-dns/latest/))
- [Webhook Provider Extensions](https://awesome-repositories.com/f/security-cryptography/dns-validation-providers/dns-provider-api-integrations/webhook-provider-extensions.md) — Enables integration with non-core DNS providers using a flexible webhook system. ([source](https://kubernetes-sigs.github.io/external-dns/))
- [Pod-Level IAM Roles](https://awesome-repositories.com/f/security-cryptography/role-based-access-control/conditional-role-assignment/service-role-assignments/instance-level-iam-assignments/pod-level-iam-roles.md) — ExternalDNS grants access to DNS providers using IAM Roles for Service Accounts or Pod Identity. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws/))
- [Workload Identity Authentication](https://awesome-repositories.com/f/security-cryptography/workload-identity-authentication.md) — ExternalDNS connects to DNS providers using Workload Identity, static credentials, or node-level service accounts. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/gke/))

### Software Engineering & Architecture

- [DNS Provider Interfaces](https://awesome-repositories.com/f/software-engineering-architecture/modular-provider-interfaces/media-provider-interfaces/dns-provider-interfaces.md) — Provides a provider-agnostic interface to support a wide array of cloud and on-premises DNS vendors.
- [API Request Optimizers](https://awesome-repositories.com/f/software-engineering-architecture/request-optimization/api-request-optimizers.md) — ExternalDNS caches managed zones and applies retry policies to reduce the volume of API calls. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/azure-private-dns/))
- [API Request](https://awesome-repositories.com/f/software-engineering-architecture/request-throttling/rate-limiting/api-request.md) — Implements polling intervals and event-based synchronization to throttle requests to DNS providers. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/tutorials/aws/))

### Web Development

- [Endpoint Reconciliation](https://awesome-repositories.com/f/web-development/custom-api-endpoints/endpoint-specification/dynamic-endpoint-synchronizers/endpoint-refreshers/runtime-endpoint-updates/endpoint-reconciliation.md) — Updates DNS records automatically when the endpoints matched by a Service selector change. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/service/))
- [Traefik Integrations](https://awesome-repositories.com/f/web-development/reverse-proxy-integrations/traefik-integrations.md) — Integrates with Traefik IngressRoute resources to automate the creation of corresponding DNS records. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/sources/traefik-proxy/))

### Data & Databases

- [Metadata Storage](https://awesome-repositories.com/f/data-databases/custom-data-fields/metadata-querying/metadata-storage.md) — Uses an AWS DynamoDB table to persist DNS record ownership and tracking metadata. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/registry/dynamodb/))
- [In-Memory Caches](https://awesome-repositories.com/f/data-databases/in-memory-caches.md) — Caches DNS provider data and zone lists in memory to reduce outgoing API request volume.
- [Provider API Caches](https://awesome-repositories.com/f/data-databases/performance-caching-systems/dns-caches/provider-api-caches.md) — ExternalDNS stores DNS records read from the provider to reduce API calls and avoid rate limits. ([source](https://kubernetes-sigs.github.io/external-dns/latest/docs/registry/txt/))

### System Administration & Monitoring

- [API Rate-Limit Chunkers](https://awesome-repositories.com/f/system-administration-monitoring/resource-batch-operations/general-batch-operations/api-rate-limit-chunkers.md) — Groups multiple record changes into single API calls to respect provider rate limits.
