[Serverless Knative] Knative Docs - Basics of Traffic Splitting
Basics of Traffic Splitting
The last super power đ of Knative Serving weâll go over in this tutorial is traffic splitting.
What are some common traffic splitting use-cases?
Splitting traffic is useful for a number of very common modern infrastructure needs, such as blue/green deployments - https://martinfowler.com/bliki/BlueGreenDeployment.html and canary deployments - https://martinfowler.com/bliki/CanaryRelease.html. Bringing these industry standards to bear on Kubernetes is as simple as a single CLI command on Knative or YAML tweak, letâs see how!
Creating a new Revision
You may have noticed that when you created your Knative Service you assigned it a revision-name
, âworldâ. If you used kn
, when your Service was created Knative returned both a URL and a âlatest revisionâ for your Knative Service. But what happens if you make a change to your Service?
What exactly is a Revision?"
You can think of a Revision - https://knative.dev/docs/serving/#serving-resources as a stateless, autoscaling, snapshot-in-time of application code and configuration.
A new Revision will get created each and every time you make changes to your Knative Service, whether you assign it a name or not. When splitting traffic, Knative splits traffic between different Revisions of your Knative Service.
Instead of TARGET
=âWorldâ update the environment variable TARGET
on your Knative Service hello
to greet âKnativeâ instead. Name this new revision hello-knative
kn
1 | kn service update hello \ |
As before, kn prints out some helpful information to the CLI.
Expected output:
1 | Service hello created to latest revision 'hello-knative' is available at URL: |
YAML
1 | # hello.yaml |
Once youâve edited your existing YAML file:
1 | kubectl apply -f hello.yaml |
Expected output:
1 | service.serving.knative.dev/hello configured |
Note, since we are updating an existing Knative Service hello
, the URL doesnât change, but our new Revision should have the new name hello-knative
Letâs access our Knative Service again on your browser http://hello.default.127.0.0.1.nip.io
to see the change, or use curl
in your terminal:
1 | curl http://hello.default.127.0.0.1.nip.io |
Expected output:
1 | Hello Knative! |
Splitting Traffic
You may at this point be wondering, âwhere did âHello World!â go?â Remember, Revisions are a stateless snapshot-in-time of application code and configuration, so your âhello-worldâ Revision is still available to you.
We can easily see a list of our existing revisions with the kn CLI:
kn
1 | kn revisions list |
Expected output:shell
1 | NAME SERVICE TRAFFIC TAGS GENERATION AGE CONDITIONS READY REASON |
kubectl
Though the following example doesnât cover it, you can peak under the hood to Kubernetes to see the revisions as Kubernetes sees them.
1 | kubectl get revisions |
Expected output:
1 | NAME SERVICE TRAFFIC TAGS GENERATION AGE CONDITIONS READY REASON |
The column most relevant for our purposes is TRAFFIC. It looks like 100% of traffic is going to our latest Revision (âhello-knativeâ) and 0% of traffic is going to the Revision we configured earlier (âhello-worldâ).
When you create a new Revision of a Knative Service, Knative defaults to directing 100% of traffic to this latest Revision. We can change this default behavior by specifying how much traffic we want each of our Revisions to receive.
Lets split traffic between our two Revisions:
Info
@latest
will always point to our âlatestâ Revision which, at the moment, is hello-knative
.
kn
1 | kn service update hello \ |
YAML
Add the following traffic
to the bottom of your existing YAML file:
1 | # hello.yaml |
Once youâve edited your existing YAML file:
1 | kubectl apply -f hello.yaml |
Verify traffic split configure correctly by listing the revisions again.
kn
1 | kn revisions list |
kubectl
Though the following example doesnât cover it, you can peak under the hood to Kubernetes to see the revisions as Kubernetes sees them.
1 | kubectl get revisions |
Expected output:
NAME SERVICE TRAFFIC TAGS GENERATION AGE CONDITIONS READY REASON
hello-knative hello 50% 2 10m 3 OK / 4 True
hello-world hello 50% 1 36m 3 OK / 4 True
kubectl
Access your Knative service on the browser again http://hello.default.127.0.0.1.nip.io
, and refresh multiple times to see the different output being served by each Revision.
Similarly, you can curl
the Service URL multiple times to see the traffic being split between the Revisions.
1 | curl http://hello.default.127.0.0.1.nip.io |
Expected output:
1 | curl http://hello.default.127.0.0.1.nip.io |
Congratulations, đ youâve successfully split traffic between 2 different Revisions of a Knative Service. Up next, Knative Eventing!
Clean Up
You wonât need the hello
Service in the Knative Eventing tutorial, so itâs best to clean up before you move forward:
kn
1 | kn service delete hello |
kubectl
1 | kubectl delete -f hello.yaml |
References
[1] Traffic Splitting - Knative - https://knative.dev/docs/getting-started/first-traffic-split/
[2] Home - Knative - https://knative.dev/docs/
[3] Installing Guide - https://knative.dev/docs/install/
[4] blue/green deployments - https://martinfowler.com/bliki/BlueGreenDeployment.html
[5] canary deployments - https://martinfowler.com/bliki/CanaryRelease.html
[6] Revision - https://knative.dev/docs/serving/#serving-resources