Deploying to production systems
To deploy your Cloudstate stateful services, you will need a Kubernetes cluster, and optionally Istio. Cloudstate provides an operator for deploying Cloudstate services.
While Cloudstate doesn’t require Istio, a service mesh is recommended. The reason for this is to support load balancing - Kubernetes ClusterIP based load balancing balances at the TCP connection level, and so works when load is spread across many connections, however HTTP/2 clients, such as those used by most gRPC clients, typically only make a single TCP connection and then use HTTP/2 multiplexing to make concurrent requests. The result is that all the load will go to whichever node the client connects to first.
Service meshes that can do HTTP/2 stream load balancing overcome this by fanning out HTTP/2 streams in a single connection to multiple connections to different nodes. Istio is one such service mesh that supports this. Other service meshes may be possible to use with Cloudstate, but haven’t been tested, one challenge with the Cloudstate Reference Implementation that service meshes present is that to form a cluster, the nodes must be allowed to communicate with each other without going through the service mesh. Istio provides some annotations that allow bypassing the service mesh to be configured, which Cloudstate uses. Other service meshes may or may not support this.
Cloudstate requires a minimum Istio version of 1.2.0, prior versions don’t offer the necessary annotations to bypass the service mesh, hence cluster formation is not possible.