Elixir and kubernetes - is it common for production apps to have their deployment processes in a container environment?

Hey everyone!

When I read articles about production elixir applications they all talk about deployment directly in ‘‘machines’’ (1 instance per machine) I’d like to understand if that is a real thing or is it common to production elixir applications have their deployment processes in a container enviroment and if this kind of deployment boosts elixir somehow once that we could have like N instances of a application distributed across Y real machines in our cluster or we don’t really have a real gain by doing that.

3 Likes

Hi,
Yes it is common to deploy elixir apps with docker, especially when the app is stateless (ex CRUD apps, with a db layer). If we are making releases, then dockerzing is a recommended approach. Also if the organization is already using orchestration tools like k8s, then its good to leverage them too. If the elixir app is statefull then we can even leverage distributed elixir functionalities by clustering the k8s nodes. So overall we could get best of both worlds.

4 Likes

This talk is quite useful: ElixirConf 2018 - Docker and OTP Friends or Foes - Daniel Azuma - YouTube

6 Likes

Thanks, definitely gonna watch it!

I watched the video, but it seems a bit overkill to have a whole set of distributed supervisors, CRDTs and registries so erlang processes can be killed and redeployed in a new container.

For the Tanx, it seems that it can just rely on a Redis cluster to store states instead of keeping all of state in OTP. That would simplify things quite a bit.

Do you use (or have you used) that kind of setup in production?

I have, and it works just fine. Distributed Elixir is challenging though, but lots of fun.

As for Redis, sure. Postgres would work as well. In my app we actually did state handoff through Postgres.

I think the point is, if you want to stick to OTP with as few dependencies as possible - you can.

I prefer Kubernetes over OTP in some cases…

For example, I don’t bother with hot code reloading; I let Koob take care of deployments and request draining.

I also prefer things like Nats for a messaging plane instead of distributed Elixir.

I think it makes for better polyglot systems, vs some OTP things bind you to the language/VM.

1 Like