  We present the architecture of a cloud native version of IBM Streams, with
Kubernetes as our target platform. Streams is a general purpose streaming
system with its own platform for managing applications and the compute clusters
that execute those applications. Cloud native Streams replaces that platform
with Kubernetes. By using Kubernetes as its platform, Streams is able to
offload job management, life cycle tracking, address translation, fault
tolerance and scheduling. This offloading is possible because we define custom
resources that natively integrate into Kubernetes, allowing Streams to use
Kubernetes' eventing system as its own. We use four design patterns to
implement our system: controllers, conductors, coordinators and causal chains.
Composing controllers, conductors and coordinators allows us to build
deterministic state machines out of an asynchronous distributed system. The
resulting implementation eliminates 75% of the original platform code. Our
experimental results show that the performance of Kubernetes is an adequate
replacement in most cases, but it has problems with oversubscription,
networking latency, garbage collection and pod recovery.
