blob: e0536a84f37182e0bdcf10e33f6dfe9495d2f7fd [file] [log] [blame] [view]
# Kubernetes example
This example demonstrates how to deploy a stateful function application
written in Python to Kubernetes.
## Prerequisites
* Helm
* Kubernetes cluster
* Kafka
* [StateFun distribution](https://github.com/apache/flink-statefun#build)
* [StateFun Python SDK](https://github.com/apache/flink-statefun/blob/master/statefun-python-sdk/build-distribution.sh)
## Overview
This examples create a stateful function application,
that consumes `LoginEvent`s from a `logins` Kafka topic,
and produces `seen` count per user, into the `seen` Kafka topic.
The main example components contains:
- [main.py](main.py) - A StateFun python function that implements the main logic
- [module.yaml](module.yaml) - defines the ingress, egress and the remote function specification.
- [resources](resources) - a Helm chart, templates to deploy StateFun cluster and the remote python worker to k8s.
- [build-example.sh](build-example.sh) - Builds StateFun Docker images and k8s resources to deploy it.
## Setup
### Create Kafka Topics:
This example consumes `LoginEvent`s from the `logins` topic, and produces `SeenCount` to
the `seen` topic
```
./kafka-topics.sh --create --topic logins --zookeeper <zookeeper address>:2181 --partitions 1 --replication-factor 1
./kafka-topics.sh --create --topic seen --zookeeper <zookeeper address>:2181 --partitions 1 --replication-factor 1
```
### update [module.yaml](module.yaml)
Make sure that your `module.yaml` ingress/and egress sections point to your
Kafka cluster.
```
ingresses:
- ingress:
...
spec:
address: kafka-service:9092
...
egresses:
- egress:
...
spec:
address: kafka-service:9092
```
### Build the Docker images and the k8s resource yamls.
This examples creates two different Docker images, one for the `Python` remote
worker (`k8s-demo-python-worker`) and one for the statefun cluster (`k8s-demo-statefun`).
- If you have a remote docker registry (i.e. `gcr.io/<project-name>`) make sure
to update [resources/values.yaml](resources/values.yaml) relevant `image: ` sections.
- Modify [resources/values.yaml](resources/values.yaml) and set the value of `checkpoint.directory`
to a filesystem / object store. For example
```
checkpoint:
dir: gcs://my-project/my-bucket
```
Assuming the all prerequisites where completed run:
```build-example.sh```
This should create the Docker images and generate a `k8s-demo.yaml` file.
## Deploy
* `kubectl create -f k8s-demo.yaml`
* `kubectl create -f python-worker-deployment.yaml`
* `kubectl create -f python-worker-service.yaml`
## Generate events
Run:
```
pip3 install kafka-python
python3 event_generator.py --address <kafka address> --events 1000
```
This would generate 1,000 login events into the `logins` topic