diff --git a/artifacts/canaries/canary.yaml b/artifacts/canaries/canary.yaml index 046b2369..383aac32 100644 --- a/artifacts/canaries/canary.yaml +++ b/artifacts/canaries/canary.yaml @@ -27,6 +27,10 @@ spec: # Istio virtual service host names (optional) hosts: - app.istio.weavedx.com + # Istio traffic policy (optional) + trafficPolicy: + loadBalancer: + simple: LEAST_CONN # HTTP match conditions (optional) match: - uri: @@ -34,13 +38,8 @@ spec: # HTTP rewrite (optional) rewrite: uri: / - # Envoy timeout and retry policy (optional) - headers: - request: - add: - x-envoy-upstream-rq-timeout-ms: "15000" - x-envoy-max-retries: "10" - x-envoy-retry-on: "gateway-error,connect-failure,refused-stream" + # HTTP timeout (optional) + timeout: 30s # promote the canary without analysing it (default false) skipAnalysis: false canaryAnalysis: @@ -54,7 +53,7 @@ spec: # canary increment step # percentage (0-100) stepWeight: 5 - # Istio Prometheus checks + # Prometheus checks metrics: - name: request-success-rate # minimum req success rate (non 5xx responses) diff --git a/pkg/apis/flagger/v1alpha3/types.go b/pkg/apis/flagger/v1alpha3/types.go index e9eb9a49..f65e6577 100755 --- a/pkg/apis/flagger/v1alpha3/types.go +++ b/pkg/apis/flagger/v1alpha3/types.go @@ -115,17 +115,18 @@ type CanaryStatus struct { // CanaryService is used to create ClusterIP services // and Istio Virtual Service type CanaryService struct { - Port int32 `json:"port"` - PortName string `json:"portName,omitempty"` - Match []istiov1alpha3.HTTPMatchRequest `json:"match,omitempty"` - Rewrite *istiov1alpha3.HTTPRewrite `json:"rewrite,omitempty"` - Timeout string `json:"timeout,omitempty"` - Retries *istiov1alpha3.HTTPRetry `json:"retries,omitempty"` - Headers *istiov1alpha3.Headers `json:"headers,omitempty"` - CorsPolicy *istiov1alpha3.CorsPolicy `json:"corsPolicy,omitempty"` - //Istio - Gateways []string `json:"gateways,omitempty"` - Hosts []string `json:"hosts,omitempty"` + Port int32 `json:"port"` + PortName string `json:"portName,omitempty"` + Timeout string `json:"timeout,omitempty"` + // Istio + Gateways []string `json:"gateways,omitempty"` + Hosts []string `json:"hosts,omitempty"` + TrafficPolicy *istiov1alpha3.TrafficPolicy `json:"trafficPolicy,omitempty"` + Match []istiov1alpha3.HTTPMatchRequest `json:"match,omitempty"` + Rewrite *istiov1alpha3.HTTPRewrite `json:"rewrite,omitempty"` + Retries *istiov1alpha3.HTTPRetry `json:"retries,omitempty"` + Headers *istiov1alpha3.Headers `json:"headers,omitempty"` + CorsPolicy *istiov1alpha3.CorsPolicy `json:"corsPolicy,omitempty"` // App Mesh MeshName string `json:"meshName,omitempty"` Backends []string `json:"backends,omitempty"` diff --git a/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go index dc710448..28c0243d 100644 --- a/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/apis/flagger/v1alpha3/zz_generated.deepcopy.go @@ -141,6 +141,21 @@ func (in *CanaryMetric) DeepCopy() *CanaryMetric { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CanaryService) DeepCopyInto(out *CanaryService) { *out = *in + if in.Gateways != nil { + in, out := &in.Gateways, &out.Gateways + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Hosts != nil { + in, out := &in.Hosts, &out.Hosts + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.TrafficPolicy != nil { + in, out := &in.TrafficPolicy, &out.TrafficPolicy + *out = new(istiov1alpha3.TrafficPolicy) + (*in).DeepCopyInto(*out) + } if in.Match != nil { in, out := &in.Match, &out.Match *out = make([]istiov1alpha3.HTTPMatchRequest, len(*in)) @@ -168,16 +183,6 @@ func (in *CanaryService) DeepCopyInto(out *CanaryService) { *out = new(istiov1alpha3.CorsPolicy) (*in).DeepCopyInto(*out) } - if in.Gateways != nil { - in, out := &in.Gateways, &out.Gateways - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Hosts != nil { - in, out := &in.Hosts, &out.Hosts - *out = make([]string, len(*in)) - copy(*out, *in) - } if in.Backends != nil { in, out := &in.Backends, &out.Backends *out = make([]string, len(*in)) diff --git a/pkg/router/istio.go b/pkg/router/istio.go index ae52f666..7c12878a 100644 --- a/pkg/router/istio.go +++ b/pkg/router/istio.go @@ -48,7 +48,8 @@ func (ir *IstioRouter) Reconcile(canary *flaggerv1.Canary) error { func (ir *IstioRouter) reconcileDestinationRule(canary *flaggerv1.Canary, name string) error { newSpec := istiov1alpha3.DestinationRuleSpec{ - Host: name, + Host: name, + TrafficPolicy: canary.Spec.Service.TrafficPolicy, } destinationRule, err := ir.istioClient.NetworkingV1alpha3().DestinationRules(canary.Namespace).Get(name, metav1.GetOptions{})