From 62b906d30b5c16eb0371ebadf4a749120b7fff2f Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 11:49:32 +0200 Subject: [PATCH 01/11] Add canary HTTP match conditions and iterations --- pkg/apis/flagger/v1alpha3/types.go | 15 +++++++++------ .../flagger/v1alpha3/zz_generated.deepcopy.go | 7 +++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/pkg/apis/flagger/v1alpha3/types.go b/pkg/apis/flagger/v1alpha3/types.go index 05dece8c8..cf43691d0 100755 --- a/pkg/apis/flagger/v1alpha3/types.go +++ b/pkg/apis/flagger/v1alpha3/types.go @@ -98,6 +98,7 @@ type CanaryStatus struct { Phase CanaryPhase `json:"phase"` FailedChecks int `json:"failedChecks"` CanaryWeight int `json:"canaryWeight"` + Iterations int `json:"iterations"` // +optional TrackedConfigs *map[string]string `json:"trackedConfigs,omitempty"` // +optional @@ -122,12 +123,14 @@ type CanaryService struct { // CanaryAnalysis is used to describe how the analysis should be done type CanaryAnalysis struct { - Interval string `json:"interval"` - Threshold int `json:"threshold"` - MaxWeight int `json:"maxWeight"` - StepWeight int `json:"stepWeight"` - Metrics []CanaryMetric `json:"metrics"` - Webhooks []CanaryWebhook `json:"webhooks,omitempty"` + Interval string `json:"interval"` + Threshold int `json:"threshold"` + MaxWeight int `json:"maxWeight"` + StepWeight int `json:"stepWeight"` + Metrics []CanaryMetric `json:"metrics"` + Webhooks []CanaryWebhook `json:"webhooks,omitempty"` + Match []istiov1alpha3.HTTPMatchRequest `json:"match,omitempty"` + Iterations int `json:"iterations,omitempty"` } // CanaryMetric holds the reference to Istio metrics used for canary analysis diff --git a/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go index 638a94572..7567dff07 100644 --- a/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go @@ -69,6 +69,13 @@ func (in *CanaryAnalysis) DeepCopyInto(out *CanaryAnalysis) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Match != nil { + in, out := &in.Match, &out.Match + *out = make([]istiov1alpha3.HTTPMatchRequest, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } From bf1ca293dcb5b56f823372297ce429e3ac9793e5 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 11:54:41 +0200 Subject: [PATCH 02/11] Implement fix routing for canary analysis Allow A/B testing scenarios where instead of weighted routing the traffic is split between the primary and canary based on HTTP headers or cookies. --- pkg/controller/deployer.go | 28 +++++++++ pkg/controller/scheduler.go | 81 ++++++++++++++++++++++++- pkg/router/istio.go | 115 +++++++++++++++++++++++++++++++++--- 3 files changed, 213 insertions(+), 11 deletions(-) diff --git a/pkg/controller/deployer.go b/pkg/controller/deployer.go index fb7a2bd76..74f48c682 100644 --- a/pkg/controller/deployer.go +++ b/pkg/controller/deployer.go @@ -220,6 +220,32 @@ func (c *CanaryDeployer) SetStatusWeight(cd *flaggerv1.Canary, val int) error { return nil } +// SetStatusWeight updates the canary status weight value +func (c *CanaryDeployer) SetStatusIterations(cd *flaggerv1.Canary, val int) error { + cdCopy := cd.DeepCopy() + cdCopy.Status.Iterations = val + cdCopy.Status.LastTransitionTime = metav1.Now() + + cd, err := c.flaggerClient.FlaggerV1alpha3().Canaries(cd.Namespace).UpdateStatus(cdCopy) + if err != nil { + return fmt.Errorf("canary %s.%s status update error %v", cdCopy.Name, cdCopy.Namespace, err) + } + return nil +} + +// SetStatusWeight updates the canary status weight value +func (c *CanaryDeployer) IncrementStatusIterations(cd *flaggerv1.Canary) error { + cdCopy := cd.DeepCopy() + cdCopy.Status.Iterations = cdCopy.Status.Iterations + 1 + cdCopy.Status.LastTransitionTime = metav1.Now() + + cd, err := c.flaggerClient.FlaggerV1alpha3().Canaries(cd.Namespace).UpdateStatus(cdCopy) + if err != nil { + return fmt.Errorf("canary %s.%s status update error %v", cdCopy.Name, cdCopy.Namespace, err) + } + return nil +} + // SetStatusPhase updates the canary status phase func (c *CanaryDeployer) SetStatusPhase(cd *flaggerv1.Canary, phase flaggerv1.CanaryPhase) error { cdCopy := cd.DeepCopy() @@ -228,6 +254,7 @@ func (c *CanaryDeployer) SetStatusPhase(cd *flaggerv1.Canary, phase flaggerv1.Ca if phase != flaggerv1.CanaryProgressing { cdCopy.Status.CanaryWeight = 0 + cdCopy.Status.Iterations = 0 } cd, err := c.flaggerClient.FlaggerV1alpha3().Canaries(cd.Namespace).UpdateStatus(cdCopy) @@ -261,6 +288,7 @@ func (c *CanaryDeployer) SyncStatus(cd *flaggerv1.Canary, status flaggerv1.Canar cdCopy.Status.Phase = status.Phase cdCopy.Status.CanaryWeight = status.CanaryWeight cdCopy.Status.FailedChecks = status.FailedChecks + cdCopy.Status.Iterations = status.Iterations cdCopy.Status.LastAppliedSpec = base64.StdEncoding.EncodeToString(specJson) cdCopy.Status.LastTransitionTime = metav1.Now() cdCopy.Status.TrackedConfigs = configs diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index d60a7e953..f9047b750 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -76,10 +76,13 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh // check if the canary exists cd, err := c.flaggerClient.FlaggerV1alpha3().Canaries(namespace).Get(name, v1.GetOptions{}) if err != nil { - c.logger.With("canary", fmt.Sprintf("%s.%s", name, namespace)).Errorf("Canary %s.%s not found", name, namespace) + c.logger.With("canary", fmt.Sprintf("%s.%s", name, namespace)). + Errorf("Canary %s.%s not found", name, namespace) return } + primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) + // create primary deployment and hpa if needed if err := c.deployer.Sync(cd); err != nil { c.recordEventWarningf(cd, "%v", err) @@ -160,6 +163,7 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh Phase: flaggerv1.CanaryProgressing, CanaryWeight: 0, FailedChecks: 0, + Iterations: 0, } if err := c.deployer.SyncStatus(cd, status); err != nil { c.recordEventWarningf(cd, "%v", err) @@ -247,7 +251,72 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh } } - // increase canary traffic percentage + // canary fix routing: A/B testing + if len(cd.Spec.CanaryAnalysis.Match) > 0 { + // route traffic to canary and increment iterations + if cd.Spec.CanaryAnalysis.Iterations > cd.Status.Iterations { + if err := meshRouter.SetRoutes(cd, 0, 100); err != nil { + c.recordEventWarningf(cd, "%v", err) + return + } + c.recorder.SetWeight(cd, 100, 0) + + if err := c.deployer.SetStatusIterations(cd, cd.Status.Iterations+1); err != nil { + c.recordEventWarningf(cd, "%v", err) + return + } + c.recordEventInfof(cd, "Advance %s.%s canary iteration %v/%v", + cd.Name, cd.Namespace, cd.Status.Iterations+1, cd.Spec.CanaryAnalysis.Iterations) + return + } + + // promote canary - max iterations reached + if cd.Spec.CanaryAnalysis.Iterations == cd.Status.Iterations { + c.recordEventInfof(cd, "Copying %s.%s template spec to %s.%s", + cd.Spec.TargetRef.Name, cd.Namespace, primaryName, cd.Namespace) + if err := c.deployer.Promote(cd); err != nil { + c.recordEventWarningf(cd, "%v", err) + return + } + // increment iterations + if err := c.deployer.SetStatusIterations(cd, cd.Status.Iterations+1); err != nil { + c.recordEventWarningf(cd, "%v", err) + return + } + return + } + + // shutdown canary + if cd.Spec.CanaryAnalysis.Iterations < cd.Status.Iterations { + // route all traffic to the primary + if err := meshRouter.SetRoutes(cd, 100, 0); err != nil { + c.recordEventWarningf(cd, "%v", err) + return + } + c.recorder.SetWeight(cd, 100, 0) + c.recordEventInfof(cd, "Promotion completed! Scaling down %s.%s", cd.Spec.TargetRef.Name, cd.Namespace) + + // canary scale to zero + if err := c.deployer.Scale(cd, 0); err != nil { + c.recordEventWarningf(cd, "%v", err) + return + } + + // update status phase + if err := c.deployer.SetStatusPhase(cd, flaggerv1.CanarySucceeded); err != nil { + c.recordEventWarningf(cd, "%v", err) + return + } + c.recorder.SetStatus(cd) + c.sendNotification(cd, "Canary analysis completed successfully, promotion finished.", + false, false) + return + } + + return + } + + // canary incremental traffic weight if canaryWeight < maxWeight { primaryWeight -= cd.Spec.CanaryAnalysis.StepWeight if primaryWeight < 0 { @@ -273,7 +342,6 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh c.recordEventInfof(cd, "Advance %s.%s canary weight %v", cd.Name, cd.Namespace, canaryWeight) // promote canary - primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) if canaryWeight == maxWeight { c.recordEventInfof(cd, "Copying %s.%s template spec to %s.%s", cd.Spec.TargetRef.Name, cd.Namespace, primaryName, cd.Namespace) @@ -403,6 +471,13 @@ func (c *Controller) hasCanaryRevisionChanged(cd *flaggerv1.Canary) bool { return false } +func (c *Controller) hasMaxIterations(cd *flaggerv1.Canary) bool { + if cd.Status.Iterations == cd.Status.Iterations { + return true + } + return false +} + func (c *Controller) analyseCanary(r *flaggerv1.Canary) bool { // run external checks for _, webhook := range r.Spec.CanaryAnalysis.Webhooks { diff --git a/pkg/router/istio.go b/pkg/router/istio.go index feef64d16..7f3ad674e 100644 --- a/pkg/router/istio.go +++ b/pkg/router/istio.go @@ -55,7 +55,7 @@ func (ir *IstioRouter) Sync(canary *flaggerv1.Canary) error { } // create destinations with primary weight 100% and canary weight 0% - route := []istiov1alpha3.DestinationWeight{ + canaryRoute := []istiov1alpha3.DestinationWeight{ { Destination: istiov1alpha3.Destination{ Host: primaryName, @@ -87,11 +87,45 @@ func (ir *IstioRouter) Sync(canary *flaggerv1.Canary) error { Retries: canary.Spec.Service.Retries, CorsPolicy: canary.Spec.Service.CorsPolicy, AppendHeaders: addHeaders(canary), - Route: route, + Route: canaryRoute, }, }, } + if len(canary.Spec.CanaryAnalysis.Match) > 0 { + canaryMatch := append(canary.Spec.Service.Match, canary.Spec.CanaryAnalysis.Match...) + newSpec.Http = []istiov1alpha3.HTTPRoute{ + { + Match: canaryMatch, + Rewrite: canary.Spec.Service.Rewrite, + Timeout: canary.Spec.Service.Timeout, + Retries: canary.Spec.Service.Retries, + CorsPolicy: canary.Spec.Service.CorsPolicy, + AppendHeaders: addHeaders(canary), + Route: canaryRoute, + }, + { + Match: canary.Spec.Service.Match, + Rewrite: canary.Spec.Service.Rewrite, + Timeout: canary.Spec.Service.Timeout, + Retries: canary.Spec.Service.Retries, + CorsPolicy: canary.Spec.Service.CorsPolicy, + AppendHeaders: addHeaders(canary), + Route: []istiov1alpha3.DestinationWeight{ + { + Destination: istiov1alpha3.Destination{ + Host: primaryName, + Port: istiov1alpha3.PortSelector{ + Number: uint32(canary.Spec.Service.Port), + }, + }, + Weight: 100, + }, + }, + }, + } + } + virtualService, err := ir.istioClient.NetworkingV1alpha3().VirtualServices(canary.Namespace).Get(targetName, metav1.GetOptions{}) // insert if errors.IsNotFound(err) { @@ -160,17 +194,25 @@ func (ir *IstioRouter) GetRoutes(canary *flaggerv1.Canary) ( return } + var httpRoute istiov1alpha3.HTTPRoute for _, http := range vs.Spec.Http { - for _, route := range http.Route { - if route.Destination.Host == fmt.Sprintf("%s-primary", targetName) { - primaryWeight = route.Weight - } - if route.Destination.Host == fmt.Sprintf("%s-canary", targetName) { - canaryWeight = route.Weight + for _, r := range http.Route { + if r.Destination.Host == fmt.Sprintf("%s-canary", targetName) { + httpRoute = http + break } } } + for _, route := range httpRoute.Route { + if route.Destination.Host == fmt.Sprintf("%s-primary", targetName) { + primaryWeight = route.Weight + } + if route.Destination.Host == fmt.Sprintf("%s-canary", targetName) { + canaryWeight = route.Weight + } + } + if primaryWeight == 0 && canaryWeight == 0 { err = fmt.Errorf("VirtualService %s.%s does not contain routes for %s-primary and %s-canary", targetName, canary.Namespace, targetName, targetName) @@ -196,6 +238,8 @@ func (ir *IstioRouter) SetRoutes( } vsCopy := vs.DeepCopy() + + // weighted routing (progressive canary) vsCopy.Spec.Http = []istiov1alpha3.HTTPRoute{ { Match: canary.Spec.Service.Match, @@ -227,6 +271,61 @@ func (ir *IstioRouter) SetRoutes( }, } + // fix routing (A/B testing) + if len(canary.Spec.CanaryAnalysis.Match) > 0 { + // merge the common routes with the canary ones + canaryMatch := append(canary.Spec.Service.Match, canary.Spec.CanaryAnalysis.Match...) + vsCopy.Spec.Http = []istiov1alpha3.HTTPRoute{ + { + Match: canaryMatch, + Rewrite: canary.Spec.Service.Rewrite, + Timeout: canary.Spec.Service.Timeout, + Retries: canary.Spec.Service.Retries, + CorsPolicy: canary.Spec.Service.CorsPolicy, + AppendHeaders: addHeaders(canary), + Route: []istiov1alpha3.DestinationWeight{ + { + Destination: istiov1alpha3.Destination{ + Host: fmt.Sprintf("%s-primary", targetName), + Port: istiov1alpha3.PortSelector{ + Number: uint32(canary.Spec.Service.Port), + }, + }, + Weight: primaryWeight, + }, + { + Destination: istiov1alpha3.Destination{ + Host: fmt.Sprintf("%s-canary", targetName), + Port: istiov1alpha3.PortSelector{ + Number: uint32(canary.Spec.Service.Port), + }, + }, + Weight: canaryWeight, + }, + }, + }, + { + Match: canary.Spec.Service.Match, + Rewrite: canary.Spec.Service.Rewrite, + Timeout: canary.Spec.Service.Timeout, + Retries: canary.Spec.Service.Retries, + CorsPolicy: canary.Spec.Service.CorsPolicy, + AppendHeaders: addHeaders(canary), + Route: []istiov1alpha3.DestinationWeight{ + { + Destination: istiov1alpha3.Destination{ + Host: fmt.Sprintf("%s-primary", targetName), + Port: istiov1alpha3.PortSelector{ + Number: uint32(canary.Spec.Service.Port), + }, + }, + Weight: primaryWeight, + }, + }, + }, + } + } + vs, err = ir.istioClient.NetworkingV1alpha3().VirtualServices(canary.Namespace).Update(vsCopy) if err != nil { return fmt.Errorf("VirtualService %s.%s update failed: %v", targetName, canary.Namespace, err) From 49c942bea0364c9c7e81d585e20fc1d68963faf5 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 11:55:04 +0200 Subject: [PATCH 03/11] Add A/B testing examples --- README.md | 2 +- artifacts/ab-testing/canary.yaml | 61 +++++++++++++++++++++++++ artifacts/ab-testing/deployment.yaml | 67 ++++++++++++++++++++++++++++ artifacts/ab-testing/hpa.yaml | 19 ++++++++ docs/gitbook/how-it-works.md | 40 +++++++++++++++++ 5 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 artifacts/ab-testing/canary.yaml create mode 100644 artifacts/ab-testing/deployment.yaml create mode 100644 artifacts/ab-testing/hpa.yaml diff --git a/README.md b/README.md index 899488d3e..d51720185 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Flagger documentation can be found at [docs.flagger.app](https://docs.flagger.ap * [Routing](https://docs.flagger.app/how-it-works#istio-routing) * [Canary deployment stages](https://docs.flagger.app/how-it-works#canary-deployment) * [Canary analysis](https://docs.flagger.app/how-it-works#canary-analysis) + * [A/B testing](https://docs.flagger.app/how-it-works#ab-testing) * [HTTP metrics](https://docs.flagger.app/how-it-works#http-metrics) * [Custom metrics](https://docs.flagger.app/how-it-works#custom-metrics) * [Webhooks](https://docs.flagger.app/how-it-works#webhooks) @@ -167,7 +168,6 @@ For more details on how the canary analysis and promotion works please [read the ### Roadmap -* Add A/B testing capabilities using fixed routing based on HTTP headers and cookies match conditions * Integrate with other service mesh technologies like AWS AppMesh and Linkerd v2 * Add support for comparing the canary metrics to the primary ones and do the validation based on the derivation between the two diff --git a/artifacts/ab-testing/canary.yaml b/artifacts/ab-testing/canary.yaml new file mode 100644 index 000000000..679ed18bc --- /dev/null +++ b/artifacts/ab-testing/canary.yaml @@ -0,0 +1,61 @@ +apiVersion: flagger.app/v1alpha3 +kind: Canary +metadata: + name: abtest + namespace: test +spec: + # deployment reference + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: abtest + # the maximum time in seconds for the canary deployment + # to make progress before it is rollback (default 600s) + progressDeadlineSeconds: 60 + # HPA reference (optional) + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: abtest + service: + # container port + port: 9898 + # Istio gateways (optional) + gateways: + - public-gateway.istio-system.svc.cluster.local + # Istio virtual service host names (optional) + hosts: + - abtest.istio.weavedx.com + canaryAnalysis: + # schedule interval (default 60s) + interval: 10s + # max number of failed metric checks before rollback + threshold: 10 + # total number of iterations + iterations: 10 + # canary match condition + match: + - headers: + user-agent: + regex: "^(?!.*Chrome)(?=.*\bSafari\b).*$" + - headers: + cookie: + regex: "^(.*?;)?(user=test)(;.*)?$" + metrics: + - name: istio_requests_total + # minimum req success rate (non 5xx responses) + # percentage (0-100) + threshold: 99 + interval: 1m + - name: istio_request_duration_seconds_bucket + # maximum req duration P99 + # milliseconds + threshold: 500 + interval: 30s + # external checks (optional) + webhooks: + - name: load-test + url: http://flagger-loadtester.test/ + timeout: 5s + metadata: + cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/" diff --git a/artifacts/ab-testing/deployment.yaml b/artifacts/ab-testing/deployment.yaml new file mode 100644 index 000000000..373eb3bfb --- /dev/null +++ b/artifacts/ab-testing/deployment.yaml @@ -0,0 +1,67 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: abtest + namespace: test + labels: + app: abtest +spec: + minReadySeconds: 5 + revisionHistoryLimit: 5 + progressDeadlineSeconds: 60 + strategy: + rollingUpdate: + maxUnavailable: 0 + type: RollingUpdate + selector: + matchLabels: + app: abtest + template: + metadata: + annotations: + prometheus.io/scrape: "true" + labels: + app: abtest + spec: + containers: + - name: podinfod + image: quay.io/stefanprodan/podinfo:1.4.0 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 9898 + name: http + protocol: TCP + command: + - ./podinfo + - --port=9898 + - --level=info + - --random-delay=false + - --random-error=false + env: + - name: PODINFO_UI_COLOR + value: blue + livenessProbe: + exec: + command: + - podcli + - check + - http + - localhost:9898/healthz + initialDelaySeconds: 5 + timeoutSeconds: 5 + readinessProbe: + exec: + command: + - podcli + - check + - http + - localhost:9898/readyz + initialDelaySeconds: 5 + timeoutSeconds: 5 + resources: + limits: + cpu: 2000m + memory: 512Mi + requests: + cpu: 100m + memory: 64Mi diff --git a/artifacts/ab-testing/hpa.yaml b/artifacts/ab-testing/hpa.yaml new file mode 100644 index 000000000..a50481506 --- /dev/null +++ b/artifacts/ab-testing/hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: abtest + namespace: test +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: abtest + minReplicas: 2 + maxReplicas: 4 + metrics: + - type: Resource + resource: + name: cpu + # scale up if usage is above + # 99% of the requested CPU (100m) + targetAverageUtilization: 99 diff --git a/docs/gitbook/how-it-works.md b/docs/gitbook/how-it-works.md index cf69fec65..d672e7e84 100644 --- a/docs/gitbook/how-it-works.md +++ b/docs/gitbook/how-it-works.md @@ -327,6 +327,46 @@ At any time you can set the `spec.skipAnalysis: true`. When skip analysis is enabled, Flagger checks if the canary deployment is healthy and promotes it without analysing it. If an analysis is underway, Flagger cancels it and runs the promotion. +### A/B Testing + +Besides weighted routing, Flagger can be configured to route traffic to the canary based on HTTP match conditions. +In an A/B testing scenario, you'll be using HTTP headers or cookies to target a certain segment of your users. + +Spec: + +```yaml + canaryAnalysis: + # schedule interval (default 60s) + interval: 1m + # total number of iterations + iterations: 10 + # max number of failed iterations before rollback + threshold: 2 + # canary match condition + match: + - headers: + user-agent: + regex: "^(?!.*Chrome)(?=.*\bSafari\b).*$" + - headers: + cookie: + regex: "^(.*?;)?(user=test)(;.*)?$" +``` + +The above configuration will run an analysis for ten minutes targeting the Safari users and those that have a test cookie. +You can determine the minimum time that it takes to validate and promote a canary deployment using this formula: + +``` +interval * iterations +``` + +And the time it takes for a canary to be rollback when the metrics or webhook checks are failing: + +``` +interval * threshold +``` + +Make sure that the analysis threshold is lower than the number of iterations. + ### HTTP Metrics The canary analysis is using the following Prometheus queries: From 3c7a561db8d6e4c0fbb0ece0a5782bcef9e72639 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 12:24:43 +0200 Subject: [PATCH 04/11] Add Istio routes A/B testing unit tests --- pkg/router/istio_test.go | 60 +++++++++++++++++++++++ pkg/router/router_test.go | 100 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 156 insertions(+), 4 deletions(-) diff --git a/pkg/router/istio_test.go b/pkg/router/istio_test.go index 5bd83927b..26f5a9fc8 100644 --- a/pkg/router/istio_test.go +++ b/pkg/router/istio_test.go @@ -239,3 +239,63 @@ func TestIstioRouter_CORS(t *testing.T) { t.Fatalf("Got CORS allow methods %v wanted %v", len(methods), 2) } } + +func TestIstioRouter_ABTest(t *testing.T) { + mocks := setupfakeClients() + router := &IstioRouter{ + logger: mocks.logger, + flaggerClient: mocks.flaggerClient, + istioClient: mocks.istioClient, + kubeClient: mocks.kubeClient, + } + + err := router.Sync(mocks.abtest) + if err != nil { + t.Fatal(err.Error()) + } + + // test insert + vs, err := mocks.istioClient.NetworkingV1alpha3().VirtualServices("default").Get("abtest", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + if len(vs.Spec.Http) != 2 { + t.Errorf("Got Istio VS Http %v wanted %v", len(vs.Spec.Http), 2) + } + + p := 0 + c := 100 + + err = router.SetRoutes(mocks.abtest, p, c) + if err != nil { + t.Fatal(err.Error()) + } + + vs, err = mocks.istioClient.NetworkingV1alpha3().VirtualServices("default").Get("abtest", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + pRoute := istiov1alpha3.DestinationWeight{} + cRoute := istiov1alpha3.DestinationWeight{} + + for _, http := range vs.Spec.Http { + for _, route := range http.Route { + if route.Destination.Host == fmt.Sprintf("%s-primary", mocks.abtest.Spec.TargetRef.Name) { + pRoute = route + } + if route.Destination.Host == fmt.Sprintf("%s-canary", mocks.abtest.Spec.TargetRef.Name) { + cRoute = route + } + } + } + + if pRoute.Weight != p { + t.Errorf("Got primary weight %v wanted %v", pRoute.Weight, p) + } + + if cRoute.Weight != c { + t.Errorf("Got canary weight %v wanted %v", cRoute.Weight, c) + } +} diff --git a/pkg/router/router_test.go b/pkg/router/router_test.go index e3bc14607..fc08db1d2 100644 --- a/pkg/router/router_test.go +++ b/pkg/router/router_test.go @@ -2,6 +2,7 @@ package router import ( "github.com/stefanprodan/flagger/pkg/apis/flagger/v1alpha3" + istiov1alpha1 "github.com/stefanprodan/flagger/pkg/apis/istio/common/v1alpha1" istiov1alpha3 "github.com/stefanprodan/flagger/pkg/apis/istio/v1alpha3" clientset "github.com/stefanprodan/flagger/pkg/client/clientset/versioned" fakeFlagger "github.com/stefanprodan/flagger/pkg/client/clientset/versioned/fake" @@ -17,6 +18,7 @@ import ( type fakeClients struct { canary *v1alpha3.Canary + abtest *v1alpha3.Canary kubeClient kubernetes.Interface istioClient clientset.Interface flaggerClient clientset.Interface @@ -25,17 +27,17 @@ type fakeClients struct { func setupfakeClients() fakeClients { canary := newMockCanary() - flaggerClient := fakeFlagger.NewSimpleClientset(canary) + abtest := newMockABTest() + flaggerClient := fakeFlagger.NewSimpleClientset(canary, abtest) - kubeClient := fake.NewSimpleClientset( - newMockDeployment(), - ) + kubeClient := fake.NewSimpleClientset(newMockDeployment(), newMockABTestDeployment()) istioClient := fakeFlagger.NewSimpleClientset() logger, _ := logging.NewLogger("debug") return fakeClients{ canary: canary, + abtest: abtest, kubeClient: kubeClient, istioClient: istioClient, flaggerClient: flaggerClient, @@ -93,6 +95,51 @@ func newMockCanary() *v1alpha3.Canary { return cd } +func newMockABTest() *v1alpha3.Canary { + cd := &v1alpha3.Canary{ + TypeMeta: metav1.TypeMeta{APIVersion: v1alpha3.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "abtest", + }, + Spec: v1alpha3.CanarySpec{ + TargetRef: hpav1.CrossVersionObjectReference{ + Name: "abtest", + APIVersion: "apps/v1", + Kind: "Deployment", + }, + Service: v1alpha3.CanaryService{ + Port: 9898, + }, CanaryAnalysis: v1alpha3.CanaryAnalysis{ + Threshold: 10, + Iterations: 2, + Match: []istiov1alpha3.HTTPMatchRequest{ + { + Headers: map[string]istiov1alpha1.StringMatch{ + "x-user-type": { + Exact: "test", + }, + }, + }, + }, + Metrics: []v1alpha3.CanaryMetric{ + { + Name: "istio_requests_total", + Threshold: 99, + Interval: "1m", + }, + { + Name: "istio_request_duration_seconds_bucket", + Threshold: 500, + Interval: "1m", + }, + }, + }, + }, + } + return cd +} + func newMockDeployment() *appsv1.Deployment { d := &appsv1.Deployment{ TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, @@ -137,3 +184,48 @@ func newMockDeployment() *appsv1.Deployment { return d } + +func newMockABTestDeployment() *appsv1.Deployment { + d := &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "abtest", + }, + Spec: appsv1.DeploymentSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "abtest", + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": "abtest", + }, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "podinfo", + Image: "quay.io/stefanprodan/podinfo:1.4.0", + Command: []string{ + "./podinfo", + "--port=9898", + }, + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: 9898, + Protocol: corev1.ProtocolTCP, + }, + }, + }, + }, + }, + }, + }, + } + + return d +} From 6ba69dce0ab83630f4b0e1d9853acfd8b21d16b1 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 12:31:35 +0200 Subject: [PATCH 05/11] Add iterations field to CRD validation --- artifacts/flagger/crd.yaml | 2 ++ charts/flagger/templates/crd.yaml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/artifacts/flagger/crd.yaml b/artifacts/flagger/crd.yaml index c628d5770..0d69525d0 100644 --- a/artifacts/flagger/crd.yaml +++ b/artifacts/flagger/crd.yaml @@ -82,6 +82,8 @@ spec: interval: type: string pattern: "^[0-9]+(m|s)" + iterations: + type: number threshold: type: number maxWeight: diff --git a/charts/flagger/templates/crd.yaml b/charts/flagger/templates/crd.yaml index efd880e69..f00e2b087 100644 --- a/charts/flagger/templates/crd.yaml +++ b/charts/flagger/templates/crd.yaml @@ -83,6 +83,8 @@ spec: interval: type: string pattern: "^[0-9]+(m|s)" + iterations: + type: number threshold: type: number maxWeight: From 780ba82385419b0f1b27747c5b941597fee89ed0 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 13:05:25 +0200 Subject: [PATCH 06/11] Log namespace restriction if one exists --- cmd/flagger/main.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cmd/flagger/main.go b/cmd/flagger/main.go index 6e3edb89a..b12c745d2 100644 --- a/cmd/flagger/main.go +++ b/cmd/flagger/main.go @@ -87,12 +87,6 @@ func main() { logger.Fatalf("Error building example clientset: %s", err.Error()) } - if namespace == "" { - logger.Infof("Flagger Canary's Watcher is on all namespace") - } else { - logger.Infof("Flagger Canary's Watcher is on namespace %s", namespace) - } - flaggerInformerFactory := informers.NewSharedInformerFactoryWithOptions(flaggerClient, time.Second*30, informers.WithNamespace(namespace)) canaryInformer := flaggerInformerFactory.Flagger().V1alpha3().Canaries() @@ -105,6 +99,9 @@ func main() { } logger.Infof("Connected to Kubernetes API %s", ver) + if namespace != "" { + logger.Infof("Watching namespace %s", namespace) + } ok, err := controller.CheckMetricsServer(metricsServer) if ok { From e80a3d323210f2a314e890c81a540f30d82aad48 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 13:06:39 +0200 Subject: [PATCH 07/11] Add A/B testing scheduling unit tests --- pkg/controller/controller_test.go | 56 ++++++++++++++++++++- pkg/controller/deployer_test.go | 16 +++--- pkg/controller/scheduler_test.go | 83 ++++++++++++++++++++++++++++--- 3 files changed, 140 insertions(+), 15 deletions(-) diff --git a/pkg/controller/controller_test.go b/pkg/controller/controller_test.go index 7aefe34a5..deacdeca1 100644 --- a/pkg/controller/controller_test.go +++ b/pkg/controller/controller_test.go @@ -2,6 +2,8 @@ package controller import ( "github.com/stefanprodan/flagger/pkg/apis/flagger/v1alpha3" + istiov1alpha1 "github.com/stefanprodan/flagger/pkg/apis/istio/common/v1alpha1" + istiov1alpha3 "github.com/stefanprodan/flagger/pkg/apis/istio/v1alpha3" clientset "github.com/stefanprodan/flagger/pkg/client/clientset/versioned" fakeFlagger "github.com/stefanprodan/flagger/pkg/client/clientset/versioned/fake" informers "github.com/stefanprodan/flagger/pkg/client/informers/externalversions" @@ -38,9 +40,12 @@ type Mocks struct { router router.Interface } -func SetupMocks() Mocks { +func SetupMocks(abtest bool) Mocks { // init canary canary := newTestCanary() + if abtest { + canary = newTestCanaryAB() + } flaggerClient := fakeFlagger.NewSimpleClientset(canary) // init kube clientset and register mock objects @@ -261,6 +266,55 @@ func newTestCanary() *v1alpha3.Canary { return cd } +func newTestCanaryAB() *v1alpha3.Canary { + cd := &v1alpha3.Canary{ + TypeMeta: metav1.TypeMeta{APIVersion: v1alpha3.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "podinfo", + }, + Spec: v1alpha3.CanarySpec{ + TargetRef: hpav1.CrossVersionObjectReference{ + Name: "podinfo", + APIVersion: "apps/v1", + Kind: "Deployment", + }, + AutoscalerRef: &hpav1.CrossVersionObjectReference{ + Name: "podinfo", + APIVersion: "autoscaling/v2beta1", + Kind: "HorizontalPodAutoscaler", + }, Service: v1alpha3.CanaryService{ + Port: 9898, + }, CanaryAnalysis: v1alpha3.CanaryAnalysis{ + Threshold: 10, + Iterations: 10, + Match: []istiov1alpha3.HTTPMatchRequest{ + { + Headers: map[string]istiov1alpha1.StringMatch{ + "x-user-type": { + Exact: "test", + }, + }, + }, + }, + Metrics: []v1alpha3.CanaryMetric{ + { + Name: "istio_requests_total", + Threshold: 99, + Interval: "1m", + }, + { + Name: "istio_request_duration_seconds_bucket", + Threshold: 500, + Interval: "1m", + }, + }, + }, + }, + } + return cd +} + func newTestDeployment() *appsv1.Deployment { d := &appsv1.Deployment{ TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String()}, diff --git a/pkg/controller/deployer_test.go b/pkg/controller/deployer_test.go index e7bdd0bac..9f6eac07e 100644 --- a/pkg/controller/deployer_test.go +++ b/pkg/controller/deployer_test.go @@ -8,7 +8,7 @@ import ( ) func TestCanaryDeployer_Sync(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) @@ -94,7 +94,7 @@ func TestCanaryDeployer_Sync(t *testing.T) { } func TestCanaryDeployer_IsNewSpec(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) @@ -117,7 +117,7 @@ func TestCanaryDeployer_IsNewSpec(t *testing.T) { } func TestCanaryDeployer_Promote(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) @@ -162,7 +162,7 @@ func TestCanaryDeployer_Promote(t *testing.T) { } func TestCanaryDeployer_IsReady(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) @@ -180,7 +180,7 @@ func TestCanaryDeployer_IsReady(t *testing.T) { } func TestCanaryDeployer_SetFailedChecks(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) @@ -202,7 +202,7 @@ func TestCanaryDeployer_SetFailedChecks(t *testing.T) { } func TestCanaryDeployer_SetState(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) @@ -224,7 +224,7 @@ func TestCanaryDeployer_SetState(t *testing.T) { } func TestCanaryDeployer_SyncStatus(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) @@ -263,7 +263,7 @@ func TestCanaryDeployer_SyncStatus(t *testing.T) { } func TestCanaryDeployer_Scale(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) err := mocks.deployer.Sync(mocks.canary) if err != nil { t.Fatal(err.Error()) diff --git a/pkg/controller/scheduler_test.go b/pkg/controller/scheduler_test.go index e774ee2d4..888defb13 100644 --- a/pkg/controller/scheduler_test.go +++ b/pkg/controller/scheduler_test.go @@ -7,7 +7,7 @@ import ( ) func TestScheduler_Init(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) mocks.ctrl.advanceCanary("podinfo", "default", false) _, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) @@ -17,7 +17,7 @@ func TestScheduler_Init(t *testing.T) { } func TestScheduler_NewRevision(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) mocks.ctrl.advanceCanary("podinfo", "default", false) // update @@ -41,7 +41,7 @@ func TestScheduler_NewRevision(t *testing.T) { } func TestScheduler_Rollback(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) // init mocks.ctrl.advanceCanary("podinfo", "default", true) @@ -65,7 +65,7 @@ func TestScheduler_Rollback(t *testing.T) { } func TestScheduler_SkipAnalysis(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) // init mocks.ctrl.advanceCanary("podinfo", "default", false) @@ -106,7 +106,7 @@ func TestScheduler_SkipAnalysis(t *testing.T) { } func TestScheduler_NewRevisionReset(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) // init mocks.ctrl.advanceCanary("podinfo", "default", false) @@ -160,7 +160,7 @@ func TestScheduler_NewRevisionReset(t *testing.T) { } func TestScheduler_Promotion(t *testing.T) { - mocks := SetupMocks() + mocks := SetupMocks(false) // init mocks.ctrl.advanceCanary("podinfo", "default", false) @@ -258,3 +258,74 @@ func TestScheduler_Promotion(t *testing.T) { t.Errorf("Got canary state %v wanted %v", c.Status.Phase, v1alpha3.CanarySucceeded) } } + +func TestScheduler_ABTesting(t *testing.T) { + mocks := SetupMocks(true) + // init + mocks.ctrl.advanceCanary("podinfo", "default", false) + + // update + dep2 := newTestDeploymentV2() + _, err := mocks.kubeClient.AppsV1().Deployments("default").Update(dep2) + if err != nil { + t.Fatal(err.Error()) + } + + // detect pod spec changes + mocks.ctrl.advanceCanary("podinfo", "default", true) + + // advance + mocks.ctrl.advanceCanary("podinfo", "default", true) + + // check if traffic is routed to canary + primaryWeight, canaryWeight, err := mocks.router.GetRoutes(mocks.canary) + if err != nil { + t.Fatal(err.Error()) + } + + if primaryWeight != 0 { + t.Errorf("Got primary route %v wanted %v", primaryWeight, 0) + } + + if canaryWeight != 100 { + t.Errorf("Got canary route %v wanted %v", canaryWeight, 100) + } + + cd, err := mocks.flaggerClient.FlaggerV1alpha3().Canaries("default").Get("podinfo", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + // set max iterations + if err := mocks.deployer.SetStatusIterations(cd, 10); err != nil { + t.Fatal(err.Error()) + } + + // promote + mocks.ctrl.advanceCanary("podinfo", "default", true) + + // check if the container image tag was updated + primaryDep, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + primaryImage := primaryDep.Spec.Template.Spec.Containers[0].Image + canaryImage := dep2.Spec.Template.Spec.Containers[0].Image + if primaryImage != canaryImage { + t.Errorf("Got primary image %v wanted %v", primaryImage, canaryImage) + } + + // shutdown canary + mocks.ctrl.advanceCanary("podinfo", "default", true) + + // check rollout status + c, err := mocks.flaggerClient.FlaggerV1alpha3().Canaries("default").Get("podinfo", metav1.GetOptions{}) + if err != nil { + t.Fatal(err.Error()) + } + + if c.Status.Phase != v1alpha3.CanarySucceeded { + t.Errorf("Got canary state %v wanted %v", c.Status.Phase, v1alpha3.CanarySucceeded) + } +} From d8b847a973c4daf1ebd9c9ed5d7b86aa5b00e9ec Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 15:05:44 +0200 Subject: [PATCH 08/11] Mention session affinity in docs --- docs/gitbook/how-it-works.md | 1 + pkg/controller/deployer.go | 2 +- pkg/controller/scheduler.go | 7 ------- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/docs/gitbook/how-it-works.md b/docs/gitbook/how-it-works.md index d672e7e84..cdd74b842 100644 --- a/docs/gitbook/how-it-works.md +++ b/docs/gitbook/how-it-works.md @@ -331,6 +331,7 @@ promotes it without analysing it. If an analysis is underway, Flagger cancels it Besides weighted routing, Flagger can be configured to route traffic to the canary based on HTTP match conditions. In an A/B testing scenario, you'll be using HTTP headers or cookies to target a certain segment of your users. +This is particularly useful for frontend applications that require session affinity. Spec: diff --git a/pkg/controller/deployer.go b/pkg/controller/deployer.go index 74f48c682..6b7555b09 100644 --- a/pkg/controller/deployer.go +++ b/pkg/controller/deployer.go @@ -220,7 +220,7 @@ func (c *CanaryDeployer) SetStatusWeight(cd *flaggerv1.Canary, val int) error { return nil } -// SetStatusWeight updates the canary status weight value +// SetStatusIterations updates the canary status iterations value func (c *CanaryDeployer) SetStatusIterations(cd *flaggerv1.Canary, val int) error { cdCopy := cd.DeepCopy() cdCopy.Status.Iterations = val diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index f9047b750..fd74f9394 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -471,13 +471,6 @@ func (c *Controller) hasCanaryRevisionChanged(cd *flaggerv1.Canary) bool { return false } -func (c *Controller) hasMaxIterations(cd *flaggerv1.Canary) bool { - if cd.Status.Iterations == cd.Status.Iterations { - return true - } - return false -} - func (c *Controller) analyseCanary(r *flaggerv1.Canary) bool { // run external checks for _, webhook := range r.Spec.CanaryAnalysis.Webhooks { From d87bbbbc1edaa293fd6b17ba5530e1a0541a804c Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 21:26:52 +0200 Subject: [PATCH 09/11] Add A/B testing tutorial --- README.md | 2 +- docs/diagrams/flagger-abtest-steps.png | Bin 0 -> 161393 bytes docs/gitbook/SUMMARY.md | 1 + docs/gitbook/usage/ab-testing.md | 207 +++++++++++++++++++++++++ 4 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 docs/diagrams/flagger-abtest-steps.png create mode 100644 docs/gitbook/usage/ab-testing.md diff --git a/README.md b/README.md index d51720185..713b4e03c 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ Flagger documentation can be found at [docs.flagger.app](https://docs.flagger.ap * [Routing](https://docs.flagger.app/how-it-works#istio-routing) * [Canary deployment stages](https://docs.flagger.app/how-it-works#canary-deployment) * [Canary analysis](https://docs.flagger.app/how-it-works#canary-analysis) - * [A/B testing](https://docs.flagger.app/how-it-works#ab-testing) * [HTTP metrics](https://docs.flagger.app/how-it-works#http-metrics) * [Custom metrics](https://docs.flagger.app/how-it-works#custom-metrics) * [Webhooks](https://docs.flagger.app/how-it-works#webhooks) * [Load testing](https://docs.flagger.app/how-it-works#load-testing) * Usage * [Canary promotions and rollbacks](https://docs.flagger.app/usage/progressive-delivery) + * [A/B testing](https://docs.flagger.app/usage/ab-testing) * [Monitoring](https://docs.flagger.app/usage/monitoring) * [Alerting](https://docs.flagger.app/usage/alerting) * Tutorials diff --git a/docs/diagrams/flagger-abtest-steps.png b/docs/diagrams/flagger-abtest-steps.png new file mode 100644 index 0000000000000000000000000000000000000000..db3ed35d0e98555eeb959c33ff87518740a13581 GIT binary patch literal 161393 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 BjEn#P literal 0 HcmV?d00001 diff --git a/docs/gitbook/SUMMARY.md b/docs/gitbook/SUMMARY.md index 7109e1ff6..6d63f3911 100644 --- a/docs/gitbook/SUMMARY.md +++ b/docs/gitbook/SUMMARY.md @@ -11,6 +11,7 @@ ## Usage * [Canary Deployments](usage/progressive-delivery.md) +* [A/B Testing](usage/ab-testing.md) * [Monitoring](usage/monitoring.md) * [Alerting](usage/alerting.md) diff --git a/docs/gitbook/usage/ab-testing.md b/docs/gitbook/usage/ab-testing.md new file mode 100644 index 000000000..650780435 --- /dev/null +++ b/docs/gitbook/usage/ab-testing.md @@ -0,0 +1,207 @@ +# A/B Testing + +This guide shows you how to automate A/B testing with Flagger. + +Besides weighted routing, Flagger can be configured to route traffic to the canary based on HTTP match conditions. +In an A/B testing scenario, you'll be using HTTP headers or cookies to target a certain segment of your users. +This is particularly useful for frontend applications that require session affinity. + +![Flagger A/B Testing Stages](https://github.com/raw/stefanprodan/flagger/master/docs/diagrams/flagger-abtest-steps.png) + +Create a test namespace with Istio sidecar injection enabled: + +```bash +export REPO=https://github.com/raw/stefanprodan/flagger/master + +kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml +``` + +Create a deployment and a horizontal pod autoscaler: + +```bash +kubectl apply -f ${REPO}/artifacts/ab-testing/deployment.yaml +kubectl apply -f ${REPO}/artifacts/ab-testing/hpa.yaml +``` + +Deploy the load testing service to generate traffic during the canary analysis: + +```bash +kubectl -n test apply -f ${REPO}/artifacts/loadtester/deployment.yaml +kubectl -n test apply -f ${REPO}/artifacts/loadtester/service.yaml +``` + +Create a canary custom resource (replace example.com with your own domain): + +```yaml +apiVersion: flagger.app/v1alpha3 +kind: Canary +metadata: + name: abtest + namespace: test +spec: + # deployment reference + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: abtest + # the maximum time in seconds for the canary deployment + # to make progress before it is rollback (default 600s) + progressDeadlineSeconds: 60 + # HPA reference (optional) + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: abtest + service: + # container port + port: 9898 + # Istio gateways (optional) + gateways: + - public-gateway.istio-system.svc.cluster.local + # Istio virtual service host names (optional) + hosts: + - app.example.com + canaryAnalysis: + # schedule interval (default 60s) + interval: 1m + # total number of iterations + iterations: 10 + # max number of failed iterations before rollback + threshold: 2 + # canary match condition + match: + - headers: + user-agent: + regex: "^(?!.*Chrome)(?=.*\bSafari\b).*$" + - headers: + cookie: + regex: "^(.*?;)?(type=insider)(;.*)?$" + metrics: + - name: istio_requests_total + # minimum req success rate (non 5xx responses) + # percentage (0-100) + threshold: 99 + interval: 1m + - name: istio_request_duration_seconds_bucket + # maximum req duration P99 + # milliseconds + threshold: 500 + interval: 30s + # generate traffic during analysis + webhooks: + - name: load-test + url: http://flagger-loadtester.test/ + timeout: 5s + metadata: + cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/" +``` + +The above configuration will run an analysis for ten minutes targeting Safari users and those that have an insider cookie. + +Save the above resource as podinfo-abtest.yaml and then apply it: + +```bash +kubectl apply -f ./podinfo-abtest.yaml +``` + +After a couple of seconds Flagger will create the canary objects: + +```bash +# applied +deployment.apps/abtest +horizontalpodautoscaler.autoscaling/abtest +canary.flagger.app/abtest + +# generated +deployment.apps/abtest-primary +horizontalpodautoscaler.autoscaling/abtest-primary +service/abtest +service/abtest-canary +service/abtest-primary +virtualservice.networking.istio.io/abtest +``` + +Trigger a canary deployment by updating the container image: + +```bash +kubectl -n test set image deployment/abtest \ +podinfod=quay.io/stefanprodan/podinfo:1.4.1 +``` + +Flagger detects that the deployment revision changed and starts a new rollout: + +```text +kubectl -n test describe canary/abtest + +Status: + Failed Checks: 0 + Phase: Succeeded +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Synced 3m flagger New revision detected abtest.test + Normal Synced 3m flagger Scaling up abtest.test + Warning Synced 3m flagger Waiting for abtest.test rollout to finish: 0 of 1 updated replicas are available + Normal Synced 3m flagger Advance abtest.test canary iteration 1/10 + Normal Synced 3m flagger Advance abtest.test canary iteration 2/10 + Normal Synced 3m flagger Advance abtest.test canary iteration 3/10 + Normal Synced 2m flagger Advance abtest.test canary iteration 4/10 + Normal Synced 2m flagger Advance abtest.test canary iteration 5/10 + Normal Synced 1m flagger Advance abtest.test canary iteration 6/10 + Normal Synced 1m flagger Advance abtest.test canary iteration 7/10 + Normal Synced 55s flagger Advance abtest.test canary iteration 8/10 + Normal Synced 45s flagger Advance abtest.test canary iteration 9/10 + Normal Synced 35s flagger Advance abtest.test canary iteration 10/10 + Normal Synced 25s flagger Copying abtest.test template spec to abtest-primary.test + Warning Synced 15s flagger Waiting for abtest-primary.test rollout to finish: 1 of 2 updated replicas are available + Normal Synced 5s flagger Promotion completed! Scaling down abtest.test +``` + +**Note** that if you apply new changes to the deployment during the canary analysis, Flagger will restart the analysis. + +You can monitor all canaries with: + +```bash +watch kubectl get canaries --all-namespaces + +NAMESPACE NAME STATUS WEIGHT LASTTRANSITIONTIME +test abtest Progressing 100 2019-03-16T14:05:07Z +prod frontend Succeeded 0 2019-03-15T16:15:07Z +prod backend Failed 0 2019-03-14T17:05:07Z +``` + +During the canary analysis you can generate HTTP 500 errors and high latency to test Flagger's rollback. + +Generate HTTP 500 errors: + +```bash +watch curl -b 'type=insider' http://app.example.com/status/500 +``` + +Generate latency: + +```bash +watch curl -b 'type=insider' http://app.example.com/delay/1 +``` + +When the number of failed checks reaches the canary analysis threshold, the traffic is routed back to the primary, +the canary is scaled to zero and the rollout is marked as failed. + +```text +kubectl -n test describe canary/abtest + +Status: + Failed Checks: 2 + Phase: Failed +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Synced 3m flagger Starting canary deployment for abtest.test + Normal Synced 3m flagger Advance abtest.test canary iteration 1/10 + Normal Synced 3m flagger Advance abtest.test canary iteration 2/10 + Normal Synced 3m flagger Advance abtest.test canary iteration 3/10 + Normal Synced 3m flagger Halt abtest.test advancement success rate 69.17% < 99% + Normal Synced 2m flagger Halt abtest.test advancement success rate 61.39% < 99% + Warning Synced 2m flagger Rolling back abtest.test failed checks threshold reached 2 + Warning Synced 1m flagger Canary failed! Scaling down abtest.test +``` From 86ea1723804139755ac2f7bbe64c01ec685047fe Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 8 Mar 2019 23:28:45 +0200 Subject: [PATCH 10/11] Fix weight metric report --- pkg/controller/scheduler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index fd74f9394..8e95debfe 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -259,7 +259,7 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh c.recordEventWarningf(cd, "%v", err) return } - c.recorder.SetWeight(cd, 100, 0) + c.recorder.SetWeight(cd, 0, 100) if err := c.deployer.SetStatusIterations(cd, cd.Status.Iterations+1); err != nil { c.recordEventWarningf(cd, "%v", err) From 12ac96deeb1daecb6abe8725319ea70519a285cf Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Mon, 11 Mar 2019 12:58:33 +0200 Subject: [PATCH 11/11] Document how to enable A/B testing --- docs/gitbook/how-it-works.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/gitbook/how-it-works.md b/docs/gitbook/how-it-works.md index cdd74b842..14e87b1ac 100644 --- a/docs/gitbook/how-it-works.md +++ b/docs/gitbook/how-it-works.md @@ -333,7 +333,7 @@ Besides weighted routing, Flagger can be configured to route traffic to the cana In an A/B testing scenario, you'll be using HTTP headers or cookies to target a certain segment of your users. This is particularly useful for frontend applications that require session affinity. -Spec: +You can enable A/B testing by specifying the HTTP match conditions and the number of iterations: ```yaml canaryAnalysis: @@ -353,6 +353,8 @@ Spec: regex: "^(.*?;)?(user=test)(;.*)?$" ``` +If Flagger finds a HTTP match condition, it will ignore the `maxWeight` and `stepWeight` settings. + The above configuration will run an analysis for ten minutes targeting the Safari users and those that have a test cookie. You can determine the minimum time that it takes to validate and promote a canary deployment using this formula: