This is an example project to try Moleculer with Docker and Kubernetes.
docker run -e SERVICES=services -p 3000:3000 moleculer/demo
In this case you should also start a transporter, e.g. NATS.
docker run -d -e SERVICEDIR=services -e SERVICES=greeter moleculer/demo
docker run -d -e SERVICEDIR=services -e SERVICES=products moleculer/demo
docker run -d -e SERVICEDIR=services -e SERVICES=api -p 3000:3000 moleculer/demo
This command starts all services in individual containers, a NATS server as transporter, a MongoDB server & Traefik as reverse proxy.
docker-compose up -d
This command starts all services in individual containers, a NATS server as transporter, a MongoDB server & Traefik as reverse proxy.
docker stack deploy -c docker-compose.yml moleculer
This command starts all services in individual pods, a NATS server as transporter, a MongoDB server and register an ingress for API service via http://moleculer.127.0.0.1.nip.io/ URL.
kubectl apply -f https://raw.githubusercontent.com/moleculerjs/docker-demo/master/k8s.yaml
Result
NAME READY STATUS RESTARTS AGE
pod/nats-6c745f949b-8g994 1/1 Running 0 23h
pod/moleculer-demo-api-6958b5475b-5qfxx 1/1 Running 0 4h37m
pod/moleculer-demo-greeter-6c875544b6-jbcjf 1/1 Running 0 4h37m
pod/moleculer-demo-greeter-6c875544b6-fx829 1/1 Running 0 4h37m
pod/moleculer-demo-api-6958b5475b-mwbc8 1/1 Running 0 4h36m
pod/mongo-555c4f494f-xjvx8 1/1 Running 0 3h15m
pod/moleculer-demo-products-784446b876-fdlrz 1/1 Running 0 3h8m
pod/moleculer-demo-products-784446b876-5qfrc 1/1 Running 0 3h8m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nats ClusterIP 10.43.193.134 <none> 4222/TCP 23h
service/api ClusterIP 10.43.121.57 <none> 3000/TCP 22h
service/mongo ClusterIP 10.43.80.140 <none> 27017/TCP 3h15m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nats 1/1 1 1 23h
deployment.apps/moleculer-demo-greeter 2/2 2 2 23h
deployment.apps/moleculer-demo-api 2/2 2 2 23h
deployment.apps/mongo 1/1 1 1 3h15m
deployment.apps/moleculer-demo-products 2/2 2 2 4h37m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nats-6c745f949b 1 1 1 23h
replicaset.apps/moleculer-demo-greeter-6c875544b6 2 2 2 4h37m
replicaset.apps/moleculer-demo-api-6958b5475b 2 2 2 4h37m
replicaset.apps/mongo-555c4f494f 1 1 1 3h15m
replicaset.apps/moleculer-demo-products-784446b876 2 2 2 3h8m
If you don't have installed ingress controller, execute this script to install Nginx Ingress Controller.
If you don't have installed storage controller, execute this script to install Longhorn Storage Controller.
- api: API Gateway services
- calc: Sample service with heavy mathematical calculation to test auto scaling of K8s.
- greeter: Sample service with
hello
andwelcome
actions. - products: Sample DB service with MongoDB if
process.env.MONGO_URI
is defined, otherwise with NeDB.
In case of Docker or Docker Compose
export HOSTNAME=127.0.0.1:3000
In case of Kubernetes
export HOSTNAME=moleculer.127.0.0.1.nip.io
Call the greeter.hello
action
curl http://$HOSTNAME/api/hello
Call the greeter.welcome
action with params
curl http://$HOSTNAME/api/greeter/welcome?name=Moleculer
Create a product item
curl -X POST -H "Content-Type: application/json" -d '{"name": "Samsung Galaxy S10", "category": "phones", "price": 299.99, "quantity": 10}' http://$HOSTNAME/api/products
List all products
curl http://$HOSTNAME/api/products
- Port forwarding the NATS service port
kubectl port-forward --address 0.0.0.0 service/nats 4222
If you have firewall, don't forget to allow this port.
- Connect to the deployed application from Moleculer CLI
moleculer connect nats://<YOUR-CLUSTER-IP-ADDRESS>:4222
The deployment script contains a HorizontalPodAutoscaler definition for the calc
service. It scales the number of calc
service pod between 2 and 5 by CPU usages.
Benchmark the calc.pi
action to increase the CPU usages to trigger the K8s Horizontal Pod Autoscaler:
ab -c 5 -n 500 http://moleculer.127.0.0.1.nip.io/api/pi
This project is available under the MIT license.
Copyright (c) 2016-2020 MoleculerJS