docs/serving/updating-existing-app.md

179 lines
4.6 KiB
Markdown

# Updating an Existing App
This guide demonstrates how to update an application that is serving
traffic to a new version. With Knative, it's easy to reroute traffic
from one version of an application to another by changing the routing
configuration.
A sample app is used to demonstrate the flow of updating an
application, but the same principles can be applied to your own Knative
application.
## Before you begin
We assume you have:
* [Installed Knative](../install/README.md) on a Kubernetes cluster
* [Configured a custom domain](../serving/using-a-custom-domain.md) for use with Knative
## Deploying the first version
We'll be deploying an image of a demo application that displays the text
"App v1" on a blue background.
First, create a new file called `stage1.yaml`and copy this into it:
```yaml
apiVersion: serving.knative.dev/v1alpha1
kind: Route
metadata:
name: route-demo # The name of our route; appears in the URL to access the app
namespace: default # The namespace we're working in; also appears in the URL to access the app
spec:
traffic:
- configurationName: route-demo-config-v1
percent: 100 # All traffic goes to this configutation
---
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 # The URL to the sample app
imagePullPolicy: Always
env:
- name: T_VERSION
value: "blue"
```
Save the file, then deploy the application to your cluster:
```bash
kubectl apply -f stage1.yaml
```
You'll now be able to view the sample app at
http://route-demo.default.YOUR_CUSTOM_DOMAIN.com (replace `YOUR_CUSTOM_DOMAIN`)
with the [custom domain](../serving/using-a-custom-domain.md) you configured for
use with Knative.
## Deploying the second version
Create a new file called `stage2.yaml` and copy this into it:
```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"
```
Save the file, then deploy the application to your cluster:
```bash
kubectl apply -f stage2.yaml
```
This deploys an image of a demo application that displays the text
"App v2" on a green background.
This will only stage v2. That means:
* No traffic will be routed to the v2 of the app at http://route-demo.default.YOUR_CUSTOM_DOMAIN.com
* Knative creates a new route named v2 for testing the newly deployed version at http://v2.route-demo.default.YOUR_CUSTOM_DOMAIN.com
## Migrating traffic to the new version
Create a new file called `stage3.yaml` and copy this into it:
```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
```
Save the file, then deploy the updated routing configuration to your cluster:
```bash
kubectl apply -f stage3.yaml
```
Refresh the original route (http://route-demo.default.YOUR_CUSTOM_DOMAIN.com) a
few times to show that some traffic now goes to v2 of the app.
> Note, this sample shows a 50/50 split to assure you don't have to refresh too much,
but it's recommended to start with 1-2% in a production environment
## Reouting all traffic to the new version
Create a new file called `stage4.yaml` and copy this into it:
```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
```
Save the file, then deploy the updated routing configuration to your cluster:
```bash
kubectl apply -f stage4.yaml
```
Refresh the original route (http://route-demo.default.YOUR_CUSTOM_DOMAIN.com) a
few times to verify that no traffic is being routed to v1 of the app.
We added a named route to v1 of the app, so you can now access it at
http://v1.route-demo.default.YOUR_CUSTOM_DOMAIN.com.