ops.json in each
service that should be part of the cluster.
This page assumes your service is already deploying on LocalOps. If you’re still packaging your app, start with the
Elixir/Phoenix guide.
Enable it
ops.json
What LocalOps injects
Two environment variables are injected into your pods:app-services is the Kubernetes namespace all your services run in within the environment.
Wire up libcluster
Read the DNS name from the environment — don’t hardcode it.config/runtime.exs
Your release config stays yours
LocalOps does not setRELEASE_DISTRIBUTION, RELEASE_NODE, or RELEASE_COOKIE. Set these yourself — typically
RELEASE_DISTRIBUTION=name with RELEASE_NODE=myapp@${POD_IP}. POD_IP is already injected into every service, so you
can reference it directly.
Things to know
It takes effect on your next build
LocalOps snapshotsops.json when it builds your service, so redeploying your current image won’t pick up a newly added
beam_cluster_id. Push the change and let it build.
Preview environments get their own cluster
A preview environment forms its own separate cluster and never joins your production cluster. This is deliberate — otherwise a preview would share your cookie and be able to call into live nodes. See ephemeral databases and services for pull request previews.Job and cron services join too
Job and cron services join the cluster as well, so scheduled and one-off tasks can call into the running cluster. If you’d rather they stayed out, just leavebeam_cluster_id out of those services’ ops.json.
Processes with their own image stay out
Aprocesses entry that specifies its own image stays out of
the cluster, since it isn’t running your app.
Verify it worked
Get a shell on a running pod (see Shell into a pod), open a remote console, and run:LOPS_BEAM_CLUSTER_NAME.
To watch inter-node distribution traffic over time, see the
Erlang & Elixir instrumentation guide — the Erlang-Distribution Grafana
dashboard it links is built for exactly this.