Joining client to Consul from different VPC on DigitalOcean

I have 3 consul servers on DigitalOcean with the following config:

datacenter     = "dc1"
data_dir       = "/opt/consul"
bind_addr      = "0.0.0.0"
advertise_addr = "10.114.0.x" --> x = 1, 2, 3 respectively
client_addr    = "0.0.0.0"
retry_join     = ["10.114.0.1", "10.114.0.2", "10.114.0.3"]

connect {
  enabled = true
}
ui               = true
server           = true
bootstrap_expect = 3

All 3 servers have 3 IPs: Private, Public, Floating

This is fine and I have a few clients that connect to it in the same VPC with configuration like this:

datacenter     = "dc1"
data_dir       = "/opt/consul"
advertise_addr = "10.114.0.4"
retry_join     = ["10.114.0.1", "10.114.0.2", "10.114.0.3"]

Now, a new client comes and he has a different account/team with its own separate billing settings. This means that he has his own VPC for his account.

If I create a client for him with the client configuration above, it fails with the following:

[ERROR] agent.client: RPC failed to server: method=Catalog.ListDatacenters server=10.114.0.3:8300 error="rpc erro r getting client: failed to get conn: dial tcp <nil>->10.114.0.1:8300: connect: no route to host"

[ERROR] client: error discovering nomad servers: error="client.consul: unable to query Consul datacenters: Unexpected response code: 500 (rpc error getting client: failed to get conn: dial tcp <nil>->10.114.0.1:8300: connect: no route to host)"

It also logs this for the other 2 servers. This is not a big surprise, since they’re on a different VPC.

I tried many sensible permutations of the following:

  • Use public IPs for retry_join
  • Use floating IPs for retry_join
  • Use public IP for bind_addr
  • Use public IP for advertise_addr

By sensible, I mean setting the 2 wan attributes together, etc.

One approach could be to create another datacenter for the client account and join the 2 with consul join -wan but that’s not what I want to do.

Is there an option to join a client outside of the VPC to a consul mesh without creating another datacenter?