<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manoj K R</title>
    <description>The latest articles on DEV Community by Manoj K R (@manoj_kr_5fe54af2495454e).</description>
    <link>https://dev.to/manoj_kr_5fe54af2495454e</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3389662%2F1653df29-0455-4fa8-a43c-054ba2cd6d79.png</url>
      <title>DEV Community: Manoj K R</title>
      <link>https://dev.to/manoj_kr_5fe54af2495454e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manoj_kr_5fe54af2495454e"/>
    <language>en</language>
    <item>
      <title>Scaling DNS in Multi-Cluster Kubernetes with ExternalDNS (AWS Route 53 )</title>
      <dc:creator>Manoj K R</dc:creator>
      <pubDate>Sun, 19 Apr 2026 07:41:25 +0000</pubDate>
      <link>https://dev.to/manoj_kr_5fe54af2495454e/scaling-dns-in-multi-cluster-kubernetes-with-externaldns-aws-route-53--11je</link>
      <guid>https://dev.to/manoj_kr_5fe54af2495454e/scaling-dns-in-multi-cluster-kubernetes-with-externaldns-aws-route-53--11je</guid>
      <description>&lt;h1&gt;
  
  
  Scaling Kubernetes DNS with ExternalDNS and Route 53
&lt;/h1&gt;

&lt;p&gt;As our Kubernetes platform scaled across multiple environments and regions, DNS management started becoming a bottleneck. What initially worked as a centralized setup began to introduce operational challenges such as API throttling and increasing manual effort.&lt;/p&gt;

&lt;p&gt;In this article, I’ll walk through how we evolved our DNS architecture using &lt;strong&gt;ExternalDNS&lt;/strong&gt; with &lt;strong&gt;AWS Route 53&lt;/strong&gt; and the improvements we achieved.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is ExternalDNS?
&lt;/h2&gt;

&lt;p&gt;ExternalDNS is a Kubernetes controller that automatically manages DNS records based on Kubernetes resources such as Ingress, Services, and custom resources like VirtualServer or DNSEndpoint.&lt;/p&gt;

&lt;p&gt;It continuously watches the cluster and ensures that DNS records in providers like AWS Route 53 are kept in sync with the desired state defined in Kubernetes.&lt;/p&gt;

&lt;p&gt;In simple terms, it acts as a bridge between Kubernetes and your DNS provider, allowing DNS to be managed declaratively through Kubernetes instead of manual updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The challenge: centralized DNS doesn’t scale
&lt;/h2&gt;

&lt;p&gt;Initially, all DNS records were managed within a single AWS Route 53 account. Over time, this led to several issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API rate limiting (5 requests per second per account)&lt;/li&gt;
&lt;li&gt;Frequent throttling during automated updates&lt;/li&gt;
&lt;li&gt;Heavy reliance on manual DNS changes and tickets&lt;/li&gt;
&lt;li&gt;Accumulation of stale or unused DNS records&lt;/li&gt;
&lt;li&gt;Tight coupling between infrastructure and DNS operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although a temporary increase to 20 RPS was provided, it was not a sustainable long-term solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution: distributed DNS with ExternalDNS
&lt;/h2&gt;

&lt;p&gt;To address these challenges, we redesigned our DNS architecture with the following approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Environment-based DNS distribution
&lt;/h3&gt;

&lt;p&gt;We separated DNS management across AWS accounts based on environments (Dev, Stage, Prod). This reduced contention and improved scalability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kubernetes-driven DNS using ExternalDNS
&lt;/h3&gt;

&lt;p&gt;We deployed ExternalDNS across clusters with the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--policy=sync
--registry=txt
--txt-prefix=edns.
--txt-owner-id=&amp;lt;unique-per-cluster&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key capabilities
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Automated DNS lifecycle
&lt;/h4&gt;

&lt;p&gt;DNS records are now automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created when resources are deployed&lt;/li&gt;
&lt;li&gt;Updated when configurations change&lt;/li&gt;
&lt;li&gt;Deleted when resources are removed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This removes the need for manual DNS management and ensures DNS always reflects the actual cluster state.&lt;/p&gt;

&lt;h4&gt;
  
  
  Self-service DNS for application teams
&lt;/h4&gt;

&lt;p&gt;Application teams can now manage DNS directly through Kubernetes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploying an Ingress or VirtualServer creates DNS records&lt;/li&gt;
&lt;li&gt;Deleting the resource removes the corresponding DNS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly reduces dependency on infrastructure teams and speeds up delivery.&lt;/p&gt;

&lt;h4&gt;
  
  
  Safe multi-cluster ownership
&lt;/h4&gt;

&lt;p&gt;By using a unique &lt;code&gt;txt-owner-id&lt;/code&gt; per cluster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each cluster manages only its own records&lt;/li&gt;
&lt;li&gt;Prevents accidental deletion or modification across clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially important when the same domain is shared across multiple regions (for example, dev-east and dev-west).&lt;/p&gt;

&lt;h4&gt;
  
  
  Automatic cleanup
&lt;/h4&gt;

&lt;p&gt;With &lt;code&gt;--policy=sync&lt;/code&gt;, ExternalDNS ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No orphaned DNS records remain&lt;/li&gt;
&lt;li&gt;DNS always reflects the current state of the cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Avoiding API rate limits
&lt;/h4&gt;

&lt;p&gt;Distributing DNS across multiple AWS accounts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces load per account&lt;/li&gt;
&lt;li&gt;Eliminates throttling issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This directly addresses the limitations of the previous centralized setup.&lt;/p&gt;

&lt;h4&gt;
  
  
  Seamless cluster migration
&lt;/h4&gt;

&lt;p&gt;This architecture simplifies cluster migrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy resources in a new cluster → DNS records are created&lt;/li&gt;
&lt;li&gt;Remove resources from the old cluster → DNS records are deleted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DNS effectively follows the application without requiring manual coordination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real impact
&lt;/h2&gt;

&lt;p&gt;After implementing this model, we observed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster and smoother deployments&lt;/li&gt;
&lt;li&gt;Elimination of manual DNS tickets&lt;/li&gt;
&lt;li&gt;Cleaner and more consistent DNS state&lt;/li&gt;
&lt;li&gt;Safer multi-cluster operations&lt;/li&gt;
&lt;li&gt;A scalable architecture ready for future growth&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Centralized DNS becomes a bottleneck at scale&lt;/li&gt;
&lt;li&gt;ExternalDNS with sync policy enables a declarative DNS model&lt;/li&gt;
&lt;li&gt;Ownership isolation is critical in multi-cluster environments&lt;/li&gt;
&lt;li&gt;Distributed DNS architecture improves both performance and reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;This foundation also enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier migration to managed Kubernetes platforms (EKS, AKS, GKE)&lt;/li&gt;
&lt;li&gt;Standardized DNS management across environments&lt;/li&gt;
&lt;li&gt;Improved observability and governance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are running Kubernetes at scale and still relying on centralized or manual DNS processes, this approach is worth exploring.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/services-networking/ingress/" rel="noopener noreferrer"&gt;Kubernetes Ingress (official documentation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nginx.com/nginx-ingress-controller/configuration/virtualserver-and-virtualserverroute-resources/" rel="noopener noreferrer"&gt;NGINX Ingress Controller — VirtualServer and VirtualServerRoute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kubernetes-sigs/external-dns" rel="noopener noreferrer"&gt;ExternalDNS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/route53/" rel="noopener noreferrer"&gt;AWS Route 53&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>externaldns</category>
      <category>kubernetes</category>
      <category>route53</category>
    </item>
  </channel>
</rss>
