## kube_dist
[![Build Status](https://travis-ci.org/seniverse/kube_dist.svg?branch=master)](https://travis-ci.org/seniverse/kube_dist)
[![hex.pm version](https://img.shields.io/hexpm/v/kube_dist.svg)](https://hex.pm/packages/kube_dist)
[![hex.pm downloads](https://img.shields.io/hexpm/dt/kube_dist.svg)](https://hex.pm/packages/kube_dist)
![hex.pm license](https://img.shields.io/hexpm/l/kube_dist.svg)
![GitHub top language](https://img.shields.io/github/languages/top/seniverse/kube_dist.svg)
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.
### Installation
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
```
### License
kube_dist is released under Apache 2 License. Check [LICENSE](./LICENSE) file for more information.