mirror of https://github.com/knative/docs.git
WIP: Draft version of the advanced routing demo
Just getting all the content in one place. Need some refactoring to a sample vs a demo script.
This commit is contained in:
parent
9c53576183
commit
73c32245cf
|
@ -0,0 +1,163 @@
|
|||
# Advanced deploy (aka blue/green)
|
||||
|
||||
Simple blue/green-like application deployment pattern illustrating process of updating live application without dropping any traffic.
|
||||
|
||||
> Note, this demo assumes you mapped domain to your cluster. For purposes of this demo we will use `project-serverless.com`. Substitude with your own domain.
|
||||
|
||||
## Deploy app (blue)
|
||||
|
||||
First the initial version of the applicaiton (blue). Save the beloow manifest as `stage1.yaml`
|
||||
|
||||
```yaml
|
||||
apiVersion: serving.knative.dev/v1alpha1
|
||||
kind: Route
|
||||
metadata:
|
||||
name: route-demo
|
||||
namespace: default
|
||||
spec:
|
||||
traffic:
|
||||
- configurationName: route-demo-config-v1
|
||||
percent: 100
|
||||
---
|
||||
apiVersion: serving.knative.dev/v1alpha1
|
||||
kind: Configuration
|
||||
metadata:
|
||||
name: route-demo-config-v1
|
||||
namespace: default
|
||||
spec:
|
||||
revisionTemplate:
|
||||
metadata:
|
||||
labels:
|
||||
knative.dev/type: container
|
||||
spec:
|
||||
container:
|
||||
image: gcr.io/knative-samples/knative-route-demo:blue
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: T_VERSION
|
||||
value: "blue"
|
||||
```
|
||||
|
||||
And then apply that manifest.
|
||||
|
||||
`kubectl apply -f stage1.yaml`
|
||||
|
||||
When route created and IP assigned, navigate to http://route-demo.default.project-serverless.com to show deployed app. Let's call this blue (aka v1) version of the app.
|
||||
|
||||
## Deploy new (green) version of the app
|
||||
|
||||
Again, save the following manifest representing application update to `stage2.yaml`
|
||||
|
||||
```yaml
|
||||
apiVersion: serving.knative.dev/v1alpha1
|
||||
kind: Route
|
||||
metadata:
|
||||
name: route-demo
|
||||
namespace: default
|
||||
spec:
|
||||
traffic:
|
||||
- configurationName: route-demo-config-v1
|
||||
percent: 100
|
||||
- configurationName: route-demo-config-v2
|
||||
percent: 0
|
||||
name: v2
|
||||
---
|
||||
apiVersion: serving.knative.dev/v1alpha1
|
||||
kind: Configuration
|
||||
metadata:
|
||||
name: route-demo-config-v2
|
||||
namespace: default
|
||||
spec:
|
||||
revisionTemplate:
|
||||
metadata:
|
||||
labels:
|
||||
knative.dev/type: container
|
||||
spec:
|
||||
container:
|
||||
image: gcr.io/knative-samples/knative-route-demo:green
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: T_VERSION
|
||||
value: "green"
|
||||
```
|
||||
|
||||
And then apply that file to your cluster
|
||||
|
||||
`kubectl apply -f stage2.yaml`
|
||||
|
||||
This will only stage v2. That means:
|
||||
|
||||
* Won't route any of v1 (blue) traffic to that new (green) version, and
|
||||
* Create new named route (`v2`) for testing of new the newlly deployed version
|
||||
|
||||
Refresh v1 (http://route-demo.default.project-serverless.com) to show our v2 takes no traffic,
|
||||
and navigate to http://v2.route-demo.default.project-serverless.com to show the new `v2` named route.
|
||||
|
||||
## Migrate portion of v1 (blew) traffic to v2 (green)
|
||||
|
||||
Now we are going to migrate traffic. Save this manofest to `stage3.yaml`
|
||||
|
||||
```yaml
|
||||
apiVersion: serving.knative.dev/v1alpha1
|
||||
kind: Route
|
||||
metadata:
|
||||
name: route-demo
|
||||
namespace: default
|
||||
spec:
|
||||
traffic:
|
||||
- configurationName: route-demo-config-v1
|
||||
percent: 50
|
||||
- configurationName: route-demo-config-v2
|
||||
percent: 50
|
||||
name: v2
|
||||
```
|
||||
|
||||
And then apply it
|
||||
|
||||
`kubectl apply -f stage3.yaml`
|
||||
|
||||
Refresh (a few times) the original route http://route-demo.default.project-serverless.com to show part of traffic going to v2
|
||||
|
||||
> Note, demo uses 50/50 split to assure you don't have to refresh too much, normally you would start with 1-2% maybe
|
||||
|
||||
## Re-route 100% of traffic to v2 (green)
|
||||
|
||||
Finally, we will migeate all traffic to the green version. Save the following manofest to `stage4.yaml`
|
||||
|
||||
```yaml
|
||||
apiVersion: serving.knative.dev/v1alpha1
|
||||
kind: Route
|
||||
metadata:
|
||||
name: route-demo
|
||||
namespace: default
|
||||
spec:
|
||||
traffic:
|
||||
- configurationName: route-demo-config-v1
|
||||
percent: 0
|
||||
name: v1
|
||||
- configurationName: route-demo-config-v2
|
||||
percent: 100
|
||||
```
|
||||
|
||||
`kubectl apply -f stage4.yaml`
|
||||
|
||||
This will complete the deployment by sending all traffic to the new (green) version.
|
||||
|
||||
Refresh original route http://route-demo.default.project-serverless.com bunch of times to show that all traffic goes to v2 (green) and v1 (blue) no longer takes traffic.
|
||||
|
||||
Optionally, I like to pointing out that:
|
||||
|
||||
* I kept v1 (blue) entry with 0% traffic for speed of reverting, if ever necessary
|
||||
* I added named route `v1` to the old (blue) version of the app to allow access for comp reasons
|
||||
|
||||
Navigate to http://v1.route-demo.default.project-serverless.com to show the old version accessible by `v1` named route
|
||||
|
||||
|
||||
## Cleanup
|
||||
|
||||
```
|
||||
kubectl delete -f stage4.yaml --ignore-not-found=true
|
||||
kubectl delete -f stage3.yaml --ignore-not-found=true
|
||||
kubectl delete -f stage2.yaml --ignore-not-found=true
|
||||
kubectl delete -f stage1.yaml --ignore-not-found=true
|
||||
```
|
Loading…
Reference in New Issue