diff --git a/config/runtime.exs b/config/runtime.exs index 2e5a8f4..146cc7f 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -153,15 +153,14 @@ if config_env() == :prod do # Configure libcluster topology based on environment if cluster_enabled do - # Use DNSSRV strategy for StatefulSet clustering + # Use DNS strategy with headless service for node discovery config :libcluster, topologies: [ k8s: [ - strategy: Cluster.Strategy.Kubernetes.DNSSRV, + strategy: Cluster.Strategy.Kubernetes.DNS, config: [ - service: "aprs-headless", + service: "aprs-headless.aprs.svc.cluster.local", application_name: "aprsme", - namespace: "aprs", polling_interval: 5_000 ] ] diff --git a/k8s/deployment.yaml b/k8s/deployment.yaml index 2f579fe..0096eed 100644 --- a/k8s/deployment.yaml +++ b/k8s/deployment.yaml @@ -114,6 +114,10 @@ spec: valueFrom: fieldRef: fieldPath: metadata.name + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP - name: PORT value: "4000" - name: PHX_HOST diff --git a/rel/env.sh.eex b/rel/env.sh.eex index 0d7d2d7..11ca8d8 100644 --- a/rel/env.sh.eex +++ b/rel/env.sh.eex @@ -18,10 +18,10 @@ # RELEASE_DISTRIBUTION must be "sname" (local), "name" (distributed) or "none". export RELEASE_DISTRIBUTION=name -# Check if we're in Kubernetes (POD_NAME will be set) -if [ -n "$POD_NAME" ]; then - # Use Kubernetes pod name and headless service for clustering - export RELEASE_NODE=${RELEASE_NODE:-<%= @release.name %>@${POD_NAME}.aprs-headless.aprs.svc.cluster.local} +# Check if we're in Kubernetes (POD_IP will be set) +if [ -n "$POD_IP" ]; then + # Use pod IP for Erlang distribution — matches libcluster DNS strategy + export RELEASE_NODE=${RELEASE_NODE:-<%= @release.name %>@${POD_IP}} else # Fallback to Dokku naming for non-Kubernetes deployments export RELEASE_NODE=<%= @release.name %>@${DOKKU_APP_NAME:-aprsme}.web.${DOKKU_APP_INSTANCE:-1}