Hybrid Manager offers two ways to establish trust between the installations in a multi-DC deployment:
Shared object storage. All locations write to the same bucket, and each installation publishes its trust information there. See Configuring a multi-DC deployment. This requires all locations to be on the same provider, because they must all reach the same bucket.
Federation pairing tokens. Each location keeps its own object storage. You mint a token on the primary and use it to join each secondary, which exchanges trust information directly between the installations. Because no bucket is shared, the locations can be in different clouds.
This page covers the pairing-token method. Use it when you want locations in different clouds, or when a single bucket reachable from every location isn't acceptable for network or compliance reasons.
Choosing between the two methods
| Shared object storage | Federation pairing tokens | |
|---|---|---|
| Object storage | One bucket, reachable from and shared by every location | Each location keeps its own |
| Cloud providers | All locations on the same provider | Locations may be in different clouds |
| How trust is established | Automatically, through the shared bucket | Explicitly, by minting a token and joining with it |
| Peer domains in the CR | Declared in clusterGroups | Derived from the pairings |
| Restoring a Postgres cluster | Into any location in the deployment | Only into the location that holds its backup |
Both methods are fully supported, and a deployment uses one or the other. You choose at install time by deciding whether the locations share a bucket — which also determines whether you can restore a Postgres cluster into a different location, described in Restoring a Postgres cluster into a different location.
Before you start
Make yourself familiar with the multi-DC overview, which covers the concepts, topologies, and the roles a location can take.
Prerequisites
Versions
HM 2026.9 or later on every location. Pairing-token federation isn't supported on earlier releases.
HM operator 2.1 or later on every location. Earlier operator versions don't include the federation resources this method relies on.
edbctl1.9.0 or later, which provides theedbctl federationcommands.
One object store per location
Each location keeps the dedicated object storage that a standard, single-location HM installation already requires. Unlike the shared-storage method, you don't align the edb-object-storage secret across locations — each location uses its own.
Keep beacon_location_id unique per location. It identifies the location in the HM console and API, so it must be distinct regardless of how storage is arranged.
Network connectivity
The pairing exchange, the SPIRE bundle endpoint, and the telemetry store endpoints are all addressed by each installation's portal hostname (portal_domain_name). Every location must therefore be able to resolve and reach the portal hostname of the locations it federates with:
| From | To | Port | Used for |
|---|---|---|---|
| Each secondary | Primary portal hostname | 443/TCP | The pairing exchange when you run edbctl federation join |
| Each location | Peer portal hostname | 8444/TCP | SPIRE bundle endpoint, for ongoing trust-bundle refresh |
| Each secondary | Primary portal hostname | 9445/TCP | Beacon gRPC, so the location registers and heartbeats |
Important
Name resolution matters as much as reachability. Because these endpoints are addressed by portal hostname rather than by IP, each cluster must resolve its peers' portal hostnames to an address it can actually reach.
If your portals are published through private load balancers, a public DNS record either won't exist or will resolve to an address the peer cluster can't route to. In that case, provide private DNS in each cluster that resolves every peer's portal hostname to that peer's private load balancer address.
Certificates
edbctl federation create-token pins the primary's portal certificate into the token by default, and the joining secondary verifies against that pin. This works with the default self-signed portal certificate, so no extra configuration is needed.
If your portals use publicly trusted certificates and you would rather validate through the system trust store, pass --no-pin when creating the token. Don't use --no-pin with self-signed portal certificates.
Install the locations
Install HM once per location, following Phase 5: Installing Hybrid Manager, with two additions to each HybridControlPlane CR.
Set the role on every location. The primary hosts the console and manages the deployment; each secondary is a data-only location.
In primary.yaml:
apiVersion: edbpgai.edb.com/v1alpha1 kind: HybridControlPlane metadata: name: edbpgai spec: clusterGroups: role: primary # ... your other spec fields
In each secondary.yaml:
apiVersion: edbpgai.edb.com/v1alpha1 kind: HybridControlPlane metadata: name: edbpgai spec: clusterGroups: role: secondary scenarios: - core disabledComponents: - upm-ui # ... your other spec fields
Note
Set only role. With operator 2.1 or later you don't declare peer portal domains: the clusterGroups.primary and clusterGroups.secondaries fields are deprecated, and the operator derives the peer topology from the federation pairings you create in the next section. Any values you do set are still honored, but they aren't needed here.
As with any multi-DC deployment, reducing secondaries to the core scenario and disabling the console (upm-ui) keeps the data-only locations lean. The console runs on the primary and manages every location.
Federate the locations
The edbctl federation commands act on the cluster your current kubectl context points at, and don't need HM API credentials. Switch context between the steps below.
1. Create a pairing token on the primary
With your context pointing at the primary:
edbctl federation create-token --output pairing.tokenThe token is written to the file you name, and is valid for 24 hours by default. Use --ttl to choose a different lifetime, for example --ttl 1h.
One token can be used to join several secondaries, so a three-location deployment needs only one token.
Important
The token is a credential: it authorizes a location to join your deployment. Transfer it over a secure channel, don't commit it to version control or paste it into tickets or chat, and keep its lifetime as short as your process allows. Revoke it as soon as the joins are done — see Managing tokens and pairings.
2. Join from each secondary
Copy the token file to a machine with context on the secondary, then:
edbctl federation join --token-file pairing.token --wait
The secondary contacts the primary's portal, exchanges trust bundles, and records the pairing. --wait blocks until the pairing reaches the Synced state.
Repeat for each additional secondary, using the same token.
Note
--wait returns as soon as the pairing is Synced. The primary then needs a short time to finish registering the location and to roll out the cross-location observability components, so allow a minute or two before the next step.
3. Verify
On the primary, confirm each pairing is established:
edbctl federation list-pairings
Each secondary appears with role primary (the primary's side of the relationship), its peer portal domain, and state Synced. On each secondary, the same command shows a single entry with role secondary pointing back at the primary.
Confirm every location is registered and heartbeating:
kubectl get location
Each location appears as managed-<LOCATION_ID> with a recent LASTHEARTBEAT: