{"id":4403,"date":"2024-12-20T09:45:37","date_gmt":"2024-12-20T17:45:37","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/"},"modified":"2024-12-20T09:45:37","modified_gmt":"2024-12-20T17:45:37","slug":"xdcr-couchbase-aws-eks","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/","title":{"rendered":"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters"},"content":{"rendered":"\n<p><span>In modern distributed systems, the ability to replicate data between separate environments is crucial for ensuring high availability, disaster recovery, and performance optimization. Couchbase&#8217;s XDCR (Cross Data Center Replication) feature allows seamless replication of data between clusters, enabling robust data sharing across geographically or logically isolated environments.<\/span><\/p>\n\n\n\n<p><span>This guide will walk you through setting up XDCR between two Couchbase clusters hosted in separate Amazon EKS (Elastic Kubernetes Service) clusters within different VPCs. We&#8217;ll dive into each step, from infrastructure setup to configuring DNS for cross-cluster communication and deploying Couchbase for real-time replication. By the end of this walkthrough, you\u2019ll have a production-ready setup with the skills to replicate this in your environment.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p><span>To follow this guide, ensure you have:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>AWS CLI<\/b><span> installed and configured<\/span><\/li>\n\n\n<li><span>An AWS account with permissions for creating VPCs, EKS clusters, and security groups<\/span><\/li>\n\n\n<li><span>Familiarity with Kubernetes and tools like kubectl and Helm<\/span><\/li>\n\n\n<li><span>Helm installed to deploy Couchbase<\/span><\/li>\n\n\n<li><span>Basic knowledge of networking concepts, including CIDR blocks, routing tables, and DNS<\/span><\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Deploy EKS clusters in separate VPCs<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What are we doing?<\/h4>\n\n\n\n<p><span>We will create two Kubernetes clusters, Cluster1 and Cluster2, in separate VPCs using <code>eksctl<\/code>. Each cluster will operate independently and have its own CIDR block to avoid IP conflicts.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why is this important?<\/h4>\n\n\n\n<p><span>This separation ensures:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span>Isolation for better security and management<\/span><\/li>\n\n\n<li><span>Scalability and flexibility for handling workloads<\/span><\/li>\n\n\n<li><span>Clear routing rules between clusters<\/span><\/li>\n\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Commands to create clusters<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">Deploy cluster1<\/h5>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster1<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.0.0.0\/16[\/crayon]<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Deploy cluster2<\/h5>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Expected outcome<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Cluster1 resides in VPC 10.0.0.0\/16<\/span><\/li>\n\n\n<li><span>Cluster2 resides in VPC 10.1.0.0\/16<\/span><\/li>\n\n<\/ul>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16689\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image1-1-1024x394-1.png\" alt=\"\" width=\"900\" height=\"346\"><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Peer the VPCs for Inter-Cluster Communication<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What are we doing?<\/h4>\n\n\n\n<p><span>We are creating a VPC Peering connection between the two VPCs and configuring routing and security rules to enable inter-cluster communication.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Steps<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">2.1 Create a peering connection<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Go to the AWS Console &gt; <\/span><b>VPC &gt; Peering Connections<\/b><\/li>\n\n\n<li><span>Click <\/span><b>Create Peering Connection<\/b><\/li>\n\n\n<li><span>Select the <\/span><b>Requester VPC<\/b><span> (Cluster1 VPC) and <\/span><b>Accepter VPC<\/b><span> (Cluster2 VPC)<\/span><\/li>\n\n\n<li><span>Name the connection <em>eks-peer<\/em><\/span><\/li>\n\n\n<li><span>Click <\/span><b>Create Peering Connection<\/b><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">2.2 Accept the peering request<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Select the peering connection<\/span><\/li>\n\n\n<li><span>Click <\/span><b>Actions &gt; Accept Request<\/b><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">2.3 Update route tables<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>For Cluster1 VPC, add a route for 10.1.0.0\/16, targeting the peering connection<\/span><\/li>\n\n\n<li><span>For Cluster2 VPC, add a route for 10.0.0.0\/16, targeting the peering connection<\/span><\/li>\n\n<\/ul>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16690\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image3-1024x191-1.png\" alt=\"\" width=\"900\" height=\"168\"><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">2.4 Modify security groups<\/h5>\n\n\n\n<h4 class=\"wp-block-heading\">Why is this necessary?<\/h4>\n\n\n\n<p><span>Security groups act as firewalls, and we must allow traffic between the clusters explicitly.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How to modify<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span>Navigate to <\/span><b>EC2 &gt; Security Groups<\/b><span> in the AWS Console<\/span><\/li>\n\n\n<li><span>Identify the security groups associated with Cluster1 and Cluster2<\/span><\/li>\n\n\n<li><span>For Cluster1&#8217;s security group:<\/span>\n<ul>\n<li aria-level=\"3\"><span>Click <\/span><b>Edit Inbound Rules<\/b><\/li>\n<li aria-level=\"3\"><span>Add a rule:<\/span>\n<ul>\n<li aria-level=\"4\"><b>Type<\/b><span>: All traffic<\/span><\/li>\n<li aria-level=\"4\"><b>Source<\/b><span>: Security group ID of Cluster2<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n<li><span>Repeat for Cluster2, allowing traffic from Cluster1\u2019s security group<\/span><\/li>\n\n<\/ol>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16691\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image2-1024x396-1.png\" alt=\"\" width=\"900\" height=\"348\"><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16692\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image5-1024x86-1.png\" alt=\"\" width=\"900\" height=\"76\"><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16693\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image4-1024x276-1.png\" alt=\"\" width=\"900\" height=\"243\"><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Test Connectivity by Deploying NGINX in Cluster2<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What are we doing?<\/h4>\n\n\n\n<p><span>We are deploying an NGINX pod in Cluster2 to verify that Cluster1 can communicate with it.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why is this important?<\/h4>\n\n\n\n<p><span>This step ensures the networking between clusters is functional before deploying Couchbase.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Steps<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">3.1 Create a Namespace in Cluster1 and Cluster2<\/h5>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">3.2 Deploy NGINX in Cluster1 and Cluster2<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Create nginx.yaml:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;yaml&#8221; decode=&#8221;true&#8221;]apiVersion: apps\/v1<br \/>\nkind: Deployment<br \/>\nmetadata:<br \/>\n\u00a0 name: nginx<br \/>\nspec:<br \/>\n\u00a0 replicas: 1<br \/>\n\u00a0 selector:<br \/>\n\u00a0 \u00a0 matchLabels:<br \/>\n\u00a0 \u00a0 \u00a0 app: nginx<br \/>\n\u00a0 template:<br \/>\n\u00a0 \u00a0 metadata:<br \/>\n\u00a0 \u00a0 \u00a0 labels:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 app: nginx<br \/>\n\u00a0 \u00a0 spec:<br \/>\n\u00a0 \u00a0 \u00a0 containers:<br \/>\n\u00a0 \u00a0 \u00a0 &#8211; name: nginx<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 image: nginx<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 ports:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 &#8211; containerPort: 80<br \/>\n&#8212;<br \/>\napiVersion: v1<br \/>\nkind: Service<br \/>\nmetadata:<br \/>\n\u00a0 name: nginx<br \/>\nspec:<br \/>\n\u00a0 clusterIP: None<br \/>\n\u00a0 ports:<br \/>\n\u00a0 &#8211; port: 80<br \/>\n\u00a0 \u00a0 targetPort: 80<br \/>\n\u00a0 selector:<br \/>\n\u00a0 \u00a0 app: nginx[\/crayon]<\/p>\n<\/p>\n<\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">3.3 Apply the YAML<\/h5>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl apply -f nginx.yaml -n prod[\/crayon]<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">3.4 Verify Connectivity from Cluster1<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Exec into the pod in Cluster1:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl exec -it -n dev &lt;pod-name&gt; &#8212; \/bin\/bash[\/crayon]<\/p>\n<\/p>\n<\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">3.5 Test connectivity to Cluster2<\/h5>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]curl nginx.prod[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Expected outcome<\/h4>\n\n\n\n<p><span>The <em>curl<\/em> command will fail without DNS forwarding, highlighting the need for further DNS configuration.<\/span><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16694\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image7-8.png\" alt=\"\" width=\"596\" height=\"109\"><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Configuring DNS forwarding<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What are we doing?<\/h4>\n\n\n\n<p><span>We\u2019ll configure DNS forwarding so that services in Cluster2 can be resolved by Cluster1. This is critical for allowing applications in Cluster1 to interact with services in Cluster2 using their DNS names.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why is this important?<\/h4>\n\n\n\n<p><span>Kubernetes service discovery relies on DNS, and by default, DNS queries for one cluster\u2019s services cannot resolve in another cluster. CoreDNS in Cluster1 must forward queries to Cluster2\u2019s DNS resolver.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Steps<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">4.1 Retrieve Cluster2\u2019s DNS Service Endpoint<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Run the following command in Cluster2 to get the DNS service endpoint:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl get endpoints -n kube-system[\/crayon]<\/p>\n<\/p>\n<\/li>\n\n\n<li><span><span>Look for the <em>kube-dns<\/em> or <em>coredns<\/em> service and note its IP address. For example:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nNAME \u00a0 \u00a0 \u00a0 ENDPOINTS\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 AGE<br \/>\nkube-dns \u00a0 10.1.20.116:53 \u00a0 \u00a0 3h<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-[\/crayon]<\/p>\n<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16695\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image6-5.png\" alt=\"\" width=\"859\" height=\"147\"><\/p><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">4.2 Edit the CoreDNS ConfigMap in Cluster1<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Open the CoreDNS ConfigMap for editing:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl edit cm coredns -n kube-system[\/crayon]<\/p>\n<\/p>\n<p>\u00a0<\/p><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">4.3 A<span>dd the following block to the Corefile section<br>\n<\/span><\/h5>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n0<\/p>\n\n\n\n<p><span>Replace 10.1.20.116 with the actual DNS endpoint IP from Cluster2.<\/span><\/p>\n\n\n\n<p><span>Note: We only need to use one of the CoreDNS endpoints for this ConfigMap. <\/span><span>The IP of CoreDNS pods rarely change but can if the Node goes down. <\/span><span>The kube-dns ClusterIP service can be used but will require the IP and Port to be open on the EKS Nodes.<\/span><\/p>\n\n\n\n<p><a href=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image9-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16696\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image9-5.png\" alt=\"\" width=\"600\" height=\"456\"><\/a><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">4.4 Restart CoreDNS in Cluster1<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Apply the changes by restarting CoreDNS:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n1<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image8-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16697\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image8-4.png\" alt=\"\" width=\"867\" height=\"98\"><\/a><\/p><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">4.5 Verify DNS Forwarding<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Exec into any pod in Cluster1:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n2<\/p>\n<\/li>\n\n\n<li><span><span>Test DNS resolution for an NGINX service in Cluster2:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n3<\/p>\n<\/li>\n\n\n<li><span>You should see a response from the NGINX service<br>\n<a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image12.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16698\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image12-1024x464-1.png\" alt=\"\" width=\"900\" height=\"408\"><\/a><\/span><\/li>\n\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Expected outcome<\/h4>\n\n\n\n<p><span>DNS queries from Cluster1 to Cluster2 should resolve successfully.<\/span><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Deploying Couchbase<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What are we doing?<\/h4>\n\n\n\n<p><span>We\u2019ll deploy Couchbase clusters in both Kubernetes environments using Helm. Each cluster will manage its own data independently before being connected through XDCR.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why is this important?<\/h4>\n\n\n\n<p><span>Couchbase clusters form the foundation of the XDCR setup, providing a robust and scalable NoSQL database platform.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Steps<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">5.1 Add the Couchbase Helm Chart Repository<\/h5>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n4<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">5.2 Deploy Couchbase in Cluster1<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Switch to Cluster1:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n5<\/p>\n<\/li>\n\n\n<li><span><span>Deploy Couchbase:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n6<\/p>\n<\/li>\n\n<\/ul>\n\n\n\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16699\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image10-1024x432-1.png\" alt=\"\" width=\"900\" height=\"380\"><\/a><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">5.3 Deploy Couchbase in Cluster2<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Switch to Cluster2:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n7<\/p>\n<\/li>\n\n\n<li><span><span>Deploy Couchbase:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n8<\/p>\n<\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">5.4 Verify Deployment<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Check the Couchbase pods:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]eksctl create cluster<br \/>\n\u00a0\u00a0&#8211;name cluster2<br \/>\n\u00a0\u00a0&#8211;region us-east-1<br \/>\n\u00a0\u00a0&#8211;zones us-east-1a,us-east-1b,us-east-1c<br \/>\n\u00a0\u00a0&#8211;node-type t2.medium<br \/>\n\u00a0\u00a0&#8211;nodes 2<br \/>\n\u00a0\u00a0&#8211;nodes-min 1<br \/>\n\u00a0\u00a0&#8211;nodes-max 3<br \/>\n\u00a0\u00a0&#8211;version 1.27<br \/>\n\u00a0\u00a0&#8211;vpc-cidr 10.1.0.0\/16[\/crayon]<\/p>\n9<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image11-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16701\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image11-1-1024x185-1.png\" alt=\"\" width=\"900\" height=\"163\"><\/a><\/p><\/li>\n\n\n<li><span>Ensure all pods are running.<\/span><\/li>\n\n<\/ul>\n\n\n\n<p><b>Note: <\/b><span>If you encounter a deployment error, edit the CouchbaseCluster CRD to use a compatible image version:<\/span><\/p>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n0<\/p>\n\n\n\n<p><span>Change:<\/span><\/p>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n1<\/p>\n\n\n\n<p><span>To:<\/span><\/p>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n2<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Expected outcome<\/h4>\n\n\n\n<p><span>Couchbase clusters should be running and accessible via their respective UIs.<\/span><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6: Setting Up XDCR<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What are we doing?<\/h4>\n\n\n\n<p><span>We\u2019ll configure XDCR to enable data replication between the two Couchbase clusters.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why is this important?<\/h4>\n\n\n\n<p><span>XDCR ensures data consistency across clusters, supporting high availability and disaster recovery scenarios.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Steps<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">6.1 Get service name from Cluster2<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>In cluster2 run the following command to retrieve the service name of one of the pods so we can port-forward to it.<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n3<\/p>\n<\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">6.2 Access the Couchbase UI for Cluster2<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Port-forward the Couchbase UI:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n4<\/p>\n<\/li>\n\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Open a browser and navigate to:<br>\n<em>https:\/\/localhost:8091<\/em><br>\n<\/span><\/li>\n\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Log in using the credentials configured during the deployment.<\/span><\/li>\n\n<\/ul>\n\n\n\n<p>6.3 View Documents in Cluster2<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>In the Couchbase UI, go to <\/span><b>Buckets<\/b><\/li>\n\n\n<li>Note that no Documents exist in the <b>default<\/b> bucket<\/li>\n\n<\/ul>\n\n\n\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16703\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image13-1024x96-1.png\" alt=\"\" width=\"900\" height=\"84\"><\/a><\/p>\n\n\n\n<p>\u00a0<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">6.4 Access the Couchbase UI for Cluster1<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span><span>Port-forward the Couchbase UI:<br>\n<\/span><\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n5<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image14-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16704\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image14-4.png\" alt=\"\" width=\"881\" height=\"87\"><\/a><\/p><\/li>\n\n\n<li><span>Open a browser and navigate to:<br>\n<em>https:\/\/localhost:8091<\/em><\/span><\/li>\n\n\n<li><span>Log in using the credentials configured during the deployment<\/span><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">6.5 Add a Remote Cluster<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>In the Couchbase UI, go to <\/span><b>XDCR &gt; Add Remote Cluster<\/b><\/li>\n\n\n<li><span>Configure the remote cluster:<\/span>\n<ul>\n<li aria-level=\"3\"><b>Cluster Name<\/b><span>: Cluster2<\/span><\/li>\n<li aria-level=\"3\"><b>IP\/Hostname<\/b><span>: &lt;Cluster2 Service Name&gt;<em>.prod.svc.cluster.local<\/em><\/span><\/li>\n<li aria-level=\"3\"><b>Username<\/b><span>: Admin username for Cluster2<\/span><\/li>\n<li aria-level=\"3\"><b>Password<\/b><span>: Admin password for Cluster2<\/span><\/li>\n<\/ul>\n<\/li>\n\n\n<li><span>Click <\/span><b>Save<\/b><span><br>\n<a href=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image15-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16705\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image15-5.png\" alt=\"\" width=\"831\" height=\"723\"><\/a><\/span><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">6.6 Set Up Replication<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>In the Couchbase UI for Cluster1, go to <\/span><b>XDCR &gt; Add Replication<\/b><\/li>\n\n\n<li><span>Configure the replication:<\/span>\n<ul>\n<li aria-level=\"3\"><b>Replicate From Bucket<\/b><span>: Default bucket in Cluster1<\/span><\/li>\n<li aria-level=\"3\"><b>Replicate To Bucket<\/b><span>: Default bucket in Cluster2<\/span><\/li>\n<li aria-level=\"3\"><b>Remote Cluster<\/b><span>: Select Cluster2<\/span><\/li>\n<\/ul>\n<\/li>\n\n\n<li><span>Click <\/span><b>Save<\/b><span><br>\n<a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16706\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image16-1024x142-1.png\" alt=\"\" width=\"900\" height=\"125\"><\/a><br>\n<\/span><\/li>\n\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">6.7 Test Replication<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Add sample documents to the default bucket in Cluster1:<\/span>\n<ul>\n<li aria-level=\"3\"><span>In the Couchbase UI, navigate to <\/span><b>Buckets &gt; Documents &gt; Add Document<\/b><\/li>\n<li aria-level=\"3\">Give the <b>Document<\/b> a unique <b>ID<\/b> and some data in <b>JSON<\/b> format<br>\n<a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image17.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16707\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image17-768x1024-1.png\" alt=\"\" width=\"768\" height=\"1024\"><\/a><\/li>\n<li aria-level=\"3\"><span>Verify that the documents appear in the default bucket of Cluster2:<\/span>\n<ul>\n<li aria-level=\"3\"><span>Port-forward to Cluster2\u2019s UI and log in:<br>\n<\/span>\n<p><p>[crayon nums=&#8221;false&#8221; lang=&#8221;sh&#8221; decode=&#8221;true&#8221;]kubectl create ns dev #in cluster1<br \/>\nkubectl create ns prod #in cluster2<br \/>\n[\/crayon]<\/p>\n6<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li aria-level=\"3\"><span>Navigate to: <\/span><em>https:\/\/localhost:8091<\/em><\/li>\n<\/ul>\n<\/li>\n\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Expected outcome<\/h4>\n\n\n\n<p><span>Data added to Cluster1 should replicate to Cluster2 in real time.<\/span><\/p>\n\n\n\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16708\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image18-1024x265-1.png\" alt=\"\" width=\"900\" height=\"233\"><\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 7: Cleanup<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What are we doing?<\/h4>\n\n\n\n<p><span>We\u2019ll cleanup our AWS environment and delete all the resources we deployed.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why is this important?<\/h4>\n\n\n\n<p><span>This will prevent you from incurring unnecessary charges.<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Steps<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">7.1 Access the AWS Console<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Go to the AWS Console &gt; <\/span><b>VPC &gt; Peering Connections<\/b><\/li>\n\n\n<li><span>Select and delete the peering connection<\/span><\/li>\n\n\n<li><span>Go to the AWS Console &gt; <\/span><b>CloudFormation &gt; Stacks<\/b><\/li>\n\n\n<li><span>Select and delete the two nodegroup stacks<\/span><\/li>\n\n\n<li><span>Once the two nodegroup stacks have finished deleting select and delete the cluster stacks<\/span><\/li>\n\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Expected outcome<\/h4>\n\n\n\n<p><span>All resources created for this tutorial are deleted from account.<\/span><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p><span>Through this guide, we&#8217;ve successfully established XDCR between Couchbase clusters running in separate EKS clusters across AWS VPCs. This setup highlights the power of combining AWS networking with Kubernetes for robust, scalable solutions. With cross-cluster replication in place, your applications gain enhanced resilience, reduced latency for distributed users, and a solid disaster recovery mechanism.<\/span><\/p>\n\n\n\n<p><span>By understanding and implementing the steps outlined here, you\u2019re equipped to tackle real-world challenges involving multi-cluster setups, expanding your expertise in both cloud networking and distributed database management.<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Learn more about <a href=\"https:\/\/www.couchbase.com\/products\/xdcr\/\">Couchbase Cross Data Center Replication (XDCR)<\/a><\/li>\n\n\n<li>Read the <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/clusters-and-availability\/xdcr-overview.html\">XDCR documentation<\/a><\/li>\n\n\n<li>Read how <a href=\"https:\/\/info.couchbase.com\/rs\/302-GJY-034\/images\/High_Availability_Disaster_Recovery_Globally_Distributed_Data_XDCR_.pdf\">XDCR is essential for globally distributed data<\/a>, disaster recovery and high availability<\/li>\n\n<\/ul>\n\n\n\n<p><br><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In modern distributed systems, the ability to replicate data between separate environments is crucial for ensuring high availability, disaster recovery, and performance optimization. Couchbase&#8217;s XDCR (Cross Data Center Replication) feature allows seamless replication of data between clusters, enabling robust data sharing across geographically or logically isolated environments. This guide will walk you through setting up [&hellip;]<\/p>\n","protected":false},"author":85538,"featured_media":4399,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[136,301,54,28,17,94],"tags":[419,338,550],"ppma_author":[932,933],"class_list":["post-4403","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-cloud","category-couchbase-server","category-xdcr","category-performance","category-security","tag-amazon-web-services-aws","tag-disaster-recovery","tag-vpc-peering"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Setting Up Cross-VPC XDCR Between Amazon EKS Clusters - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Set up Couchbase XDCR for seamless data replication between clusters in separate AWS EKS environments. Enhance resilience, disaster recovery, and performance.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters\" \/>\n<meta property=\"og:description\" content=\"Set up Couchbase XDCR for seamless data replication between clusters in separate AWS EKS environments. Enhance resilience, disaster recovery, and performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-20T17:45:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-eks-xdcr-head.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Rob Hadaway, Sr. Solutions Architect, Ben Mottershead, Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rob Hadaway, Sr. Solutions Architect\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/\"},\"author\":{\"name\":\"Rob Hadaway, Sr. Solutions Architect\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/403c24233f97f622abfb8da59c4a7143\"},\"headline\":\"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters\",\"datePublished\":\"2024-12-20T17:45:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/\"},\"wordCount\":2051,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-eks-xdcr-head.png\",\"keywords\":[\"Amazon Web Services (AWS)\",\"Disaster Recovery\",\"VPC Peering\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Couchbase Server\",\"Cross Data Center Replication (XDCR)\",\"High Performance\",\"Security\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/\",\"name\":\"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-eks-xdcr-head.png\",\"datePublished\":\"2024-12-20T17:45:37+00:00\",\"description\":\"Set up Couchbase XDCR for seamless data replication between clusters in separate AWS EKS environments. Enhance resilience, disaster recovery, and performance.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-eks-xdcr-head.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-eks-xdcr-head.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/403c24233f97f622abfb8da59c4a7143\",\"name\":\"Rob Hadaway, Sr. Solutions Architect\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/035025560d1395330542347f8d5f868a60690b355a00ca140dd048c0046733a9?s=96&d=mm&r=gc0a77ea47309604ab6290e01e066841d\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/035025560d1395330542347f8d5f868a60690b355a00ca140dd048c0046733a9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/035025560d1395330542347f8d5f868a60690b355a00ca140dd048c0046733a9?s=96&d=mm&r=g\",\"caption\":\"Rob Hadaway, Sr. Solutions Architect\"},\"description\":\"Rob Hadaway is a Senior Solutions Architect at Couchbase, where he specializes in deploying and optimizing scalable database solutions in cloud and on-premises environments. With a strong technical foundation and a passion for problem-solving, Rob has led complex projects involving AWS EKS, Azure, and Kubernetes, ensuring seamless integration and deployment of Couchbase solutions for clients across various industries. Rob holds a Master of Science in Information Systems and an MBA from the University of Utah. His technical expertise spans a wide range of tools and technologies, including Python, SQL, Terraform, Docker, Kubernetes, and React.js. He is highly credentialed, holding multiple AWS certifications, as well as Kubernetes Administrator and Developer certifications\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/author\\\/rob-hadaway\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters - The Couchbase Blog","description":"Set up Couchbase XDCR for seamless data replication between clusters in separate AWS EKS environments. Enhance resilience, disaster recovery, and performance.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/","og_locale":"en_US","og_type":"article","og_title":"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters","og_description":"Set up Couchbase XDCR for seamless data replication between clusters in separate AWS EKS environments. Enhance resilience, disaster recovery, and performance.","og_url":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/","og_site_name":"The Couchbase Blog","article_published_time":"2024-12-20T17:45:37+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-eks-xdcr-head.png","type":"image\/png"}],"author":"Rob Hadaway, Sr. Solutions Architect, Ben Mottershead, Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Rob Hadaway, Sr. Solutions Architect","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/"},"author":{"name":"Rob Hadaway, Sr. Solutions Architect","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/403c24233f97f622abfb8da59c4a7143"},"headline":"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters","datePublished":"2024-12-20T17:45:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/"},"wordCount":2051,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-eks-xdcr-head.png","keywords":["Amazon Web Services (AWS)","Disaster Recovery","VPC Peering"],"articleSection":["Best Practices and Tutorials","Couchbase Capella","Couchbase Server","Cross Data Center Replication (XDCR)","High Performance","Security"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/","url":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/","name":"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-eks-xdcr-head.png","datePublished":"2024-12-20T17:45:37+00:00","description":"Set up Couchbase XDCR for seamless data replication between clusters in separate AWS EKS environments. Enhance resilience, disaster recovery, and performance.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-eks-xdcr-head.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-eks-xdcr-head.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Setting Up Cross-VPC XDCR Between Amazon EKS Clusters"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/403c24233f97f622abfb8da59c4a7143","name":"Rob Hadaway, Sr. Solutions Architect","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/035025560d1395330542347f8d5f868a60690b355a00ca140dd048c0046733a9?s=96&d=mm&r=gc0a77ea47309604ab6290e01e066841d","url":"https:\/\/secure.gravatar.com\/avatar\/035025560d1395330542347f8d5f868a60690b355a00ca140dd048c0046733a9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/035025560d1395330542347f8d5f868a60690b355a00ca140dd048c0046733a9?s=96&d=mm&r=g","caption":"Rob Hadaway, Sr. Solutions Architect"},"description":"Rob Hadaway is a Senior Solutions Architect at Couchbase, where he specializes in deploying and optimizing scalable database solutions in cloud and on-premises environments. With a strong technical foundation and a passion for problem-solving, Rob has led complex projects involving AWS EKS, Azure, and Kubernetes, ensuring seamless integration and deployment of Couchbase solutions for clients across various industries. Rob holds a Master of Science in Information Systems and an MBA from the University of Utah. His technical expertise spans a wide range of tools and technologies, including Python, SQL, Terraform, Docker, Kubernetes, and React.js. He is highly credentialed, holding multiple AWS certifications, as well as Kubernetes Administrator and Developer certifications","url":"https:\/\/www.couchbase.com\/blog\/author\/rob-hadaway\/"}]}},"acf":[],"authors":[{"term_id":932,"user_id":85538,"is_guest":0,"slug":"rob-hadaway","display_name":"Rob Hadaway, Sr. Solutions Architect","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/Screenshot-2024-12-20-at-10.48.05-AM-2.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/Screenshot-2024-12-20-at-10.48.05-AM-2.png"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""},{"term_id":933,"user_id":85555,"is_guest":0,"slug":"benmottershead","display_name":"Ben Mottershead, Software Engineer","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/1719955373757-2.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/1719955373757-2.jpeg"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/4403","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/85538"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=4403"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/4403\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/4399"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=4403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=4403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=4403"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=4403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}