Awesome
Envoy Step By Step
This is a simple example of how one can use Envoy to create scalable Flask apps.
The Tools
Tools we'll be using:
You'll need to get Minikube installed before starting. You do not need to install envoy
though! It will magically Just Happen as we build containers out.
The Process
We're going to work with a very, very simple application: a simple Flask app that allows creating users, then reading them back.
Step 0: Minikube
First we need to start Minikube. On a Mac for your first startup, you need to decide if you're going to use the VirtualBox driver for Minikube, or the xhyve
driver. I use xhyve
:
minikube start --vm-driver xhyve
Once minikube is started, run
eval $(minikube docker-env)
to get hooked up to the Minikube Docker daemon (which we'll be using when we build Docker images later).
To prep everything for Minikube, run
bash prep.sh -
Should you want to clean everything up when done, use
bash clean.sh
Step 1: Basic Flask App
Start the Postgres and usersvc
containers:
bash up.sh postgres
bash up.sh usersvc
and then you should be able to check things out:
curl $(minikube service --url usersvc)/user/health
should show you something like
{
"hostname": "usersvc-1941676296-zlrt2",
"msg": "user health check OK",
"ok": true,
"resolvedname": "172.17.0.10"
}
Next up we can try saving and retrieving a user:
curl -X PUT \
-H "Content-Type: application/json" \
-d '{ "fullname": "Alice", "password": "alicerules" }' \
$(minikube service --url usersvc)/user/alice
This should give us a user record for Alice, including her UUID but not her password:
{
"fullname": "Alice",
"hostname": "usersvc-1941676296-zlrt2",
"ok": true,
"resolvedname": "172.17.0.10",
"uuid": "44FD5687B15B4AF78753E33E6A2B033B"
}
and we should be able to read the user back (sans password again) with
curl $(minikube service --url usersvc)/user/alice
Step 2: Enter Envoy
Start the edge-envoy
container:
bash up.sh edge-envoy
then drop the usersvc
container and replace it with the usersvc2
container:
bash down.sh usersvc
bash up.sh usersvc2
and now going through Envoy should work:
curl $(minikube service --url edge-envoy)/user/health
curl $(minikube service --url edge-envoy)/user/alice
Step 3: Scaling the App
We can scale the app pretty simply:
kubectl scale --replicas=3 deployment/usersvc
but that will reveal that the DNS discovery we've been using so far won't work. We need to bring Envoy's Service Discovery Service into play:
bash up.sh usersvc-sds
bash down.sh edge-envoy
bash up.sh edge-envoy2
and once that's done, you'll be able to see requests cycling through all the usersvc
endpoints.