How the pieces fit together
For a database namedorders with the external domain
db.internal.example.com:
- The Admin Server creates a headless Service for each database component. It annotates each Service with the hostname to publish.
- A DNS controller, normally ExternalDNS, writes one A record per pod into your private zone. Each record points at the pod IP.
- Each FalkorDB pod announces its own external name. Replicas, Sentinels, and cluster redirects therefore hand clients names that resolve outside the cluster.
- 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.Choose a domain
Pick a subdomain dedicated to FalkorDB, for exampledb.internal.example.com.
Do not reuse a zone that holds other records.
- Each database gets names directly under the domain:
orders.db.internal.example.comfor data pods, andorders-sent.db.internal.example.comfor Sentinel pods. - Per-pod names add one more label, for example
orders-falkordb-0.orders.db.internal.example.com. - ExternalDNS with
policy: syncdeletes records it owns that no longer match a Service. A dedicated zone, plus adomainFiltersentry scoped to it, keeps the controller away from unrelated records.
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.- EKS
- AKS
- GKE
- On-premises and other
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 as100.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
ALoadBalancer 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.
- EKS
- AKS
- GKE
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: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.- EKS (Route 53)
- AKS (Azure Private DNS)
- GKE (Cloud DNS)
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 fordb.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 thecoredns-custom ConfigMap:
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.- EKS (Route 53)
- AKS (Azure Private DNS)
- GKE (Cloud DNS)
- BIND, Windows DNS, and others
Create an IAM policy scoped to the zone:Install ExternalDNS with the service account you just created:
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:--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
orders-extdns, plus orders-sent-extdns when Sentinel is on.2
ExternalDNS wrote the records
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
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.