Deploying

Deploying to Docker containers

You can use both Akka remoting and Akka Cluster inside Docker containers. Note that you will need to take special care with the network configuration when using Docker, described here: Akka behind NAT or in a Docker container

You can look at the Cluster with docker-compse example project Cluster with docker-compose example project to see what this looks like in practice.

For the JVM to run well in a Docker container, there are some general (not Akka specific) parameters that might need tuning:

Resource constraints

Docker allows constraining each containers’ resource usage.

Memory

You may want to look into using -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap options for your JVM later than 8u131, which makes it understand c-group memory limits. On JVM 10 and later, the -XX:+UnlockExperimentalVMOptions option is no longer needed.

CPU

For multi-threaded applications such as the JVM, the CFS scheduler limits are an ill fit, because they will restrict the allowed CPU usage even when more CPU cycles are available from the host system. This means your application may be starved of CPU time, but your system appears idle.

For this reason, it is best to avoid --cpus and --cpu-quota entirely, and instead specify relative container weights using --cpu-shares instead.

Deploying to Kubernetes

Cluster bootstrap

To take advantage of running inside Kubernetes while forming a cluster, Akka Cluster Bootstrap helps forming or joining a cluster using Akka Discovery to discover peer nodes. with the Kubernetes API or Kubernetes via DNS.

You can look at the Cluster with Kubernetes example project to see what this looks like in practice.

Resource limits

To avoid CFS scheduler limits, it is best not to use resources.limits.cpu limits, but use resources.requests.cpu configuration instead.

Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.