{"id":16686,"date":"2024-12-20T09:45:37","date_gmt":"2024-12-20T17:45:37","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16686"},"modified":"2025-06-13T17:14:21","modified_gmt":"2025-06-14T00:14:21","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":"<p><span style=\"font-weight: 400;\">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<p><span style=\"font-weight: 400;\">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<h2>Prerequisites<\/h2>\n<p><span style=\"font-weight: 400;\">To follow this guide, ensure you have:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>AWS CLI<\/b><span style=\"font-weight: 400;\"> installed and configured<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">An AWS account with permissions for creating VPCs, EKS clusters, and security groups<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Familiarity with Kubernetes and tools like kubectl and Helm<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Helm installed to deploy Couchbase<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Basic knowledge of networking concepts, including CIDR blocks, routing tables, and DNS<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>Step 1: Deploy EKS clusters in separate VPCs<\/h3>\n<h4>What are we doing?<\/h4>\n<p><span style=\"font-weight: 400;\">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<h4>Why is this important?<\/h4>\n<p><span style=\"font-weight: 400;\">This separation ensures:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Isolation for better security and management<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Scalability and flexibility for handling workloads<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Clear routing rules between clusters<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h4>Commands to create clusters<\/h4>\n<h5>Deploy cluster1<\/h5>\n<pre class=\"nums:false lang:sh decode:true\">eksctl create cluster \\\r\n\u00a0\u00a0--name cluster1 \\\r\n\u00a0\u00a0--region us-east-1 \\\r\n\u00a0\u00a0--zones us-east-1a,us-east-1b,us-east-1c \\\r\n\u00a0\u00a0--node-type t2.medium \\\r\n\u00a0\u00a0--nodes 2 \\\r\n\u00a0\u00a0--nodes-min 1 \\\r\n\u00a0\u00a0--nodes-max 3 \\\r\n\u00a0\u00a0--version 1.27 \\\r\n\u00a0\u00a0--vpc-cidr 10.0.0.0\/16<\/pre>\n<h5>Deploy cluster2<\/h5>\n<pre class=\"nums:false lang:sh decode:true\">eksctl create cluster \\\r\n\u00a0\u00a0--name cluster2 \\\r\n\u00a0\u00a0--region us-east-1 \\\r\n\u00a0\u00a0--zones us-east-1a,us-east-1b,us-east-1c \\\r\n\u00a0\u00a0--node-type t2.medium \\\r\n\u00a0\u00a0--nodes 2 \\\r\n\u00a0\u00a0--nodes-min 1 \\\r\n\u00a0\u00a0--nodes-max 3 \\\r\n\u00a0\u00a0--version 1.27 \\\r\n\u00a0\u00a0--vpc-cidr 10.1.0.0\/16<\/pre>\n<h4>Expected outcome<\/h4>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Cluster1 resides in VPC 10.0.0.0\/16<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Cluster2 resides in VPC 10.1.0.0\/16<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16689\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-1-1024x394.png\" alt=\"\" width=\"900\" height=\"346\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-1-1024x394.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-1-300x116.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-1-768x296.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-1-1536x592.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-1-1320x508.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-1.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<hr \/>\n<h3>Step 2: Peer the VPCs for Inter-Cluster Communication<\/h3>\n<h4>What are we doing?<\/h4>\n<p><span style=\"font-weight: 400;\">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<h4>Steps<\/h4>\n<h5>2.1 Create a peering connection<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Go to the AWS Console &gt; <\/span><b>VPC &gt; Peering Connections<\/b><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Click <\/span><b>Create Peering Connection<\/b><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Select the <\/span><b>Requester VPC<\/b><span style=\"font-weight: 400;\"> (Cluster1 VPC) and <\/span><b>Accepter VPC<\/b><span style=\"font-weight: 400;\"> (Cluster2 VPC)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Name the connection <em>eks-peer<\/em><\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Click <\/span><b>Create Peering Connection<\/b><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>2.2 Accept the peering request<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Select the peering connection<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Click <\/span><b>Actions &gt; Accept Request<\/b><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>2.3 Update route tables<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">For Cluster1 VPC, add a route for 10.1.0.0\/16, targeting the peering connection<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">For Cluster2 VPC, add a route for 10.0.0.0\/16, targeting the peering connection<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16690\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-1024x191.png\" alt=\"\" width=\"900\" height=\"168\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-1024x191.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-300x56.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-768x143.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-1536x286.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-1320x246.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h5>2.4 Modify security groups<\/h5>\n<h4>Why is this necessary?<\/h4>\n<p><span style=\"font-weight: 400;\">Security groups act as firewalls, and we must allow traffic between the clusters explicitly.<\/span><\/p>\n<h4>How to modify<\/h4>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Navigate to <\/span><b>EC2 &gt; Security Groups<\/b><span style=\"font-weight: 400;\"> in the AWS Console<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Identify the security groups associated with Cluster1 and Cluster2<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">For Cluster1&#8217;s security group:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><span style=\"font-weight: 400;\">Click <\/span><b>Edit Inbound Rules<\/b><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><span style=\"font-weight: 400;\">Add a rule:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"4\"><b>Type<\/b><span style=\"font-weight: 400;\">: All traffic<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"4\"><b>Source<\/b><span style=\"font-weight: 400;\">: Security group ID of Cluster2<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Repeat for Cluster2, allowing traffic from Cluster1\u2019s security group<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16691\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-1024x396.png\" alt=\"\" width=\"900\" height=\"348\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-1024x396.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-300x116.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-768x297.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-1536x595.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-1320x511.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16692\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image5-1024x86.png\" alt=\"\" width=\"900\" height=\"76\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image5-1024x86.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image5-300x25.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image5-768x65.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image5-1536x129.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image5-1320x111.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image5.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16693\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image4-1024x276.png\" alt=\"\" width=\"900\" height=\"243\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image4-1024x276.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image4-300x81.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image4-768x207.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image4-1536x414.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image4-1320x356.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image4.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<hr \/>\n<h3>Step 3: Test Connectivity by Deploying NGINX in Cluster2<\/h3>\n<h4>What are we doing?<\/h4>\n<p><span style=\"font-weight: 400;\">We are deploying an NGINX pod in Cluster2 to verify that Cluster1 can communicate with it.<\/span><\/p>\n<h4>Why is this important?<\/h4>\n<p><span style=\"font-weight: 400;\">This step ensures the networking between clusters is functional before deploying Couchbase.<\/span><\/p>\n<h4>Steps<\/h4>\n<h5>3.1 Create a Namespace in Cluster1 and Cluster2<\/h5>\n<pre class=\"nums:false lang:sh decode:true\">kubectl create ns dev #in cluster1\r\nkubectl create ns prod #in cluster2\r\n<\/pre>\n<h5>3.2 Deploy NGINX in Cluster1 and Cluster2<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Create nginx.yaml:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:yaml decode:true \">apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n\u00a0 name: nginx\r\nspec:\r\n\u00a0 replicas: 1\r\n\u00a0 selector:\r\n\u00a0 \u00a0 matchLabels:\r\n\u00a0 \u00a0 \u00a0 app: nginx\r\n\u00a0 template:\r\n\u00a0 \u00a0 metadata:\r\n\u00a0 \u00a0 \u00a0 labels:\r\n\u00a0 \u00a0 \u00a0 \u00a0 app: nginx\r\n\u00a0 \u00a0 spec:\r\n\u00a0 \u00a0 \u00a0 containers:\r\n\u00a0 \u00a0 \u00a0 - name: nginx\r\n\u00a0 \u00a0 \u00a0 \u00a0 image: nginx\r\n\u00a0 \u00a0 \u00a0 \u00a0 ports:\r\n\u00a0 \u00a0 \u00a0 \u00a0 - containerPort: 80\r\n---\r\napiVersion: v1\r\nkind: Service\r\nmetadata:\r\n\u00a0 name: nginx\r\nspec:\r\n\u00a0 clusterIP: None\r\n\u00a0 ports:\r\n\u00a0 - port: 80\r\n\u00a0 \u00a0 targetPort: 80\r\n\u00a0 selector:\r\n\u00a0 \u00a0 app: nginx<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>3.3 Apply the YAML<\/h5>\n<pre class=\"nums:false lang:sh decode:true \">kubectl apply -f nginx.yaml -n prod<\/pre>\n<h5>3.4 Verify Connectivity from Cluster1<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Exec into the pod in Cluster1:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl exec -it -n dev &lt;pod-name&gt; -- \/bin\/bash<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>3.5 Test connectivity to Cluster2<\/h5>\n<pre class=\"nums:false lang:sh decode:true \">curl nginx.prod<\/pre>\n<h4>Expected outcome<\/h4>\n<p><span style=\"font-weight: 400;\">The <em>curl<\/em> command will fail without DNS forwarding, highlighting the need for further DNS configuration.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16694\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image7.png\" alt=\"\" width=\"596\" height=\"109\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image7.png 596w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image7-300x55.png 300w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><\/p>\n<hr \/>\n<h3>Step 4: Configuring DNS forwarding<\/h3>\n<h4>What are we doing?<\/h4>\n<p><span style=\"font-weight: 400;\">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<h4>Why is this important?<\/h4>\n<p><span style=\"font-weight: 400;\">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<h4>Steps<\/h4>\n<h5>4.1 Retrieve Cluster2\u2019s DNS Service Endpoint<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Run the following command in Cluster2 to get the DNS service endpoint:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl get endpoints -n kube-system<\/pre>\n<\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Look for the <em>kube-dns<\/em> or <em>coredns<\/em> service and note its IP address. For example:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:default decode:true \">----------------------------------------\r\nNAME \u00a0 \u00a0 \u00a0 ENDPOINTS\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 AGE\r\nkube-dns \u00a0 10.1.20.116:53 \u00a0 \u00a0 3h\r\n----------------------------------------<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16695\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image6.png\" alt=\"\" width=\"859\" height=\"147\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image6.png 859w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image6-300x51.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image6-768x131.png 768w\" sizes=\"auto, (max-width: 859px) 100vw, 859px\" \/><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>4.2 Edit the CoreDNS ConfigMap in Cluster1<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Open the CoreDNS ConfigMap for editing:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl edit cm coredns -n kube-system<\/pre>\n<p>&nbsp;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>4.3 A<span style=\"font-weight: 400;\">dd the following block to the Corefile section<br \/>\n<\/span><\/h5>\n<pre class=\"nums:false lang:default decode:true\">prod.svc.cluster.local:53 {\r\n\u00a0\u00a0\u00a0\u00a0forward . 10.1.20.116\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Replace 10.1.20.116 with the actual DNS endpoint IP from Cluster2.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Note: We only need to use one of the CoreDNS endpoints for this ConfigMap. <\/span><span style=\"font-weight: 400;\">The IP of CoreDNS pods rarely change but can if the Node goes down. <\/span><span style=\"font-weight: 400;\">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<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image9.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16696\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image9.png\" alt=\"\" width=\"600\" height=\"456\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image9.png 754w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image9-300x228.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<h5>4.4 Restart CoreDNS in Cluster1<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Apply the changes by restarting CoreDNS:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl rollout restart deployment coredns -n kube-system<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image8.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16697\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image8.png\" alt=\"\" width=\"867\" height=\"98\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image8.png 867w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image8-300x34.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image8-768x87.png 768w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \/><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>4.5 Verify DNS Forwarding<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Exec into any pod in Cluster1:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl exec -it -n default &lt;pod-name&gt; -- \/bin\/bash<\/pre>\n<\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Test DNS resolution for an NGINX service in Cluster2:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">curl nginx.prod.svc.cluster.local<\/pre>\n<\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\">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\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image12-1024x464.png\" alt=\"\" width=\"900\" height=\"408\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image12-1024x464.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image12-300x136.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image12-768x348.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image12-1320x598.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image12.png 1348w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>Expected outcome<\/h4>\n<p><span style=\"font-weight: 400;\">DNS queries from Cluster1 to Cluster2 should resolve successfully.<\/span><\/p>\n<hr \/>\n<h3>Step 5: Deploying Couchbase<\/h3>\n<h4>What are we doing?<\/h4>\n<p><span style=\"font-weight: 400;\">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<h4>Why is this important?<\/h4>\n<p><span style=\"font-weight: 400;\">Couchbase clusters form the foundation of the XDCR setup, providing a robust and scalable NoSQL database platform.<\/span><\/p>\n<h4>Steps<\/h4>\n<h5>5.1 Add the Couchbase Helm Chart Repository<\/h5>\n<pre class=\"nums:false lang:sh decode:true\">helm repo add couchbase https:\/\/couchbase-partners.github.io\/helm-charts\/\r\nhelm repo update\r\n<\/pre>\n<h5>5.2 Deploy Couchbase in Cluster1<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Switch to Cluster1:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl config use-context &lt;cluster1-context&gt;\r\n<\/pre>\n<\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Deploy Couchbase:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true\">helm install couchbase couchbase\/couchbase-operator --namespace dev<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\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\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10-1024x432.png\" alt=\"\" width=\"900\" height=\"380\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10-1024x432.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10-300x127.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10-768x324.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10-1536x648.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10-1320x557.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image10.png 1780w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<h5>5.3 Deploy Couchbase in Cluster2<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Switch to Cluster2:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl config use-context &lt;cluster2-context&gt;\r\n<\/pre>\n<\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Deploy Couchbase:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">helm install couchbase couchbase-operator --namespace prod<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>5.4 Verify Deployment<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Check the Couchbase pods:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl get pods -n dev\u00a0 # For Cluster1\r\nkubectl get pods -n prod # For Cluster2<\/pre>\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\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image11-1-1024x185.png\" alt=\"\" width=\"900\" height=\"163\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image11-1-1024x185.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image11-1-300x54.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image11-1-768x138.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image11-1.png 1104w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\">Ensure all pods are running.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><b>Note: <\/b><span style=\"font-weight: 400;\">If you encounter a deployment error, edit the CouchbaseCluster CRD to use a compatible image version:<\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true\">kubectl edit couchbasecluster &lt;cluster-name&gt; -n &lt;namespace&gt;\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Change:<\/span><\/p>\n<pre class=\"nums:false lang:yaml decode:true \">image: couchbase\/server:7.2.0<\/pre>\n<p><span style=\"font-weight: 400;\">To:<\/span><\/p>\n<pre class=\"nums:false lang:yaml decode:true \">image: couchbase\/server:7.2.4<\/pre>\n<h4>Expected outcome<\/h4>\n<p><span style=\"font-weight: 400;\">Couchbase clusters should be running and accessible via their respective UIs.<\/span><\/p>\n<hr \/>\n<h3>Step 6: Setting Up XDCR<\/h3>\n<h4>What are we doing?<\/h4>\n<p><span style=\"font-weight: 400;\">We\u2019ll configure XDCR to enable data replication between the two Couchbase clusters.<\/span><\/p>\n<h4>Why is this important?<\/h4>\n<p><span style=\"font-weight: 400;\">XDCR ensures data consistency across clusters, supporting high availability and disaster recovery scenarios.<\/span><\/p>\n<h4>Steps<\/h4>\n<h5>6.1 Get service name from Cluster2<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">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><\/p>\n<pre class=\"nums:false lang:sh decode:true\">kubectl get services -n prod<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>6.2 Access the Couchbase UI for Cluster2<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Port-forward the Couchbase UI:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:yaml decode:true \">kubectl port-forward -n prod cluster2-0000 8091:8091\r\n<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Open a browser and navigate to:<br \/>\n<em>https:\/\/localhost:8091<\/em><br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Log in using the credentials configured during the deployment.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>6.3 View Documents in Cluster2<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">In the Couchbase UI, go to <\/span><b>Buckets<\/b><\/li>\n<li aria-level=\"2\">Note that no Documents exist in the <b>default<\/b> bucket<\/li>\n<\/ul>\n<\/li>\n<\/ul>\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\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13-1024x96.png\" alt=\"\" width=\"900\" height=\"84\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13-1024x96.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13-300x28.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13-768x72.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13-1536x144.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13-1320x124.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image13.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h5>6.4 Access the Couchbase UI for Cluster1<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Port-forward the Couchbase UI:<br \/>\n<\/span><\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl port-forward -n dev cluster1-0000 8091:8091<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image14.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16704\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image14.png\" alt=\"\" width=\"881\" height=\"87\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image14.png 881w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image14-300x30.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image14-768x76.png 768w\" sizes=\"auto, (max-width: 881px) 100vw, 881px\" \/><\/a><\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\">Open a browser and navigate to:<br \/>\n<em>https:\/\/localhost:8091<\/em><\/span><\/li>\n<li aria-level=\"2\"><span style=\"font-weight: 400;\">Log in using the credentials configured during the deployment<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>6.5 Add a Remote Cluster<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">In the Couchbase UI, go to <\/span><b>XDCR &gt; Add Remote Cluster<\/b><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Configure the remote cluster:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><b>Cluster Name<\/b><span style=\"font-weight: 400;\">: Cluster2<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><b>IP\/Hostname<\/b><span style=\"font-weight: 400;\">: &lt;Cluster2 Service Name&gt;<em>.prod.svc.cluster.local<\/em><\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><b>Username<\/b><span style=\"font-weight: 400;\">: Admin username for Cluster2<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><b>Password<\/b><span style=\"font-weight: 400;\">: Admin password for Cluster2<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Click <\/span><b>Save<\/b><span style=\"font-weight: 400;\"><br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16705\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image15.png\" alt=\"\" width=\"831\" height=\"723\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image15.png 831w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image15-300x261.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image15-768x668.png 768w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/a><\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>6.6 Set Up Replication<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">In the Couchbase UI for Cluster1, go to <\/span><b>XDCR &gt; Add Replication<\/b><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Configure the replication:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><b>Replicate From Bucket<\/b><span style=\"font-weight: 400;\">: Default bucket in Cluster1<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><b>Replicate To Bucket<\/b><span style=\"font-weight: 400;\">: Default bucket in Cluster2<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><b>Remote Cluster<\/b><span style=\"font-weight: 400;\">: Select Cluster2<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Click <\/span><b>Save<\/b><span style=\"font-weight: 400;\"><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\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16-1024x142.png\" alt=\"\" width=\"900\" height=\"125\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16-1024x142.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16-300x42.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16-768x106.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16-1536x213.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16-1320x183.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image16.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>6.7 Test Replication<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Add sample documents to the default bucket in Cluster1:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><span style=\"font-weight: 400;\">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\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image17-768x1024.png\" alt=\"\" width=\"768\" height=\"1024\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image17-768x1024.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image17-225x300.png 225w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image17-300x400.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image17.png 1135w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><\/li>\n<li aria-level=\"3\"><span style=\"font-weight: 400;\">Verify that the documents appear in the default bucket of Cluster2:<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"3\"><span style=\"font-weight: 400;\">Port-forward to Cluster2\u2019s UI and log in:<br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:sh decode:true \">kubectl port-forward -n prod cluster2-0000 8091:8091\r\n<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li aria-level=\"3\"><span style=\"font-weight: 400;\">Navigate to: <\/span><em>https:\/\/localhost:8091<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>Expected outcome<\/h4>\n<p><span style=\"font-weight: 400;\">Data added to Cluster1 should replicate to Cluster2 in real time.<\/span><\/p>\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\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18-1024x265.png\" alt=\"\" width=\"900\" height=\"233\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18-1024x265.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18-300x78.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18-768x199.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18-1536x398.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18-1320x342.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image18.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<hr \/>\n<h3>Step 7: Cleanup<\/h3>\n<h4>What are we doing?<\/h4>\n<p><span style=\"font-weight: 400;\">We\u2019ll cleanup our AWS environment and delete all the resources we deployed.<\/span><\/p>\n<h4>Why is this important?<\/h4>\n<p><span style=\"font-weight: 400;\">This will prevent you from incurring unnecessary charges.<\/span><\/p>\n<h4>Steps<\/h4>\n<h5>7.1 Access the AWS Console<\/h5>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Go to the AWS Console &gt; <\/span><b>VPC &gt; Peering Connections<\/b><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Select and delete the peering connection<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Go to the AWS Console &gt; <\/span><b>CloudFormation &gt; Stacks<\/b><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Select and delete the two nodegroup stacks<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Once the two nodegroup stacks have finished deleting select and delete the cluster stacks<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>Expected outcome<\/h4>\n<p><span style=\"font-weight: 400;\">All resources created for this tutorial are deleted from account.<\/span><\/p>\n<hr \/>\n<h2>Conclusion<\/h2>\n<p><span style=\"font-weight: 400;\">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<p><span style=\"font-weight: 400;\">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<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Learn more about <a href=\"https:\/\/www.couchbase.com\/products\/xdcr\/\">Couchbase Cross Data Center Replication (XDCR)<\/a><\/li>\n<li>Read the <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/clusters-and-availability\/xdcr-overview.html\">XDCR documentation<\/a><\/li>\n<li>Read how <a href=\"https:\/\/www.couchbase.com\/content\/c\/developing-apps-xdcr-wp?x=bf-s6J\">XDCR is essential for globally distributed data<\/a>, disaster recovery and high availability<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><br style=\"font-weight: 400;\" \/><br style=\"font-weight: 400;\" \/><\/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 [&hellip;]<\/p>\n","protected":false},"author":85538,"featured_media":16711,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2225,1816,9415,9417,1813],"tags":[10124,2127,9583],"ppma_author":[10067,10068],"class_list":["post-16686","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.3 (Yoast SEO v27.3) - 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=\"article:modified_time\" content=\"2025-06-14T00:14:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/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\",\"dateModified\":\"2025-06-14T00:14:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/xdcr-couchbase-aws-eks\\\/\"},\"wordCount\":1391,\"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\\\/1\\\/2024\\\/12\\\/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\\\/1\\\/2024\\\/12\\\/blog-eks-xdcr-head.png\",\"datePublished\":\"2024-12-20T17:45:37+00:00\",\"dateModified\":\"2025-06-14T00:14:21+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\\\/1\\\/2024\\\/12\\\/blog-eks-xdcr-head.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2024\\\/12\\\/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\\\/2023\\\/04\\\/admin-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"width\":218,\"height\":34,\"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:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2024\\\/12\\\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png270993c0b5ac0ea0c8ba036f4284290b\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2024\\\/12\\\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2024\\\/12\\\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png\",\"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","article_modified_time":"2025-06-14T00:14:21+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/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","dateModified":"2025-06-14T00:14:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-couchbase-aws-eks\/"},"wordCount":1391,"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\/1\/2024\/12\/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\/1\/2024\/12\/blog-eks-xdcr-head.png","datePublished":"2024-12-20T17:45:37+00:00","dateModified":"2025-06-14T00:14:21+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\/1\/2024\/12\/blog-eks-xdcr-head.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/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\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"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:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png270993c0b5ac0ea0c8ba036f4284290b","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png","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":10067,"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\/1\/2024\/12\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/Screenshot-2024-12-20-at-10.48.05\u202fAM.png"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""},{"term_id":10068,"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\/1\/2024\/12\/1719955373757.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/1719955373757.jpeg"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/16686","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=16686"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/16686\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/16711"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=16686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=16686"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=16686"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=16686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}