Skip to main content
Your applications do not always run in the same Kubernetes cluster as FalkorDB. They may run on VMs, in another cluster, in a peered VPC, or on premises. To reach a database from there, clients need two things: a DNS name that resolves in their network, and a network path to the FalkorDB pods behind that name. FalkorDB Enterprise handles the database side through the external domain setting. This page covers the infrastructure you prepare before you turn that setting on: routable pod IPs, firewall rules, a private DNS zone, and a controller that keeps the zone’s records in step with the pod IPs.

How the pieces fit together

For a database named orders with the external domain db.internal.example.com:
  1. The Admin Server creates a headless Service for each database component. It annotates each Service with the hostname to publish.
  2. A DNS controller, normally ExternalDNS, writes one A record per pod into your private zone. Each record points at the pod IP.
  3. Each FalkorDB pod announces its own external name. Replicas, Sentinels, and cluster redirects therefore hand clients names that resolve outside the cluster.
  4. The client resolves the name and connects straight to the pod IP. No load balancer or kube-proxy hop sits in between.

Requirements checklist

Everything in this table must hold before you set an external domain. The rest of this page walks through each item per platform.
Requirement 4 is easy to miss. If the cluster cannot resolve the external names, a replicated deployment with Sentinel stays in Creating. Its pods are healthy, but KubeBlocks cannot register the primary with Sentinel. To recover, fix the DNS setup, or clear the external domain in the Networking step of the edit wizard.

Choose a domain

Pick a subdomain dedicated to FalkorDB, for example db.internal.example.com. Do not reuse a zone that holds other records.
  • Each database gets names directly under the domain: orders.db.internal.example.com for data pods, and orders-sent.db.internal.example.com for Sentinel pods.
  • Per-pod names add one more label, for example orders-falkordb-0.orders.db.internal.example.com.
  • ExternalDNS with policy: sync deletes records it owns that no longer match a Service. A dedicated zone, plus a domainFilters entry scoped to it, keeps the controller away from unrelated records.
Use a private zone. Pod IPs are private addresses, and publishing them in a public zone leaks your internal topology.

Step 1: Make pod IPs routable

Pod IPs are routable only when the CNI assigns them from your VPC or VNet address space. Check this first, because changing the CNI usually means creating a new cluster or node pool.
The default Amazon VPC CNI (aws-node) assigns pod IPs from your VPC subnets, so pods are routable by default.
  • Custom networking (ENIConfig) places pods in separate subnets, often from a secondary CIDR such as 100.64.0.0/16. Add that CIDR to the route tables and peering or Transit Gateway attachments that clients use.
  • Calico, Cilium, or another CNI in overlay mode replaces the VPC CNI. Pod IPs are then not routable. See If pod IPs are not routable.

If pod IPs are not routable

A LoadBalancer Service (see Networking) is a working alternative only for standalone deployments, and only without an external domain. Clients then connect to the load balancer address. It does not work for replication with Sentinel or for sharded deployments. Sentinel returns the primary’s pod address, and sharded deployments answer CLUSTER SLOTS and MOVED redirects with each node’s pod address. A single load balancer only gives clients a first address to connect to; the addresses they are then sent to are still unreachable. These topologies need routable pod IPs.

Step 2: Open the network path

Clients connect directly to pod IPs, so firewall rules must target the pod address range, not a load balancer. Clients never need the cluster bus port 16379. Only pods inside the cluster use it.
With the VPC CNI, pods use the security groups of the node’s network interface. In most clusters this is the EKS cluster security group. Allow the client CIDR on that group:
Replace 10.20.0.0/16 with your client CIDR. If you use security groups for pods (SecurityGroupPolicy), add the rule to the group attached to the FalkorDB pods instead. With custom networking, add it to the security group in the ENIConfig. Also check the network ACLs on the pod subnets.

Kubernetes NetworkPolicy

The chart’s network policies cover only the Admin Server and Admin UI. They do not restrict database pods. If you apply your own default-deny policy to a database namespace, allow the client CIDR explicitly:
The pods must also keep reaching each other on 6379, 26379, and 16379. A default-deny policy that blocks this traffic breaks replication and failover.

Step 3: Create a private DNS zone

