akka-microservice-example
akka-microservice-example copied to clipboard
Kubernetes Deployment of two separate akka microservices which communicate via gRPC
akka-microservice-sample
This is a akka kubernetes deployment example. It runs on minikube and uses the newest akka-management release and the sbt native packager for container creation.
- A backend service which starts a akka cluster on 3 nodes (pods) and counts the greeting count for a given name
- A frontend service which uses akka discovery to get the gRPC endpoint of service 1 to ask the cluster

Quickstart
Steps to run the demo cluster:
- install minikube
brew cask install minikube - configure docker eng in terminal
eval $(minikube docker-env) - go to k8s folder
cd k8s - run build script
./build-images.sh - configure kubernetes cluster roles before first run
kubectl apply -f rbac-init.yaml - run service 1 (backend) first
kubectl apply -f service1.yaml - run service 2 (frontend)
kubectl apply -f service2.yaml - get your minikube ip
minikube ip - get the service port of your NodePort Service 2
kubectl get services - call you minikube ip on the given NodePort with your favorite browser - The http result should be
Service 2 is ok- if this doesn't work use
minikube service service2which shows the URL you have to use and opens your favourite browser - The http result in the browser should beService 2 is ok
- if this doesn't work use
- call the get path greet with a name
e.g http://192.168.99.100:32462/greet/innFactory- The http result should be something likeHello innFactory - The actorsystem greeted you 1 times!
Update service
Example for service1:
- make your code changes
- in the file
service1/build.sbtupdate theversion in Dockervalue to0.2for example - go to k8s folder
cd k8s - run build script
./build-images.sh - rollout new version
kubectl set image deployment/service1 service1=innfactory-test/service1:0.2 - check the status of the deployment with
kubectl get pods
Monitoring and Tracing
There are 3 branches with different tools for monitoring and tracing:
- branch
lightbend_monitoring: Simple Monitoring example with Lightbend Monitoring.- folder
lightbend_monitoringin thelightbend_monitoringbranch.
- folder
- branch
kamon_jaeger: Monitoring example with Kamon and tracing example with Jaeger.- folder
monitoring-and-tracingin thekamon_jaegerbranch.
- folder
- branch
istio: Example Istio integration.- folder
istioin theistiobranch.
- folder
Notes
ServiceDiscovery is made with akka discovery and a bit dirty, because it does not use the cluster ip of service 1 for the grpc calls. It just tooks the first resolution address from the pod list with selector app=service1 and blocks service2 with Await. For a production use-case this should be changed and the the grpc client binding should use the result of the kubernetes-api-discovery from future and not from Await with hard .get!!!. Logging is also very dirty and there are a lot of println.
Blogpost
Contributors
innFactory - Cloud Engineering Experts - akka, grpc, k8s, kubernetes