Traffic splitting is the ability to distribute traffic across two or more versions of an application. For example, I have container v1 and container v2 running inside of my application, and I want to evenly distribute traffic between the two containers.
Traffic splitting enables many interesting scenarios that will be required as Radius matures:
A/B traffic splitting
Manual rollbacks
Traffic splitting based off weight/percentages
Traffic splitting based off attributes of a request
And can lead to eventual patterns for:
Automatic rollbacks and rollouts based off health
Blue green deployment patterns
Current State
Currently today, if I have two containers that I want to equally split traffic to, whether the route be internal or external, there is no way to do that.
In this example, I stated that the sharedroute is provided by both containerv1 and v2, I want traffic to be split between them in some manner. By default, this should split traffic with some default routing rule.
For some of this app model work, we may need to support both the old way of doing type generation as well as the new for bicep types as the appcore RP isn't quite up and running yet.
[x] Add OSM as a configuration option on the environment.
[x] Add necessary properties to HTTPRoute and/or Gateway to support traffic splitting options
[x] Support weights per backend
[x] Support routes based off attributes of a request
Control plane changes
We will then need to make the changes necessary to generate the right CRDs s.t. OSM can use them.
[x] Create TrafficSplit CRD to route traffic from one service to multiple backend services
Overview
Traffic splitting is the ability to distribute traffic across two or more versions of an application. For example, I have container
v1
and containerv2
running inside of my application, and I want to evenly distribute traffic between the two containers.Traffic splitting enables many interesting scenarios that will be required as Radius matures:
And can lead to eventual patterns for:
Current State
Currently today, if I have two containers that I want to equally split traffic to, whether the route be internal or external, there is no way to do that.
In this example, I stated that the sharedroute is provided by both containerv1 and v2, I want traffic to be split between them in some manner. By default, this should split traffic with some default routing rule.
Work items
Infrastructure changes
For enabling traffic splitting, we should look into using Open Service Mesh (OSM). Open Service Mesh is a service mesh that is built on Envoy. It natively has the ability to support traffic splitting: https://release-v1-0.docs.openservicemesh.io/docs/guides/traffic_management/traffic_split/. OSM has the ability to do many other app model changes
Doc on the design of traffic splitting in OSM: https://github.com/servicemeshinterface/smi-spec/blob/v0.6.0/apis/traffic-split/v1alpha2/traffic-split.md
App model
See https://github.com/project-radius/app-model/issues/16 for the app model design.
For some of this app model work, we may need to support both the old way of doing type generation as well as the new for bicep types as the appcore RP isn't quite up and running yet.
Control plane changes
We will then need to make the changes necessary to generate the right CRDs s.t. OSM can use them.
Documentation and Samples
AB#6870