https://github.com/datawire/envoy-steps
Envoy Step by Step
https://github.com/datawire/envoy-steps
Last synced: 6 months ago
JSON representation
Envoy Step by Step
- Host: GitHub
- URL: https://github.com/datawire/envoy-steps
- Owner: datawire
- License: apache-2.0
- Created: 2017-02-13T21:40:41.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2020-11-14T13:59:55.000Z (over 5 years ago)
- Last Synced: 2025-03-21T03:23:23.951Z (over 1 year ago)
- Language: Python
- Size: 43.9 KB
- Stars: 75
- Watchers: 5
- Forks: 36
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-cloud-native - envoy-steps - Envoy Step by Step. (Tutorials & Learning)
README
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:
1. [minikube](https://github.com/kubernetes/minikube)
2. [envoy](https://lyft.github.io/envoy/)
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.