SlideShare a Scribd company logo
1 of 106
Download to read offline
Building resilient microservices
with Kubernetes, Docker, and
Envoy
Phil Lombardi & Rafael Schloming
datawire.io | https://d6e.co/2hZ0MQv
Before we begin ...
● You’re running latest version of Docker on your laptop
● You’ve created an account on hub.docker.com
● You’ve set up a working environment (we’ve pre-installed everything for you)
○ Ubuntu Docker image
○ git clone https://github.com/datawire/shopbox
○ cd shopbox
○ ./shopbox.sh
● You’ve downloaded some key Docker images
○ docker pull datawire/ambassador-envoy
○ docker pull prom/prometheus
○ docker pull python:3-alpine
● You have your favorite terminal & text editor ready to go!
Go to the presentation here: https://d6e.co/2hZ0MQv
2
datawire.io | https://d6e.co/2hZ0MQv
About us
● Worked on microservices for past 2.5 years, both with our own cloud services and
with consulting
● Datawire builds open source tools for developers building microservices, based on
our own experiences
● Run microservices.com, which has talks from dozens of practitioners on
microservices
3
datawire.io | https://d6e.co/2hZ0MQv
Introduction: Microservices,
Kubernetes, Docker, Envoy
20 minutes Presentation
Core Concepts of Docker &
Kubernetes
70 minutes Workshop
Break around 3pm 30 minutes
Building & deploying a
microservice in production
60 minutes Workshop
Wrap-up 20 minutes Presentation / Q&A
Feedback 5 minutes
Our schedule for today
4
datawire.io | https://d6e.co/2hZ0MQv
Our focus today
1. Communicate the key concepts
2. Minimize time spent on the mechanics, since they’re impossible to remember until
you do them often enough
3. Try to give you a mental model to understand the different (overwhelming) choices
in the Kubernetes ecosystem, and how to start.
4. If you don’t understand the purpose of a specific exercise, please ask!
Also …
Minikube is a popular choice for these trainings, since you can run things locally. But
minikube is a big performance hog and isn’t quite as realistic with some of the things
we’re doing, so we’re going to try to use the Internet. (We have done some work to
minimize bandwidth consumption.)
5
Microservices
How do you ship better (cloud) software
faster?
Microservices. (Multiple, asynchronous launches.)
Take the standard development process:
Code
(Dev)
Test
(QA)
Prod
(Ops)
Release
(Release)
Define
(Product)
1
0
… and make it distributed.
> No central release, test, dev cycle. Each person/team operates
an independent development process.
> Team needs to have the skills / knowledge to operate all
aspects of the development process.
Service A Service B Service C
1
1
Microservices is a distributed
development process for cloud-native
software.
> Not an architecture! Your architecture supports
the process, and not the other way around.
1
2
How do you adopt a distributed
development process?
Start by creating an independent process!
(with a from-scratch API service)
New serviceMonolith
independent
process!!
(think spinning off a
developer or dev team)
1
4
1. Self-sufficiency. Each team needs to be self-sufficient in all aspects
of the development cycle to avoid bottlenecks.
2. Safety. Since it’s hard to be an expert in every area of the
development, need to insure an oops isn’t catastrophic.
Give the developer / dev team the ability to
SUCCESSFULLY operate independently.
The definition of self-sufficient safety varies based on
the evolution of your microservice.
Stage 1:
Prototyping
Stage 2:
Production
Stage 3: Internal
service
consumption
Service doesn’t crash
Workflow for prod
deploys, monitoring,
& debugging
No cascade failures
Productive dev
environment
Transparently add
service resilience
No negative user
impact
Self
sufficiency
Safety
1
6
Together, Kubernetes, Docker, and Envoy give your developers the
basic infrastructure for self-sufficiency & safety.
17
1. Microservices is a distributed development workflow
that helps you go faster.
2. An efficient workflow for your team provides
self-sufficiency and safety.
3. The Kubernetes ecosystem, Docker, and Envoy provide
the foundational components you need to build that
workflow.
Docker, Kubernetes, and Envoy
Core Concept 1: Containers
datawire.io | https://d6e.co/2hZ0MQv
What is a container?
● Lightweight Linux environment. It is a form of virtualization… but very different
from a full virtual machine.
● Immutable, deployable artifact.
● Runnable.
● Popularized by Docker but there are many runtime implementations (e.g. LXC,
Rkt).
20
datawire.io | https://d6e.co/2hZ0MQv
What is Docker?
● A tool, ecosystem and platform for building, pushing and
running containers.
● The most popular container runtime currently.
● Default container runtime in Kubernetes.
21
datawire.io | https://d6e.co/2hZ0MQv
Why Containers?
● Easy and fast to produce.
● Great way to isolate different components in a complex system.
● Ensures a reproducible runtime for your app along the dev -> build -> test -> prod
pipeline.
● Easy to share in a team or with external partners.
22
datawire.io | https://d6e.co/2hZ0MQv
Your Development Environment
23
datawire.io | https://d6e.co/2hZ0MQv
Let’s Get Started...
● We’ve built an Ubuntu container image for you
○ Includes all the client-side tools we’ll use for the training (e.g., kubectl)
● We’ll use Kubernaut for Kubernetes clusters
○ On-demand, ephemeral clusters (designed for CI … or training!)
● The container mounts a local directory into /workspace in
the image your files are synchronized with your laptop.
24
datawire.io | https://d6e.co/2hZ0MQv
Let’s Get Started...
Run the below commands in your terminal if you haven’t
already:
$ git clone https://github.com/datawire/shopbox
$ cd shopbox
$ ./shopbox.sh
Pre-configured dev environment with kubectl (with tab completion),
kubernaut, and various utilities we will use today.
25
datawire.io | https://d6e.co/2hZ0MQv
Back to containers ...
26
datawire.io | https://d6e.co/2hZ0MQv
Let’s build a service as a container
A simple web application: Quote of The Moment (“QOTM”).
● Requires Python
● Uses Flask
GET STARTED
$ git clone https://github.com/datawire/qotm-ws
$ cd /workspace/qotm-ws
27
datawire.io | https://d6e.co/2hZ0MQv
The Dockerfile
FROM python:3-alpine
MAINTAINER Datawire <dev@datawire.io>
WORKDIR /service
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . ./
EXPOSE 5000
ENTRYPOINT [“python3”, “qotm/qotm.py”]
28
datawire.io | https://d6e.co/2hZ0MQv
Let’s build it!
Run the below command to build the image (the trailing period on the below
command is required!):
$ docker build -t <your-docker-user>/qotm-ws:1 .
29
Each Docker image consists of layers. A layer is an ordered union of files
and directory changes to an image.
Because layers are cached, putting the parts of the Dockerfile least likely to
change first (e.g., the OS) can make a huge difference in build speed.
datawire.io | https://d6e.co/2hZ0MQv
What Just Happened?
1. Docker executed the instructions in the Dockerfile. Each command created a new
layer.
2. Docker composes an image from all the layers.
3. The docker engine pointed a named reference
<your-docker-user>/qotm-ws:1 at the final image.
30
datawire.io | https://d6e.co/2hZ0MQv
Tagging is Important and Useful
● Tags allow you to easily reference and reuse an image.
● You can create multiple tags to point at the same image which can be useful in
sharing contexts.
● Tags can be pushed to a Docker registry so other people can reuse your image!
31
datawire.io | https://d6e.co/2hZ0MQv
Run the image!
Images are an inert, immutable file. When you want to run an image, a container is
produced.
RUN THE IMAGE
$ docker run --rm -dit -p 5000:5000 <your-docker-user>/qotm-ws:1
# open another shell (that is *not* running shopbox)
$ curl localhost:5000
32
datawire.io | https://d6e.co/2hZ0MQv
Share the image
We’ve got an image running on your laptop, but you really want to share it -- with
Kubernetes, with your colleagues, with your family & friends ...
PUSH THE IMAGE
$ docker login
$ docker push <your-docker-user>/qotm-ws:1
33
You can see the image on your public Docker Hub account at
https://hub.docker.com.
datawire.io | https://d6e.co/2hZ0MQv
One last thing ...
Docker does a great job of running the container. Why can’t I just use Docker
everywhere?
WHAT HAPPENS IF WE CRASH?
$ curl localhost:5000/crash
$ curl localhost:5000
Uh oh … we need something that is a little bit smarter!
34
Core Concept 2: Kubernetes
datawire.io | https://d6e.co/2hZ0MQv
What is Kubernetes?
● Runs massive numbers of containers based on
lessons learned by Google.
● Schedules and runs all kinds of containers
○ long-lived (e.g. services)
○ short-lived (e.g. pre-launch hooks, cronjobs etc)
● Kubernetes can be thought of as a Distributed OS or process manager
36
datawire.io | https://d6e.co/2hZ0MQv
The Office Tower Analogy
Your product is the building
as a whole.
Your business logic is
the offices and workers
37
datawire.io | https://d6e.co/2hZ0MQv
The Office Tower Analogy
Kubernetes provides the
infrastructure to build your
app around.
38
It is the foundational app
platform for your team to
build your businesses apps
around.
datawire.io | https://d6e.co/2hZ0MQv
Kubernetes Architecture
Types of nodes: Masters and Workers
39
Docker Kubelet
Kubeproxy
Kubernetes Node
Docker Kubelet
Kubeproxy
Kubernetes Node
Docker Kubelet
Kubeproxy
Kubernetes Node
Etcd API Server
Controller Manager
Kubernetes Master
Scheduler
datawire.io | https://d6e.co/2hZ0MQv
4 basic concepts
40
Container packages your code in
a portable way
Pod gives your code a temporary
home inside the cluster
Deployment keeps your code
running, even when it is updated
Service provides a stable address
that can reach many pods
datawire.io | https://d6e.co/2hZ0MQv
Your Development Environment
41
datawire.io | https://d6e.co/2hZ0MQv
Kubernaut
● You can get your own Kubernetes cluster easily with Google, Microsoft etc.
● Or you can install Kubernetes yourself in AWS
● To simplify things, we’re going to let you borrow some of our Kubernetes clusters
:)
● We’re going to use Kubernaut which provides on-demand K8S clusters for our
internal CI/CD systems.
42
datawire.io | https://d6e.co/2hZ0MQv
Kubernaut
Visit https://kubernaut.io/token
$ kubernaut set-token <TOKEN>
$ kubernaut claim
$ export KUBECONFIG=${HOME}/.kube/kubernaut
43
datawire.io | https://d6e.co/2hZ0MQv
Back to Kubernetes
44
datawire.io | https://d6e.co/2hZ0MQv
Let’s see if there’s anything running!
$ kubectl get services
$ kubectl get pods
45
datawire.io | https://d6e.co/2hZ0MQv
Let’s run our container
$ kubectl run qotm-ws --image=<your-docker-user>/qotm-ws:1
$ kubectl get pods
We see a pod! How do we talk to the pod?
46
Pod gives your code a temporary
home inside the cluster
datawire.io | https://d6e.co/2hZ0MQv
We need to talk to the pod!
We can tell Kubernetes to forward requests from outside the cluster to the pod, and
vice versa.
$ kubectl port-forward <pod-name> 5000 &
$ curl localhost:5000
47
datawire.io | https://d6e.co/2hZ0MQv
What happens when a pod crashes?
48
Let’s crash the pod again.
$ curl localhost:5000/crash
$ curl localhost:5000
Note: don’t run this loop too often. If you crash your server too frequently, Kubernetes
will assume it is having deeper problems, and will introduce a delay before attempting
to restart.
datawire.io | https://d6e.co/2hZ0MQv
What just happened?
The Kubernetes pod automatically restarted the container!
● By default, Kubernetes will detect failures and auto-restart (with exponential
backoff, capped at 5 minutes)
● Kubernetes also lets you extend this with custom liveness and readiness probes
49
datawire.io | https://d6e.co/2hZ0MQv
Managing pods
● What if we want to update the software on our pod?
● What if we want more than one pod running, for availability or scalability
reasons?
50
Deployment keeps your code
running, even when it is updated
datawire.io | https://d6e.co/2hZ0MQv
Deployments
Kubernetes provides extensive control over how pods are run. These are specified by a deployment object.
51
datawire.io | https://d6e.co/2hZ0MQv
Let’s try using a deployment
52
$ kubectl get pods
$ kubectl delete deployment qotm-ws
$ kubectl apply -f kubernetes/qotm-deployment.yaml
$ kubectl get pods
We see we’re now running three pods!
To save bandwidth, this
deployment.yaml points to a
prebuilt QOTM image we’ve
already uploaded. Feel free to
edit it to point to your Docker
repo.
datawire.io | https://d6e.co/2hZ0MQv
How do we talk to these pods?
It would be silly to set up port-forwards to each pod … and load balancing would be
nice.
53
Service provides a stable address
that can reach many pods
datawire.io | https://d6e.co/2hZ0MQv
Service
Kubernetes provides extensive control over how pods are run. These are specified in a service file.
54
datawire.io | https://d6e.co/2hZ0MQv
Services Illustrated
A Service becomes a DNS A record pointing the pod IP addresses
55
IP: 100.124.71.175
blog-0
kube-worker-0
IP: 100.124.71.176
blog-1
kube-worker-1
Kubernetes cluster
blog DNS (short) => blog
DNS (long) => blog.default.cluster.local
datawire.io | https://d6e.co/2hZ0MQv
Service Flavors
● Many different flavors of “Service” in Kubernetes
○ ClusterIP
○ NodePort
○ LoadBalancer
○ ExternalName - often forgotten, but very useful!
56
datawire.io | https://d6e.co/2hZ0MQv
Let’s try using a service
57
$ cd /workspace/qotm-ws
$ kubectl apply -f kubernetes/qotm-service.yaml
$ kubectl get services # get qotm port highlighted below
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.96.0.1 <none> 443/TCP 2d
qotm 10.107.109.252 <nodes> 80:<port>/TCP 6s
$ kubectl cluster-info # get cluster hostname
$ curl http://<cluster-hostname>:<port>
# or use this script for convenience:
$ curl $(url.sh qotm-ws)
datawire.io | https://d6e.co/2hZ0MQv 58
Container packages your code in
a portable way
Pod gives your code a temporary
home inside the cluster
Deployment keeps your code
running, even when it is updated
Service provides a stable address
that can reach many pods
Core Concept 3: Updates
datawire.io | https://d6e.co/2hZ0MQv
Let’s try making a change in qotm/qotm.py:
$ cd /workspace/qotm-ws
Search for the following line:
__version__ = “1”
And change the version number from 1 to 2, so it reads:
__version__ = “2”
Now, we need to build a new docker image, with a new tag:
$ docker build -t <your-docker-user>/qotm-ws:2 .
$ docker push <your-docker-user>/qotm-ws:2
What if I want to update my code?
60
datawire.io | https://d6e.co/2hZ0MQv
Edit kubernetes/qotm-deployment.yaml, and replace qotm-ws:1 with qotm-ws:2
Now re-apply the deployment:
$ cd /workspace/qotm-ws
$ kubectl apply -f kubernetes/qotm-deployment.yaml
Now run kubectl get pods with the watch option and you will see your rollout in
progress:
$ kubectl get pods -w
You should see your new pods spin up. Now, see version 2 running:
$ curl $(url.sh qotm-ws)
Now let’s rollout our new version
61
datawire.io | https://d6e.co/2hZ0MQv
The source -> Kubernetes workflow
62
A
Build a container image that contains your code,
dependencies, and configuration, based on the Dockerfile.
B Tag the image.
C Push image to a container registry.
D Update Kubernetes manifest with tag.
E Apply Kubernetes manifest to cluster.
F Repeat for all dependencies.
datawire.io | https://d6e.co/2hZ0MQv
Forge (https://forge.sh)
63
● Define & run multi-container apps in
Kubernetes
○ Do this consistently, regardless of
your target Kubernetes
environment
○ Do this from source code
● To “forge-ify” a service:
○ service.yaml
○ Templated Kubernetes manifest
datawire.io | https://d6e.co/2hZ0MQv
The QOTM service, part 2
● In the k8s/ directory, there’s a templated Kubernetes manifest that Forge will
use
○ Jinja2 template
○ Uses two values: build.name & build.images[“Dockerfile”]
● These values are supplied by forge and can be customized via the service.yaml
file, e.g.:
○ name: qotm-ws
64
datawire.io | https://d6e.co/2hZ0MQv
Now, we can automatically deploy
# delete the original services
$ kubectl delete svc qotm-ws
$ kubectl delete deploy qotm-ws
# First, setup forge (this is one time only)
$ cd /workspace # make sure you’re in /workspace
$ forge setup # configure forge to deploy your source
# Now, deploy from source to cluster
$ cd /workspace/qotm-ws
$ forge deploy # deploy qotm from source to cluster
65
datawire.io | https://d6e.co/2hZ0MQv
Let’s see what it did!
Run
$ kubectl get services
$ kubectl get deployments
$ kubectl get pods
You should see a:
● qotm-ws-stable service,
● qotm-ws-stable deployment
● and several qotm-ws-stable-<???> pods:
66
datawire.io | https://d6e.co/2hZ0MQv
What’s up with the -stable suffix?
● Forge has a concept of profiles
● Profiles allow multiple versions of the same code to be deployed into the same
cluster
● More about this in the next section
67
datawire.io | https://d6e.co/2hZ0MQv
Summary
Kubernetes:
● Powerful building blocks
● Understands containers, *not* source code
Kubernetes + Docker:
● Builds source -> containers
● Doesn’t understand versioning, environments, or kubernetes
Kubernetes + Docker + Forge (or your own script):
● Source -> cluster in one command
● Automatically handles versioning and multiple environments (profiles)
68
Let’s take a break!
(hopefully it’s around 3pm)
Core Concept 4: Envoy / L7
datawire.io | https://d6e.co/2hZ0MQv
Setup
71
$ cd /workspace
$ git clone https://github.com/datawire/ambassador-canary
$ cd ambassador-canary
$ forge deploy
The definition of self-sufficient safety varies based on
the evolution of your microservice.
Stage 1:
Prototyping
Stage 2:
Production
Stage 3: Internal
service
consumption
Service doesn’t crash
Workflow for prod
deploys, monitoring,
& debugging
No cascade failures
Productive dev
environment
Transparently add
service resilience
No negative user
impact
datawire.io | https://d6e.co/2hZ0MQv
Measuring user impact is a L7 problem!
● What is L7?
○ We really mean application-level protocols
○ HTTP, gRPC, Thrift, redis://, pgsql://, ...
● In a microservices architecture, your services are an L7 network
● For you to write a service that talks to your users and/or other services, you need
to understand & manage L7
73
datawire.io | https://d6e.co/2hZ0MQv
L7 is now a development concern
● Everything has always been wired together with L7
● But in development, you could leave it (mostly) to operations
● Now, with microservices, L7 is a development concern as well:
○ More services
○ More remote dependencies
○ Greater release frequency
● So what does this mean for you?
74
datawire.io | https://d6e.co/2hZ0MQv
You: stuck in the middle
● Users consume your service over L7
● You consume your dependencies over L7
● Literally everything in this picture is a source of failure
75
Layer 7
datawire.io | https://d6e.co/2hZ0MQv
All your distributed systems problems are amplified
● Single points of failure
● Catastrophic failure modes
● Cascade failures
76
datawire.io | https://d6e.co/2hZ0MQv
In plain terms
77
Layer 7
Users can
DDOS you
Your dependencies can
fail
Your hardware can failYour hardware can fail
You ship a buggy
update
datawire.io | https://d6e.co/2hZ0MQv
In plain terms
78
Layer 7
Users can
DDOS you
Your dependencies can
fail
Your hardware can failYour hardware can fail
You ship a buggy
update
(rate limiting) (circuit breakers, timeouts, etc.)(software level redundancy)
datawire.io | https://d6e.co/2hZ0MQv
How do we protect us from ourselves?
● If all our redundant hardware runs the same code, our own bugs quickly become
the biggest source of catastrophic failure
79
datawire.io | https://d6e.co/2hZ0MQv
Create software level redundancy
● Redundant hardware protects us from mechanical failures
● We need redundant software implementations to protect us from our own bugs
● Canary testing is the most basic version of this
○ run multiple versions of your code to improve resiliency (like genetic diversity)
Envoy helps us do this as well, but we need to wire it into our developer workflow
● This is what we will focus on
80
datawire.io | https://d6e.co/2hZ0MQv
Envoy
● Modern, L7 proxy, designed for distributed cloud architectures
○ L7 observability
○ Resilience
■ Global rate limiting
■ Advanced load balancing
■ Circuit breakers
○ HTTP/2 & gRPC support
○ APIs for managing fleets of Envoys
● Adopted by the CNCF (which also hosts Kubernetes, Prometheus, Docker, among
other projects)
● Originally written by the engineering team at Lyft, and now with committers from
Google, IBM, Datawire, and others
● Alternatives: NGINX Plus, HAProxy
81
datawire.io | https://d6e.co/2hZ0MQv
Ambassador (https://getambassador.io)
82
● Builds on Envoy with
○ An authentication plugin
○ Kubernetes integration
● Kubernetes integration provides:
○ Self service usage via service
annotations
○ Canary routing
○ And more...
datawire.io | https://d6e.co/2hZ0MQv
Ambassador
83
$ cd /workspace/ambassador-canary
service.yaml # forge metadata
ambassador/Dockerfile # build Envoy with Ambassador plugins
k8s/deployment.yaml # templated manifests
datawire.io | https://d6e.co/2hZ0MQv
Let’s use Ambassador!
$ API=$(url.sh ambassador)
$ curl $API/qotm/ # don’t forget trailing slash
84
Envoy QOTM-stableYour laptop
Stats
Weighted routing (canary)
Authentication
Auth
datawire.io | https://d6e.co/2hZ0MQv
How does Ambassador know to route to QOTM?
Run
$ kubectl get service qotm-ws-stable -o yaml
You should see something like:
apiVersion: v1
kind: Service
metadata:
annotations:
ambassador: |
---
apiVersion: ambassador/v1
kind: Mapping
name: qotm-ws-stable-mapping
prefix: /qotm/
service: qotm-ws-stable
85
datawire.io | https://d6e.co/2hZ0MQv
Canary testing
● Route X% of your traffic to new version
● Monitor your metrics to make sure no difference between old version and new
version
● Gradually ramp up traffic to new version
Benefits
● Immediate rollback to old version
● Minimize impact of any error
Costs
● Need extra capacity for canary testing
● Need a L7 router (you can only do coarse canaries with K8S)
86
datawire.io | https://d6e.co/2hZ0MQv
We’ll set up Prometheus to view the Envoy metrics..
$ cd /workspace
$ git clone https://github.com/datawire/prometheus-canary
$ cd prometheus-canary
$ forge deploy
$ url.sh prometheus
In your browser, visit http://<prometheus-url>.
87
datawire.io | https://d6e.co/2hZ0MQv
We’ll deploy a modified version of QOTM as a canary.
88
Envoy QOTM-stableYour laptop
Auth
QOTM-canary
10%
90%
datawire.io | https://d6e.co/2hZ0MQv
First change into the qotm-ws directory:
$ cd /workspace/qotm-ws
In qotm/qotm.py, we’ll simulate a performance bug by adding a sleep command.
Search for the following line:
# XXX time.sleep(0.5)
And uncomment the line (and delete the XXX):
time.sleep(0.5)
Please note this is python, whitespace is important, make sure your statements
line up!
Now, let’s create a bug
89
datawire.io | https://d6e.co/2hZ0MQv
Deploy a canary version of the QOTM service.
$ cd /workspace/qotm-ws
$ forge --profile canary deploy
Forge creates new pods for the “canary” release which can be seen with kubectl:
$ kubectl get pods
Let’s simulate enough requests on the service to go between the original version of the
service, and the canary.
$ while true; do curl $API/qotm/; done
Now, let’s deploy a canary
90
datawire.io | https://d6e.co/2hZ0MQv
What’s different about the Canary deployment?
Run
$ kubectl get service qotm-ws-canary -o yaml
You should see something like:
apiVersion: v1
kind: Service
metadata:
annotations:
ambassador: |
---
apiVersion: ambassador/v1
kind: Mapping
name: qotm-ws-canary-mapping
prefix: /qotm/
service: qotm-ws-canary
weight: 10.0
91
datawire.io | https://d6e.co/2hZ0MQv
How did it get that way?
The service.yaml defines settings for different profiles, the deployment template uses
the one you choose:
profiles:
stable:
endpoint: /qotm/
max_memory: 0.5G
max_cpu: 0.5
canary:
endpoint: /qotm/
weight: 10.0 # percentage of traffic to route
max_memory: 0.5G
max_cpu: 0.5G
default:
max_memory: 0.25G
max_cpu: 0.25
92
datawire.io | https://d6e.co/2hZ0MQv
Monitor the canary
In Prometheus, execute this query:
{__name__=~"envoy_cluster_cluster_qotm_ws_stable_upstream_rq_time_
timer|envoy_cluster_cluster_qotm_ws_canary_upstream_rq_time_timer"
}
Hit execute periodically to see changes (you might also want to reduce the granularity
of the time window to 5 minutes).
93
Recap
datawire.io | https://d6e.co/2hZ0MQv
The story so far ...
1. Adopting a fast, distributed workflow is critical to accelerating productivity.
2. Start building your workflow by thinking about the single developer/team, for a
single service.
3. We showed how Kubernetes, Docker, Envoy, and monitoring (e.g., Prometheus)
can be used to build your workflow.
4. Your workflow depends on the stage of your service.
5. Managing L7 is really important, and gives you new, critical capabilities such as
canary testing and transparent monitoring.
95
5
Analyze metrics by collecting them from Envoy and
adding to Prometheus.
96
Stage 1
prototyping
workflow
Stage 2
production
workflow
Recapping the workflow
1 Bootstrap the service. Clone a GitHub repo.
2 Code.
3
Run your code (in a dev Kube cluster). Docker build,
Kubernetes manifest, etc.
4
Deploy to production Kubernetes cluster. Canary
routing via Envoy.
datawire.io | https://d6e.co/2hZ0MQv
Some additional topics
● Service meshes
● Development environments
● Stateful services
● Organizational adoption
97
Service mesh
Stage 1:
Prototyping
Stage 2:
Production
Stage 3: Internal
service
consumption
Service doesn’t crash
Workflow for prod
deploys, monitoring,
& debugging
No cascade failures
Productive dev
environment
Transparently add
service resilience
No negative user
impact
datawire.io | https://d6e.co/2hZ0MQv
Service meshes
● When you have stage 3 services, you want to think about a service mesh
○ But you should start with 1 service, so don’t worry about the service mesh right away!
● Provide two critical functions
○ Observability (e.g., tracing) across all of your services
○ Resilience across all of your services
● Function by deploying a sidecar proxy (e.g., Envoy) next to each of your services
● Use iptables or equivalent to insure all service egress traffic is routed through
sidecar
● Sidecar adds in trace IDs, circuit breaking, etc.
99
datawire.io | https://d6e.co/2hZ0MQv 100
datawire.io | https://d6e.co/2hZ0MQv
Stateful services
● Databases and such can be deployed with a Kubernetes manifest -- same
technique as Envoy or the existing services, but a different configuration
● Standard canary testing doesn’t work as well for stateful services
○ Envoy supports shadowing of requests
○ (We’re working on this so it’s more useable)
● If you have non-K8S resources (e.g., AWS RDS, etc.) consider adding the
Terraform/Ansible/etc. Scripts for creating these resources in another folder as
part of your standard service
101
datawire.io | https://d6e.co/2hZ0MQv
Organizational adoption
● Build an API service, just like Stripe or Twilio
● Staff with a single, spinoff team
● Define the purpose of the service from the perspective of the user
● Don’t allow the service team to make any changes to the existing code base, or
vice versa
102
datawire.io | https://d6e.co/2hZ0MQv
Thank you!
● (Anonymous) feedback survey -- would be VERY grateful if you could spend 5
minutes filling it out so we can get better
○ https://d6e.co/2yxVnmn
● Feel free to email us:
○ richard@datawire.io
○ rhs@datawire.io
○ plombardi@datawire.io
● If you’re interested in any of our open source tools, check them out:
○ https://forge.sh for deployment
○ https://www.telepresence.io for fast development cycles
○ https://www.getambassador.io easiest way to deploy/configure Envoy on Kubernetes
103
appendix
datawire.io | https://d6e.co/2hZ0MQv
Testing microservices
● Traditional approach to testing a microservices architecture is with a staging
environment
○ First push services to staging
○ Then run integration tests
○ If tests pass, then push to production
● But this introduces a big tradeoff
○ In order to do a “true” integration testing, you need to synchronize your different service versions
in staging … and push those versions into production
○ But this introduces a bottleneck!
● So you want to think about more distributed strategies for integration testing
105
datawire.io | https://d6e.co/2hZ0MQv 106

More Related Content

What's hot

Docker in pratice -chenyifei
Docker in pratice -chenyifeiDocker in pratice -chenyifei
Docker in pratice -chenyifei
dotCloud
 
Docker, a new LINUX container technology based light weight virtualization
Docker, a new LINUX container technology based light weight virtualizationDocker, a new LINUX container technology based light weight virtualization
Docker, a new LINUX container technology based light weight virtualization
Suresh Balla
 
Docker and containers - For Boston Docker Meetup Workshop in March 2015
Docker and containers - For Boston Docker Meetup Workshop in March 2015Docker and containers - For Boston Docker Meetup Workshop in March 2015
Docker and containers - For Boston Docker Meetup Workshop in March 2015
Jonas Rosland
 

What's hot (20)

Containers, OCI, CNCF, Magnum, Kuryr, and You!
Containers, OCI, CNCF, Magnum, Kuryr, and You!Containers, OCI, CNCF, Magnum, Kuryr, and You!
Containers, OCI, CNCF, Magnum, Kuryr, and You!
 
What's New in Docker - February 2017
What's New in Docker - February 2017What's New in Docker - February 2017
What's New in Docker - February 2017
 
Docker and Containers overview - Docker Workshop
Docker and Containers overview - Docker WorkshopDocker and Containers overview - Docker Workshop
Docker and Containers overview - Docker Workshop
 
Docker meetup-20-apr-17-openshit
Docker meetup-20-apr-17-openshitDocker meetup-20-apr-17-openshit
Docker meetup-20-apr-17-openshit
 
All Things Containers - Docker, Kubernetes, Helm, Istio, GitOps and more
All Things Containers - Docker, Kubernetes, Helm, Istio, GitOps and moreAll Things Containers - Docker, Kubernetes, Helm, Istio, GitOps and more
All Things Containers - Docker, Kubernetes, Helm, Istio, GitOps and more
 
Containers & Security
Containers & SecurityContainers & Security
Containers & Security
 
Docker Overview - Rise of the Containers
Docker Overview - Rise of the ContainersDocker Overview - Rise of the Containers
Docker Overview - Rise of the Containers
 
Webinar container management in OpenStack
Webinar container management in OpenStackWebinar container management in OpenStack
Webinar container management in OpenStack
 
Docker in pratice -chenyifei
Docker in pratice -chenyifeiDocker in pratice -chenyifei
Docker in pratice -chenyifei
 
DockerCon Keynote Ben Golub
DockerCon Keynote Ben GolubDockerCon Keynote Ben Golub
DockerCon Keynote Ben Golub
 
Immutable infrastructure with Docker and EC2
Immutable infrastructure with Docker and EC2Immutable infrastructure with Docker and EC2
Immutable infrastructure with Docker and EC2
 
Docker & Kubernetes intro
Docker & Kubernetes introDocker & Kubernetes intro
Docker & Kubernetes intro
 
DockerCon SF 2015: Enabling Microservices @Orbitz
DockerCon SF 2015: Enabling Microservices @OrbitzDockerCon SF 2015: Enabling Microservices @Orbitz
DockerCon SF 2015: Enabling Microservices @Orbitz
 
Modernizing Java Apps with Docker
Modernizing Java Apps with DockerModernizing Java Apps with Docker
Modernizing Java Apps with Docker
 
Revolutionizing WSO2 PaaS with Kubernetes & App Factory
Revolutionizing WSO2 PaaS with Kubernetes & App FactoryRevolutionizing WSO2 PaaS with Kubernetes & App Factory
Revolutionizing WSO2 PaaS with Kubernetes & App Factory
 
Docker, a new LINUX container technology based light weight virtualization
Docker, a new LINUX container technology based light weight virtualizationDocker, a new LINUX container technology based light weight virtualization
Docker, a new LINUX container technology based light weight virtualization
 
Webinar: Code Faster on Kubernetes
Webinar: Code Faster on KubernetesWebinar: Code Faster on Kubernetes
Webinar: Code Faster on Kubernetes
 
Docker and containers - For Boston Docker Meetup Workshop in March 2015
Docker and containers - For Boston Docker Meetup Workshop in March 2015Docker and containers - For Boston Docker Meetup Workshop in March 2015
Docker and containers - For Boston Docker Meetup Workshop in March 2015
 
Back to the Future: Containerize Legacy Applications
Back to the Future: Containerize Legacy ApplicationsBack to the Future: Containerize Legacy Applications
Back to the Future: Containerize Legacy Applications
 
Docker 101 - High level introduction to docker
Docker 101 - High level introduction to dockerDocker 101 - High level introduction to docker
Docker 101 - High level introduction to docker
 

Viewers also liked

Principles of microservices velocity
Principles of microservices   velocityPrinciples of microservices   velocity
Principles of microservices velocity
Sam Newman
 

Viewers also liked (20)

DevOps Days Boston 2017: Developer first workflows for Kubernetes
DevOps Days Boston 2017: Developer first workflows for KubernetesDevOps Days Boston 2017: Developer first workflows for Kubernetes
DevOps Days Boston 2017: Developer first workflows for Kubernetes
 
Microservices Application Tracing Standards and Simulators - Adrians at OSCON
Microservices Application Tracing Standards and Simulators - Adrians at OSCONMicroservices Application Tracing Standards and Simulators - Adrians at OSCON
Microservices Application Tracing Standards and Simulators - Adrians at OSCON
 
Microservices: What's Missing - O'Reilly Software Architecture New York
Microservices: What's Missing - O'Reilly Software Architecture New YorkMicroservices: What's Missing - O'Reilly Software Architecture New York
Microservices: What's Missing - O'Reilly Software Architecture New York
 
Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!Microservices, Kubernetes and Istio - A Great Fit!
Microservices, Kubernetes and Istio - A Great Fit!
 
KELK Stack on AWS
KELK Stack on AWSKELK Stack on AWS
KELK Stack on AWS
 
Kubernetes Architecture - beyond a black box - Part 2
Kubernetes Architecture - beyond a black box - Part 2Kubernetes Architecture - beyond a black box - Part 2
Kubernetes Architecture - beyond a black box - Part 2
 
Webcast - Making kubernetes production ready
Webcast - Making kubernetes production readyWebcast - Making kubernetes production ready
Webcast - Making kubernetes production ready
 
Kubernetes on AWS
Kubernetes on AWSKubernetes on AWS
Kubernetes on AWS
 
Container Days Boston - Kubernetes in production
Container Days Boston - Kubernetes in productionContainer Days Boston - Kubernetes in production
Container Days Boston - Kubernetes in production
 
Kubernetes Architecture - beyond a black box - Part 1
Kubernetes Architecture - beyond a black box - Part 1Kubernetes Architecture - beyond a black box - Part 1
Kubernetes Architecture - beyond a black box - Part 1
 
From dev to prod: Kubernetes on AWS (short ver.)
From dev to prod: Kubernetes on AWS (short ver.)From dev to prod: Kubernetes on AWS (short ver.)
From dev to prod: Kubernetes on AWS (short ver.)
 
Cloud Solution Day 2016: Service Mesh for Kubernetes
Cloud Solution Day 2016: Service Mesh for KubernetesCloud Solution Day 2016: Service Mesh for Kubernetes
Cloud Solution Day 2016: Service Mesh for Kubernetes
 
Running Production-Grade Kubernetes on AWS
Running Production-Grade Kubernetes on AWSRunning Production-Grade Kubernetes on AWS
Running Production-Grade Kubernetes on AWS
 
Large Scale Kubernetes on AWS at Europe's Leading Online Fashion Platform - A...
Large Scale Kubernetes on AWS at Europe's Leading Online Fashion Platform - A...Large Scale Kubernetes on AWS at Europe's Leading Online Fashion Platform - A...
Large Scale Kubernetes on AWS at Europe's Leading Online Fashion Platform - A...
 
Kubernetes on AWS at Europe's Leading Online Fashion Platform
Kubernetes on AWS at Europe's Leading Online Fashion PlatformKubernetes on AWS at Europe's Leading Online Fashion Platform
Kubernetes on AWS at Europe's Leading Online Fashion Platform
 
Kubernetes networking in AWS
Kubernetes networking in AWSKubernetes networking in AWS
Kubernetes networking in AWS
 
Beyond Ingresses - Better Traffic Management in Kubernetes
Beyond Ingresses - Better Traffic Management in KubernetesBeyond Ingresses - Better Traffic Management in Kubernetes
Beyond Ingresses - Better Traffic Management in Kubernetes
 
Microservices Workshop All Topics Deck 2016
Microservices Workshop All Topics Deck 2016Microservices Workshop All Topics Deck 2016
Microservices Workshop All Topics Deck 2016
 
Principles of microservices velocity
Principles of microservices   velocityPrinciples of microservices   velocity
Principles of microservices velocity
 
Top 5 Deep Learning and AI Stories - October 6, 2017
Top 5 Deep Learning and AI Stories - October 6, 2017Top 5 Deep Learning and AI Stories - October 6, 2017
Top 5 Deep Learning and AI Stories - October 6, 2017
 

Similar to O'Reilly Software Architecture Conference London 2017: Building Resilient Microservices with Kubernetes, Docker, and Envoy

Introduction to Docker and Linux Containers @ Cloud Computing Rhein Main
Introduction to Docker and Linux Containers @ Cloud Computing Rhein MainIntroduction to Docker and Linux Containers @ Cloud Computing Rhein Main
Introduction to Docker and Linux Containers @ Cloud Computing Rhein Main
Puja Abbassi
 

Similar to O'Reilly Software Architecture Conference London 2017: Building Resilient Microservices with Kubernetes, Docker, and Envoy (20)

[@NaukriEngineering] Docker 101
[@NaukriEngineering] Docker 101[@NaukriEngineering] Docker 101
[@NaukriEngineering] Docker 101
 
Containerization using docker and its applications
Containerization using docker and its applicationsContainerization using docker and its applications
Containerization using docker and its applications
 
Containerization using docker and its applications
Containerization using docker and its applicationsContainerization using docker and its applications
Containerization using docker and its applications
 
docker : how to deploy Digital Experience in a container drinking a cup of co...
docker : how to deploy Digital Experience in a container drinking a cup of co...docker : how to deploy Digital Experience in a container drinking a cup of co...
docker : how to deploy Digital Experience in a container drinking a cup of co...
 
.docker : How to deploy Digital Experience in a container, drinking a cup of ...
.docker : How to deploy Digital Experience in a container, drinking a cup of ....docker : How to deploy Digital Experience in a container, drinking a cup of ...
.docker : How to deploy Digital Experience in a container, drinking a cup of ...
 
.docker : how to deploy Digital Experience in a container drinking a cup of c...
.docker : how to deploy Digital Experience in a container drinking a cup of c....docker : how to deploy Digital Experience in a container drinking a cup of c...
.docker : how to deploy Digital Experience in a container drinking a cup of c...
 
Docker for dev
Docker for devDocker for dev
Docker for dev
 
Docker puebla bday #4 celebration
Docker puebla bday #4 celebrationDocker puebla bday #4 celebration
Docker puebla bday #4 celebration
 
Accelerate your development with Docker
Accelerate your development with DockerAccelerate your development with Docker
Accelerate your development with Docker
 
Accelerate your software development with Docker
Accelerate your software development with DockerAccelerate your software development with Docker
Accelerate your software development with Docker
 
HPC Cloud Burst Using Docker
HPC Cloud Burst Using DockerHPC Cloud Burst Using Docker
HPC Cloud Burst Using Docker
 
Docker dev ops for cd meetup 12-14
Docker dev ops for cd meetup 12-14Docker dev ops for cd meetup 12-14
Docker dev ops for cd meetup 12-14
 
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
 
Red Hat Forum Benelux 2015
Red Hat Forum Benelux 2015Red Hat Forum Benelux 2015
Red Hat Forum Benelux 2015
 
Containers, Docker, and Microservices: the Terrific Trio
Containers, Docker, and Microservices: the Terrific TrioContainers, Docker, and Microservices: the Terrific Trio
Containers, Docker, and Microservices: the Terrific Trio
 
A Shift from Monolith to Microservice using Docker
A Shift from Monolith to Microservice using DockerA Shift from Monolith to Microservice using Docker
A Shift from Monolith to Microservice using Docker
 
Docker up and Running For Web Developers
Docker up and Running For Web DevelopersDocker up and Running For Web Developers
Docker up and Running For Web Developers
 
Docker Up and Running for Web Developers
Docker Up and Running for Web DevelopersDocker Up and Running for Web Developers
Docker Up and Running for Web Developers
 
DCEU 18: Building Your Development Pipeline
DCEU 18: Building Your Development PipelineDCEU 18: Building Your Development Pipeline
DCEU 18: Building Your Development Pipeline
 
Introduction to Docker and Linux Containers @ Cloud Computing Rhein Main
Introduction to Docker and Linux Containers @ Cloud Computing Rhein MainIntroduction to Docker and Linux Containers @ Cloud Computing Rhein Main
Introduction to Docker and Linux Containers @ Cloud Computing Rhein Main
 

More from Ambassador Labs

[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li
[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li
[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li
Ambassador Labs
 

More from Ambassador Labs (20)

Building Microservice Systems Without Cooking Your Laptop: Going “Remocal” wi...
Building Microservice Systems Without Cooking Your Laptop: Going “Remocal” wi...Building Microservice Systems Without Cooking Your Laptop: Going “Remocal” wi...
Building Microservice Systems Without Cooking Your Laptop: Going “Remocal” wi...
 
Ambassador Developer Office Hours: Summer of Kubernetes Ship Week 1: Intro to...
Ambassador Developer Office Hours: Summer of Kubernetes Ship Week 1: Intro to...Ambassador Developer Office Hours: Summer of Kubernetes Ship Week 1: Intro to...
Ambassador Developer Office Hours: Summer of Kubernetes Ship Week 1: Intro to...
 
Cloud native development without the toil
Cloud native development without the toilCloud native development without the toil
Cloud native development without the toil
 
Webinar: Accelerate Your Inner Dev Loop for Kubernetes Services
Webinar: Accelerate Your Inner Dev Loop for Kubernetes Services Webinar: Accelerate Your Inner Dev Loop for Kubernetes Services
Webinar: Accelerate Your Inner Dev Loop for Kubernetes Services
 
[Confoo Montreal 2020] From Grief to Growth: The 7 Stages of Observability - ...
[Confoo Montreal 2020] From Grief to Growth: The 7 Stages of Observability - ...[Confoo Montreal 2020] From Grief to Growth: The 7 Stages of Observability - ...
[Confoo Montreal 2020] From Grief to Growth: The 7 Stages of Observability - ...
 
[Confoo Montreal 2020] Build Your Own Serverless with Knative - Alex Gervais
[Confoo Montreal 2020] Build Your Own Serverless with Knative - Alex Gervais[Confoo Montreal 2020] Build Your Own Serverless with Knative - Alex Gervais
[Confoo Montreal 2020] Build Your Own Serverless with Knative - Alex Gervais
 
[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li
[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li
[QCon London 2020] The Future of Cloud Native API Gateways - Richard Li
 
What's New in the Ambassador Edge Stack 1.0?
What's New in the Ambassador Edge Stack 1.0? What's New in the Ambassador Edge Stack 1.0?
What's New in the Ambassador Edge Stack 1.0?
 
Webinar: Effective Management of APIs and the Edge when Adopting Kubernetes
Webinar: Effective Management of APIs and the Edge when Adopting Kubernetes Webinar: Effective Management of APIs and the Edge when Adopting Kubernetes
Webinar: Effective Management of APIs and the Edge when Adopting Kubernetes
 
Ambassador: Building a Control Plane for Envoy
Ambassador: Building a Control Plane for Envoy Ambassador: Building a Control Plane for Envoy
Ambassador: Building a Control Plane for Envoy
 
Telepresence - Fast Development Workflows for Kubernetes
Telepresence - Fast Development Workflows for KubernetesTelepresence - Fast Development Workflows for Kubernetes
Telepresence - Fast Development Workflows for Kubernetes
 
[KubeCon NA 2018] Telepresence Deep Dive Session - Rafael Schloming & Luke Sh...
[KubeCon NA 2018] Telepresence Deep Dive Session - Rafael Schloming & Luke Sh...[KubeCon NA 2018] Telepresence Deep Dive Session - Rafael Schloming & Luke Sh...
[KubeCon NA 2018] Telepresence Deep Dive Session - Rafael Schloming & Luke Sh...
 
[KubeCon NA 2018] Effective Kubernetes Develop: Turbocharge Your Dev Loop - P...
[KubeCon NA 2018] Effective Kubernetes Develop: Turbocharge Your Dev Loop - P...[KubeCon NA 2018] Effective Kubernetes Develop: Turbocharge Your Dev Loop - P...
[KubeCon NA 2018] Effective Kubernetes Develop: Turbocharge Your Dev Loop - P...
 
The rise of Layer 7, microservices, and the proxy war with Envoy, NGINX, and ...
The rise of Layer 7, microservices, and the proxy war with Envoy, NGINX, and ...The rise of Layer 7, microservices, and the proxy war with Envoy, NGINX, and ...
The rise of Layer 7, microservices, and the proxy war with Envoy, NGINX, and ...
 
The Simply Complex Task of Implementing Kubernetes Ingress - Velocity NYC
The Simply Complex Task of Implementing Kubernetes Ingress - Velocity NYCThe Simply Complex Task of Implementing Kubernetes Ingress - Velocity NYC
The Simply Complex Task of Implementing Kubernetes Ingress - Velocity NYC
 
Ambassador Kubernetes-Native API Gateway
Ambassador Kubernetes-Native API GatewayAmbassador Kubernetes-Native API Gateway
Ambassador Kubernetes-Native API Gateway
 
Micro xchg 2018 - What is a Service Mesh?
Micro xchg 2018 - What is a Service Mesh? Micro xchg 2018 - What is a Service Mesh?
Micro xchg 2018 - What is a Service Mesh?
 
KubeCon NA 2017: Ambassador and Envoy (Envoy Salon)
KubeCon NA 2017: Ambassador and Envoy (Envoy Salon)KubeCon NA 2017: Ambassador and Envoy (Envoy Salon)
KubeCon NA 2017: Ambassador and Envoy (Envoy Salon)
 
QCon SF 2017 - Microservices: Service-Oriented Development
QCon SF 2017 - Microservices: Service-Oriented DevelopmentQCon SF 2017 - Microservices: Service-Oriented Development
QCon SF 2017 - Microservices: Service-Oriented Development
 
Montreal Kubernetes Meetup: Developer-first workflows (for microservices) on ...
Montreal Kubernetes Meetup: Developer-first workflows (for microservices) on ...Montreal Kubernetes Meetup: Developer-first workflows (for microservices) on ...
Montreal Kubernetes Meetup: Developer-first workflows (for microservices) on ...
 

Recently uploaded

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Recently uploaded (20)

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 

O'Reilly Software Architecture Conference London 2017: Building Resilient Microservices with Kubernetes, Docker, and Envoy

  • 1. Building resilient microservices with Kubernetes, Docker, and Envoy Phil Lombardi & Rafael Schloming
  • 2. datawire.io | https://d6e.co/2hZ0MQv Before we begin ... ● You’re running latest version of Docker on your laptop ● You’ve created an account on hub.docker.com ● You’ve set up a working environment (we’ve pre-installed everything for you) ○ Ubuntu Docker image ○ git clone https://github.com/datawire/shopbox ○ cd shopbox ○ ./shopbox.sh ● You’ve downloaded some key Docker images ○ docker pull datawire/ambassador-envoy ○ docker pull prom/prometheus ○ docker pull python:3-alpine ● You have your favorite terminal & text editor ready to go! Go to the presentation here: https://d6e.co/2hZ0MQv 2
  • 3. datawire.io | https://d6e.co/2hZ0MQv About us ● Worked on microservices for past 2.5 years, both with our own cloud services and with consulting ● Datawire builds open source tools for developers building microservices, based on our own experiences ● Run microservices.com, which has talks from dozens of practitioners on microservices 3
  • 4. datawire.io | https://d6e.co/2hZ0MQv Introduction: Microservices, Kubernetes, Docker, Envoy 20 minutes Presentation Core Concepts of Docker & Kubernetes 70 minutes Workshop Break around 3pm 30 minutes Building & deploying a microservice in production 60 minutes Workshop Wrap-up 20 minutes Presentation / Q&A Feedback 5 minutes Our schedule for today 4
  • 5. datawire.io | https://d6e.co/2hZ0MQv Our focus today 1. Communicate the key concepts 2. Minimize time spent on the mechanics, since they’re impossible to remember until you do them often enough 3. Try to give you a mental model to understand the different (overwhelming) choices in the Kubernetes ecosystem, and how to start. 4. If you don’t understand the purpose of a specific exercise, please ask! Also … Minikube is a popular choice for these trainings, since you can run things locally. But minikube is a big performance hog and isn’t quite as realistic with some of the things we’re doing, so we’re going to try to use the Internet. (We have done some work to minimize bandwidth consumption.) 5
  • 7. How do you ship better (cloud) software faster?
  • 9. Take the standard development process: Code (Dev) Test (QA) Prod (Ops) Release (Release) Define (Product)
  • 10. 1 0 … and make it distributed. > No central release, test, dev cycle. Each person/team operates an independent development process. > Team needs to have the skills / knowledge to operate all aspects of the development process. Service A Service B Service C
  • 11. 1 1 Microservices is a distributed development process for cloud-native software. > Not an architecture! Your architecture supports the process, and not the other way around.
  • 12. 1 2 How do you adopt a distributed development process?
  • 13. Start by creating an independent process! (with a from-scratch API service) New serviceMonolith independent process!! (think spinning off a developer or dev team)
  • 14. 1 4 1. Self-sufficiency. Each team needs to be self-sufficient in all aspects of the development cycle to avoid bottlenecks. 2. Safety. Since it’s hard to be an expert in every area of the development, need to insure an oops isn’t catastrophic. Give the developer / dev team the ability to SUCCESSFULLY operate independently.
  • 15. The definition of self-sufficient safety varies based on the evolution of your microservice. Stage 1: Prototyping Stage 2: Production Stage 3: Internal service consumption Service doesn’t crash Workflow for prod deploys, monitoring, & debugging No cascade failures Productive dev environment Transparently add service resilience No negative user impact Self sufficiency Safety
  • 16. 1 6 Together, Kubernetes, Docker, and Envoy give your developers the basic infrastructure for self-sufficiency & safety.
  • 17. 17 1. Microservices is a distributed development workflow that helps you go faster. 2. An efficient workflow for your team provides self-sufficiency and safety. 3. The Kubernetes ecosystem, Docker, and Envoy provide the foundational components you need to build that workflow.
  • 19. Core Concept 1: Containers
  • 20. datawire.io | https://d6e.co/2hZ0MQv What is a container? ● Lightweight Linux environment. It is a form of virtualization… but very different from a full virtual machine. ● Immutable, deployable artifact. ● Runnable. ● Popularized by Docker but there are many runtime implementations (e.g. LXC, Rkt). 20
  • 21. datawire.io | https://d6e.co/2hZ0MQv What is Docker? ● A tool, ecosystem and platform for building, pushing and running containers. ● The most popular container runtime currently. ● Default container runtime in Kubernetes. 21
  • 22. datawire.io | https://d6e.co/2hZ0MQv Why Containers? ● Easy and fast to produce. ● Great way to isolate different components in a complex system. ● Ensures a reproducible runtime for your app along the dev -> build -> test -> prod pipeline. ● Easy to share in a team or with external partners. 22
  • 23. datawire.io | https://d6e.co/2hZ0MQv Your Development Environment 23
  • 24. datawire.io | https://d6e.co/2hZ0MQv Let’s Get Started... ● We’ve built an Ubuntu container image for you ○ Includes all the client-side tools we’ll use for the training (e.g., kubectl) ● We’ll use Kubernaut for Kubernetes clusters ○ On-demand, ephemeral clusters (designed for CI … or training!) ● The container mounts a local directory into /workspace in the image your files are synchronized with your laptop. 24
  • 25. datawire.io | https://d6e.co/2hZ0MQv Let’s Get Started... Run the below commands in your terminal if you haven’t already: $ git clone https://github.com/datawire/shopbox $ cd shopbox $ ./shopbox.sh Pre-configured dev environment with kubectl (with tab completion), kubernaut, and various utilities we will use today. 25
  • 27. datawire.io | https://d6e.co/2hZ0MQv Let’s build a service as a container A simple web application: Quote of The Moment (“QOTM”). ● Requires Python ● Uses Flask GET STARTED $ git clone https://github.com/datawire/qotm-ws $ cd /workspace/qotm-ws 27
  • 28. datawire.io | https://d6e.co/2hZ0MQv The Dockerfile FROM python:3-alpine MAINTAINER Datawire <dev@datawire.io> WORKDIR /service COPY requirements.txt . RUN pip install -r requirements.txt COPY . ./ EXPOSE 5000 ENTRYPOINT [“python3”, “qotm/qotm.py”] 28
  • 29. datawire.io | https://d6e.co/2hZ0MQv Let’s build it! Run the below command to build the image (the trailing period on the below command is required!): $ docker build -t <your-docker-user>/qotm-ws:1 . 29 Each Docker image consists of layers. A layer is an ordered union of files and directory changes to an image. Because layers are cached, putting the parts of the Dockerfile least likely to change first (e.g., the OS) can make a huge difference in build speed.
  • 30. datawire.io | https://d6e.co/2hZ0MQv What Just Happened? 1. Docker executed the instructions in the Dockerfile. Each command created a new layer. 2. Docker composes an image from all the layers. 3. The docker engine pointed a named reference <your-docker-user>/qotm-ws:1 at the final image. 30
  • 31. datawire.io | https://d6e.co/2hZ0MQv Tagging is Important and Useful ● Tags allow you to easily reference and reuse an image. ● You can create multiple tags to point at the same image which can be useful in sharing contexts. ● Tags can be pushed to a Docker registry so other people can reuse your image! 31
  • 32. datawire.io | https://d6e.co/2hZ0MQv Run the image! Images are an inert, immutable file. When you want to run an image, a container is produced. RUN THE IMAGE $ docker run --rm -dit -p 5000:5000 <your-docker-user>/qotm-ws:1 # open another shell (that is *not* running shopbox) $ curl localhost:5000 32
  • 33. datawire.io | https://d6e.co/2hZ0MQv Share the image We’ve got an image running on your laptop, but you really want to share it -- with Kubernetes, with your colleagues, with your family & friends ... PUSH THE IMAGE $ docker login $ docker push <your-docker-user>/qotm-ws:1 33 You can see the image on your public Docker Hub account at https://hub.docker.com.
  • 34. datawire.io | https://d6e.co/2hZ0MQv One last thing ... Docker does a great job of running the container. Why can’t I just use Docker everywhere? WHAT HAPPENS IF WE CRASH? $ curl localhost:5000/crash $ curl localhost:5000 Uh oh … we need something that is a little bit smarter! 34
  • 35. Core Concept 2: Kubernetes
  • 36. datawire.io | https://d6e.co/2hZ0MQv What is Kubernetes? ● Runs massive numbers of containers based on lessons learned by Google. ● Schedules and runs all kinds of containers ○ long-lived (e.g. services) ○ short-lived (e.g. pre-launch hooks, cronjobs etc) ● Kubernetes can be thought of as a Distributed OS or process manager 36
  • 37. datawire.io | https://d6e.co/2hZ0MQv The Office Tower Analogy Your product is the building as a whole. Your business logic is the offices and workers 37
  • 38. datawire.io | https://d6e.co/2hZ0MQv The Office Tower Analogy Kubernetes provides the infrastructure to build your app around. 38 It is the foundational app platform for your team to build your businesses apps around.
  • 39. datawire.io | https://d6e.co/2hZ0MQv Kubernetes Architecture Types of nodes: Masters and Workers 39 Docker Kubelet Kubeproxy Kubernetes Node Docker Kubelet Kubeproxy Kubernetes Node Docker Kubelet Kubeproxy Kubernetes Node Etcd API Server Controller Manager Kubernetes Master Scheduler
  • 40. datawire.io | https://d6e.co/2hZ0MQv 4 basic concepts 40 Container packages your code in a portable way Pod gives your code a temporary home inside the cluster Deployment keeps your code running, even when it is updated Service provides a stable address that can reach many pods
  • 41. datawire.io | https://d6e.co/2hZ0MQv Your Development Environment 41
  • 42. datawire.io | https://d6e.co/2hZ0MQv Kubernaut ● You can get your own Kubernetes cluster easily with Google, Microsoft etc. ● Or you can install Kubernetes yourself in AWS ● To simplify things, we’re going to let you borrow some of our Kubernetes clusters :) ● We’re going to use Kubernaut which provides on-demand K8S clusters for our internal CI/CD systems. 42
  • 43. datawire.io | https://d6e.co/2hZ0MQv Kubernaut Visit https://kubernaut.io/token $ kubernaut set-token <TOKEN> $ kubernaut claim $ export KUBECONFIG=${HOME}/.kube/kubernaut 43
  • 45. datawire.io | https://d6e.co/2hZ0MQv Let’s see if there’s anything running! $ kubectl get services $ kubectl get pods 45
  • 46. datawire.io | https://d6e.co/2hZ0MQv Let’s run our container $ kubectl run qotm-ws --image=<your-docker-user>/qotm-ws:1 $ kubectl get pods We see a pod! How do we talk to the pod? 46 Pod gives your code a temporary home inside the cluster
  • 47. datawire.io | https://d6e.co/2hZ0MQv We need to talk to the pod! We can tell Kubernetes to forward requests from outside the cluster to the pod, and vice versa. $ kubectl port-forward <pod-name> 5000 & $ curl localhost:5000 47
  • 48. datawire.io | https://d6e.co/2hZ0MQv What happens when a pod crashes? 48 Let’s crash the pod again. $ curl localhost:5000/crash $ curl localhost:5000 Note: don’t run this loop too often. If you crash your server too frequently, Kubernetes will assume it is having deeper problems, and will introduce a delay before attempting to restart.
  • 49. datawire.io | https://d6e.co/2hZ0MQv What just happened? The Kubernetes pod automatically restarted the container! ● By default, Kubernetes will detect failures and auto-restart (with exponential backoff, capped at 5 minutes) ● Kubernetes also lets you extend this with custom liveness and readiness probes 49
  • 50. datawire.io | https://d6e.co/2hZ0MQv Managing pods ● What if we want to update the software on our pod? ● What if we want more than one pod running, for availability or scalability reasons? 50 Deployment keeps your code running, even when it is updated
  • 51. datawire.io | https://d6e.co/2hZ0MQv Deployments Kubernetes provides extensive control over how pods are run. These are specified by a deployment object. 51
  • 52. datawire.io | https://d6e.co/2hZ0MQv Let’s try using a deployment 52 $ kubectl get pods $ kubectl delete deployment qotm-ws $ kubectl apply -f kubernetes/qotm-deployment.yaml $ kubectl get pods We see we’re now running three pods! To save bandwidth, this deployment.yaml points to a prebuilt QOTM image we’ve already uploaded. Feel free to edit it to point to your Docker repo.
  • 53. datawire.io | https://d6e.co/2hZ0MQv How do we talk to these pods? It would be silly to set up port-forwards to each pod … and load balancing would be nice. 53 Service provides a stable address that can reach many pods
  • 54. datawire.io | https://d6e.co/2hZ0MQv Service Kubernetes provides extensive control over how pods are run. These are specified in a service file. 54
  • 55. datawire.io | https://d6e.co/2hZ0MQv Services Illustrated A Service becomes a DNS A record pointing the pod IP addresses 55 IP: 100.124.71.175 blog-0 kube-worker-0 IP: 100.124.71.176 blog-1 kube-worker-1 Kubernetes cluster blog DNS (short) => blog DNS (long) => blog.default.cluster.local
  • 56. datawire.io | https://d6e.co/2hZ0MQv Service Flavors ● Many different flavors of “Service” in Kubernetes ○ ClusterIP ○ NodePort ○ LoadBalancer ○ ExternalName - often forgotten, but very useful! 56
  • 57. datawire.io | https://d6e.co/2hZ0MQv Let’s try using a service 57 $ cd /workspace/qotm-ws $ kubectl apply -f kubernetes/qotm-service.yaml $ kubectl get services # get qotm port highlighted below NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.96.0.1 <none> 443/TCP 2d qotm 10.107.109.252 <nodes> 80:<port>/TCP 6s $ kubectl cluster-info # get cluster hostname $ curl http://<cluster-hostname>:<port> # or use this script for convenience: $ curl $(url.sh qotm-ws)
  • 58. datawire.io | https://d6e.co/2hZ0MQv 58 Container packages your code in a portable way Pod gives your code a temporary home inside the cluster Deployment keeps your code running, even when it is updated Service provides a stable address that can reach many pods
  • 59. Core Concept 3: Updates
  • 60. datawire.io | https://d6e.co/2hZ0MQv Let’s try making a change in qotm/qotm.py: $ cd /workspace/qotm-ws Search for the following line: __version__ = “1” And change the version number from 1 to 2, so it reads: __version__ = “2” Now, we need to build a new docker image, with a new tag: $ docker build -t <your-docker-user>/qotm-ws:2 . $ docker push <your-docker-user>/qotm-ws:2 What if I want to update my code? 60
  • 61. datawire.io | https://d6e.co/2hZ0MQv Edit kubernetes/qotm-deployment.yaml, and replace qotm-ws:1 with qotm-ws:2 Now re-apply the deployment: $ cd /workspace/qotm-ws $ kubectl apply -f kubernetes/qotm-deployment.yaml Now run kubectl get pods with the watch option and you will see your rollout in progress: $ kubectl get pods -w You should see your new pods spin up. Now, see version 2 running: $ curl $(url.sh qotm-ws) Now let’s rollout our new version 61
  • 62. datawire.io | https://d6e.co/2hZ0MQv The source -> Kubernetes workflow 62 A Build a container image that contains your code, dependencies, and configuration, based on the Dockerfile. B Tag the image. C Push image to a container registry. D Update Kubernetes manifest with tag. E Apply Kubernetes manifest to cluster. F Repeat for all dependencies.
  • 63. datawire.io | https://d6e.co/2hZ0MQv Forge (https://forge.sh) 63 ● Define & run multi-container apps in Kubernetes ○ Do this consistently, regardless of your target Kubernetes environment ○ Do this from source code ● To “forge-ify” a service: ○ service.yaml ○ Templated Kubernetes manifest
  • 64. datawire.io | https://d6e.co/2hZ0MQv The QOTM service, part 2 ● In the k8s/ directory, there’s a templated Kubernetes manifest that Forge will use ○ Jinja2 template ○ Uses two values: build.name & build.images[“Dockerfile”] ● These values are supplied by forge and can be customized via the service.yaml file, e.g.: ○ name: qotm-ws 64
  • 65. datawire.io | https://d6e.co/2hZ0MQv Now, we can automatically deploy # delete the original services $ kubectl delete svc qotm-ws $ kubectl delete deploy qotm-ws # First, setup forge (this is one time only) $ cd /workspace # make sure you’re in /workspace $ forge setup # configure forge to deploy your source # Now, deploy from source to cluster $ cd /workspace/qotm-ws $ forge deploy # deploy qotm from source to cluster 65
  • 66. datawire.io | https://d6e.co/2hZ0MQv Let’s see what it did! Run $ kubectl get services $ kubectl get deployments $ kubectl get pods You should see a: ● qotm-ws-stable service, ● qotm-ws-stable deployment ● and several qotm-ws-stable-<???> pods: 66
  • 67. datawire.io | https://d6e.co/2hZ0MQv What’s up with the -stable suffix? ● Forge has a concept of profiles ● Profiles allow multiple versions of the same code to be deployed into the same cluster ● More about this in the next section 67
  • 68. datawire.io | https://d6e.co/2hZ0MQv Summary Kubernetes: ● Powerful building blocks ● Understands containers, *not* source code Kubernetes + Docker: ● Builds source -> containers ● Doesn’t understand versioning, environments, or kubernetes Kubernetes + Docker + Forge (or your own script): ● Source -> cluster in one command ● Automatically handles versioning and multiple environments (profiles) 68
  • 69. Let’s take a break! (hopefully it’s around 3pm)
  • 70. Core Concept 4: Envoy / L7
  • 71. datawire.io | https://d6e.co/2hZ0MQv Setup 71 $ cd /workspace $ git clone https://github.com/datawire/ambassador-canary $ cd ambassador-canary $ forge deploy
  • 72. The definition of self-sufficient safety varies based on the evolution of your microservice. Stage 1: Prototyping Stage 2: Production Stage 3: Internal service consumption Service doesn’t crash Workflow for prod deploys, monitoring, & debugging No cascade failures Productive dev environment Transparently add service resilience No negative user impact
  • 73. datawire.io | https://d6e.co/2hZ0MQv Measuring user impact is a L7 problem! ● What is L7? ○ We really mean application-level protocols ○ HTTP, gRPC, Thrift, redis://, pgsql://, ... ● In a microservices architecture, your services are an L7 network ● For you to write a service that talks to your users and/or other services, you need to understand & manage L7 73
  • 74. datawire.io | https://d6e.co/2hZ0MQv L7 is now a development concern ● Everything has always been wired together with L7 ● But in development, you could leave it (mostly) to operations ● Now, with microservices, L7 is a development concern as well: ○ More services ○ More remote dependencies ○ Greater release frequency ● So what does this mean for you? 74
  • 75. datawire.io | https://d6e.co/2hZ0MQv You: stuck in the middle ● Users consume your service over L7 ● You consume your dependencies over L7 ● Literally everything in this picture is a source of failure 75 Layer 7
  • 76. datawire.io | https://d6e.co/2hZ0MQv All your distributed systems problems are amplified ● Single points of failure ● Catastrophic failure modes ● Cascade failures 76
  • 77. datawire.io | https://d6e.co/2hZ0MQv In plain terms 77 Layer 7 Users can DDOS you Your dependencies can fail Your hardware can failYour hardware can fail You ship a buggy update
  • 78. datawire.io | https://d6e.co/2hZ0MQv In plain terms 78 Layer 7 Users can DDOS you Your dependencies can fail Your hardware can failYour hardware can fail You ship a buggy update (rate limiting) (circuit breakers, timeouts, etc.)(software level redundancy)
  • 79. datawire.io | https://d6e.co/2hZ0MQv How do we protect us from ourselves? ● If all our redundant hardware runs the same code, our own bugs quickly become the biggest source of catastrophic failure 79
  • 80. datawire.io | https://d6e.co/2hZ0MQv Create software level redundancy ● Redundant hardware protects us from mechanical failures ● We need redundant software implementations to protect us from our own bugs ● Canary testing is the most basic version of this ○ run multiple versions of your code to improve resiliency (like genetic diversity) Envoy helps us do this as well, but we need to wire it into our developer workflow ● This is what we will focus on 80
  • 81. datawire.io | https://d6e.co/2hZ0MQv Envoy ● Modern, L7 proxy, designed for distributed cloud architectures ○ L7 observability ○ Resilience ■ Global rate limiting ■ Advanced load balancing ■ Circuit breakers ○ HTTP/2 & gRPC support ○ APIs for managing fleets of Envoys ● Adopted by the CNCF (which also hosts Kubernetes, Prometheus, Docker, among other projects) ● Originally written by the engineering team at Lyft, and now with committers from Google, IBM, Datawire, and others ● Alternatives: NGINX Plus, HAProxy 81
  • 82. datawire.io | https://d6e.co/2hZ0MQv Ambassador (https://getambassador.io) 82 ● Builds on Envoy with ○ An authentication plugin ○ Kubernetes integration ● Kubernetes integration provides: ○ Self service usage via service annotations ○ Canary routing ○ And more...
  • 83. datawire.io | https://d6e.co/2hZ0MQv Ambassador 83 $ cd /workspace/ambassador-canary service.yaml # forge metadata ambassador/Dockerfile # build Envoy with Ambassador plugins k8s/deployment.yaml # templated manifests
  • 84. datawire.io | https://d6e.co/2hZ0MQv Let’s use Ambassador! $ API=$(url.sh ambassador) $ curl $API/qotm/ # don’t forget trailing slash 84 Envoy QOTM-stableYour laptop Stats Weighted routing (canary) Authentication Auth
  • 85. datawire.io | https://d6e.co/2hZ0MQv How does Ambassador know to route to QOTM? Run $ kubectl get service qotm-ws-stable -o yaml You should see something like: apiVersion: v1 kind: Service metadata: annotations: ambassador: | --- apiVersion: ambassador/v1 kind: Mapping name: qotm-ws-stable-mapping prefix: /qotm/ service: qotm-ws-stable 85
  • 86. datawire.io | https://d6e.co/2hZ0MQv Canary testing ● Route X% of your traffic to new version ● Monitor your metrics to make sure no difference between old version and new version ● Gradually ramp up traffic to new version Benefits ● Immediate rollback to old version ● Minimize impact of any error Costs ● Need extra capacity for canary testing ● Need a L7 router (you can only do coarse canaries with K8S) 86
  • 87. datawire.io | https://d6e.co/2hZ0MQv We’ll set up Prometheus to view the Envoy metrics.. $ cd /workspace $ git clone https://github.com/datawire/prometheus-canary $ cd prometheus-canary $ forge deploy $ url.sh prometheus In your browser, visit http://<prometheus-url>. 87
  • 88. datawire.io | https://d6e.co/2hZ0MQv We’ll deploy a modified version of QOTM as a canary. 88 Envoy QOTM-stableYour laptop Auth QOTM-canary 10% 90%
  • 89. datawire.io | https://d6e.co/2hZ0MQv First change into the qotm-ws directory: $ cd /workspace/qotm-ws In qotm/qotm.py, we’ll simulate a performance bug by adding a sleep command. Search for the following line: # XXX time.sleep(0.5) And uncomment the line (and delete the XXX): time.sleep(0.5) Please note this is python, whitespace is important, make sure your statements line up! Now, let’s create a bug 89
  • 90. datawire.io | https://d6e.co/2hZ0MQv Deploy a canary version of the QOTM service. $ cd /workspace/qotm-ws $ forge --profile canary deploy Forge creates new pods for the “canary” release which can be seen with kubectl: $ kubectl get pods Let’s simulate enough requests on the service to go between the original version of the service, and the canary. $ while true; do curl $API/qotm/; done Now, let’s deploy a canary 90
  • 91. datawire.io | https://d6e.co/2hZ0MQv What’s different about the Canary deployment? Run $ kubectl get service qotm-ws-canary -o yaml You should see something like: apiVersion: v1 kind: Service metadata: annotations: ambassador: | --- apiVersion: ambassador/v1 kind: Mapping name: qotm-ws-canary-mapping prefix: /qotm/ service: qotm-ws-canary weight: 10.0 91
  • 92. datawire.io | https://d6e.co/2hZ0MQv How did it get that way? The service.yaml defines settings for different profiles, the deployment template uses the one you choose: profiles: stable: endpoint: /qotm/ max_memory: 0.5G max_cpu: 0.5 canary: endpoint: /qotm/ weight: 10.0 # percentage of traffic to route max_memory: 0.5G max_cpu: 0.5G default: max_memory: 0.25G max_cpu: 0.25 92
  • 93. datawire.io | https://d6e.co/2hZ0MQv Monitor the canary In Prometheus, execute this query: {__name__=~"envoy_cluster_cluster_qotm_ws_stable_upstream_rq_time_ timer|envoy_cluster_cluster_qotm_ws_canary_upstream_rq_time_timer" } Hit execute periodically to see changes (you might also want to reduce the granularity of the time window to 5 minutes). 93
  • 94. Recap
  • 95. datawire.io | https://d6e.co/2hZ0MQv The story so far ... 1. Adopting a fast, distributed workflow is critical to accelerating productivity. 2. Start building your workflow by thinking about the single developer/team, for a single service. 3. We showed how Kubernetes, Docker, Envoy, and monitoring (e.g., Prometheus) can be used to build your workflow. 4. Your workflow depends on the stage of your service. 5. Managing L7 is really important, and gives you new, critical capabilities such as canary testing and transparent monitoring. 95
  • 96. 5 Analyze metrics by collecting them from Envoy and adding to Prometheus. 96 Stage 1 prototyping workflow Stage 2 production workflow Recapping the workflow 1 Bootstrap the service. Clone a GitHub repo. 2 Code. 3 Run your code (in a dev Kube cluster). Docker build, Kubernetes manifest, etc. 4 Deploy to production Kubernetes cluster. Canary routing via Envoy.
  • 97. datawire.io | https://d6e.co/2hZ0MQv Some additional topics ● Service meshes ● Development environments ● Stateful services ● Organizational adoption 97
  • 98. Service mesh Stage 1: Prototyping Stage 2: Production Stage 3: Internal service consumption Service doesn’t crash Workflow for prod deploys, monitoring, & debugging No cascade failures Productive dev environment Transparently add service resilience No negative user impact
  • 99. datawire.io | https://d6e.co/2hZ0MQv Service meshes ● When you have stage 3 services, you want to think about a service mesh ○ But you should start with 1 service, so don’t worry about the service mesh right away! ● Provide two critical functions ○ Observability (e.g., tracing) across all of your services ○ Resilience across all of your services ● Function by deploying a sidecar proxy (e.g., Envoy) next to each of your services ● Use iptables or equivalent to insure all service egress traffic is routed through sidecar ● Sidecar adds in trace IDs, circuit breaking, etc. 99
  • 101. datawire.io | https://d6e.co/2hZ0MQv Stateful services ● Databases and such can be deployed with a Kubernetes manifest -- same technique as Envoy or the existing services, but a different configuration ● Standard canary testing doesn’t work as well for stateful services ○ Envoy supports shadowing of requests ○ (We’re working on this so it’s more useable) ● If you have non-K8S resources (e.g., AWS RDS, etc.) consider adding the Terraform/Ansible/etc. Scripts for creating these resources in another folder as part of your standard service 101
  • 102. datawire.io | https://d6e.co/2hZ0MQv Organizational adoption ● Build an API service, just like Stripe or Twilio ● Staff with a single, spinoff team ● Define the purpose of the service from the perspective of the user ● Don’t allow the service team to make any changes to the existing code base, or vice versa 102
  • 103. datawire.io | https://d6e.co/2hZ0MQv Thank you! ● (Anonymous) feedback survey -- would be VERY grateful if you could spend 5 minutes filling it out so we can get better ○ https://d6e.co/2yxVnmn ● Feel free to email us: ○ richard@datawire.io ○ rhs@datawire.io ○ plombardi@datawire.io ● If you’re interested in any of our open source tools, check them out: ○ https://forge.sh for deployment ○ https://www.telepresence.io for fast development cycles ○ https://www.getambassador.io easiest way to deploy/configure Envoy on Kubernetes 103
  • 105. datawire.io | https://d6e.co/2hZ0MQv Testing microservices ● Traditional approach to testing a microservices architecture is with a staging environment ○ First push services to staging ○ Then run integration tests ○ If tests pass, then push to production ● But this introduces a big tradeoff ○ In order to do a “true” integration testing, you need to synchronize your different service versions in staging … and push those versions into production ○ But this introduces a bottleneck! ● So you want to think about more distributed strategies for integration testing 105