Erlang Distribution inside Kubernetes Cluster
With kube_dist
properly configured, name of erlang node is set to ${CONTAINER_NAME}@${POD_NAME}
.
Moreover, you may use Kubernetes's Service as your process registry.
gen_server:call({via, kube_endpoints, ServiceName}, Request)
Request would be sent to one randomly chosen pod listed in the endpoints list. If ServiceName
is an atom, it would be sent to the container with same name. Or ServiceName
could a tuple of two atom {ServiceName, ContainerName}
, it would be sent to the container which name is specified in the second element of the tuple.
add kube_dist
dependency to your project's rebar.config
{deps, [kube_dist]}.
set start_distribution
to false
and enable httpc
service of inets
[
{kernel,
[{start_distribution, false}]
},
{inets,
[{services, [{httpc, []}]}]
}
].
disable epmd daemon and set epmd_module
to kube_epmd
and proto_dist
to kube_tcp
-start_epmd false
-epmd_module kube_epmd
-proto_dist kube_tcp
grant permission of get
to pods/status
and watch
to endpoints
to the service account of the pods
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: erlang-node
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: erlang-node
rules:
- apiGroups: [""]
resources: ["pods/status"]
verbs: ["get"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["watch"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: erlang-node
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: erlang-node
subjects:
- kind: ServiceAccount
name: erlang-node
and set environment variable CONTAINER_NAME
to container's name and add a distribution port named ${CONTAINER_NAME}-dist
spec:
serviceAccountName: erlang-node
containers:
- name: foo
env:
- name: CONTAINER_NAME
value: foo
ports:
- containerPort: 4370
name: foo-dist
kube_dist is released under Apache 2 License. Check LICENSE file for more information.