Create the zone and make it resolvable from both the Kubernetes cluster’s network and every client network.
Create a private hosted zone associated with the cluster VPC:
Associate every client VPC with the same zone:
For a client VPC in another account, first run aws route53 create-vpc-association-authorization in the zone’s account. Then run associate-vpc-with-hosted-zone from the client account.EKS CoreDNS forwards to the VPC resolver, so the cluster resolves the zone once its VPC is associated. Both VPCs need enableDnsSupport and enableDnsHostnames turned on.

Clients outside the cloud network

On-premises resolvers cannot query cloud private zones directly. Add a conditional forwarder for db.internal.example.com on your on-premises DNS servers that points at an inbound resolver endpoint in the cluster network:

Cluster-side resolution

Skip this section when the cluster already resolves the zone through its VPC resolver, which is the default on EKS, GKE, and AKS with Azure-provided DNS. Otherwise, forward the domain from CoreDNS to a resolver that can answer for it. On AKS, use the coredns-custom ConfigMap:
Replace 10.0.0.10 with a resolver that serves the zone. On other distributions, add the same server block to the coredns ConfigMap. Confirm resolution from inside the cluster after Step 5:

Step 4: Install a DNS controller

The Admin Server creates a headless Service for each component and annotates it. A controller must turn those annotations into DNS records. ExternalDNS is the supported option. The examples below use its Helm chart and give it cloud credentials through workload identity, so you store no static keys.
Create an IAM policy scoped to the zone:
Install ExternalDNS with the service account you just created:
Then install the chart:
The release, namespace, and service account are all named falkordb-external-dns, so this instance never replaces an ExternalDNS you already run for other zones.
You can reuse an ExternalDNS instance that is already installed only if it can manage the private zone: same provider, credentials with write access to the zone, and no zone-visibility filter that excludes private zones (such as --aws-zone-type=public or --google-zone-visibility=public). Then add db.internal.example.com to its domainFilters and confirm service is among its sources. On ExternalDNS v0.22.0 and later it must also read external-dns.alpha.kubernetes.io/ annotations: set annotationPrefix as above, or, on v0.23.0 and later, add --enable-legacy-annotation-prefix so it keeps reading its current prefix too.Otherwise, install the separate falkordb-external-dns instance shown above. It has its own release, namespace, and service account, so it does not change the existing controller.

Using a different controller

If you cannot run ExternalDNS, any controller that implements the same contract works. FalkorDB creates a headless Service per component (clusterIP: None, publishNotReadyAddresses: true) with these annotations: For each such Service, your controller must:
  • Publish <pod-name>.<hostname> as an A record pointing at that pod’s IP, for every endpoint, including endpoints that are not ready.
  • Publish <hostname> as a multi-value A record containing every endpoint IP.
  • Update both records whenever endpoints change, and delete them when the Service is deleted.

Step 5: Turn on the external domain

Once the infrastructure is ready, set the domain for every new database or for a single database. See External DNS access for the full options. To make it the installation default, re-run the installer pinned to the chart version you already run:
Without --version, the installer upgrades to the latest chart on the stable channel, which can also move a beta installation to a different release. The --skip-* flags leave KubeBlocks, its CRDs, and the Snapshot Controller untouched, so this change updates only the FalkorDB Enterprise release. Set RELEASE and NAMESPACE to the values you installed with; the defaults are shown. The installer merges this value into the values it stored on earlier runs, so your other settings are kept. Pass the same registry options you use for upgrades if this machine has not logged in to the registry. The setting applies to databases created afterwards; it does not change existing ones. To set it for one database, open the Networking step in the create or edit wizard and enter the domain.
With an external domain, use TLS certificates issued by FalkorDB Enterprise or cert-manager. Certificates issued by KubeBlocks name only the in-cluster pod addresses, so the Admin Server rejects that combination. See TLS.

Verify the setup

1

The headless Services exist and are annotated

Expect orders-extdns, plus orders-sent-extdns when Sentinel is on.
2

ExternalDNS wrote the records

Look for CREATE or UPSERT lines for each pod name. If you see none, check domainFilters and the controller’s cloud permissions.
3

The cluster resolves the names

The answer must list the pod IPs shown by kubectl get pods -o wide.
4

A client resolves and connects

From a VM or pod in the client network:
5

The servers announce external names

When each step returns external names and pod IPs from your VPC range, clients anywhere on the routed network can use the database.

Troubleshooting