When Prometheus returns an HTTP error (4xx/5xx), the error message now
includes the status code and reason phrase. Previously, only the response
body was shown, which made it difficult to diagnose issues like HTTP 403
errors caused by missing authorization policies.
Fixesfluxcd/flagger#1434
Signed-off-by: rohansood10 <rohansood10@users.noreply.github.com>
currently the log line exposes the error, however that's always going to be nil
based on the check just above it. This provides better visibility into the failure reason
Signed-off-by: Erik Miller <erik.miller@gusto.com>
It can take some time for changes to propagate for cloud load balancers,
so flagger should ensure the route changes are current before proceeding
with any more.
Signed-off-by: Steven Davidovitz <sdavidovitz@groq.com>
These are labels and annotations that should be ignored by Flagger
(i.e. not overwritten upon reconciliation).
See: github.com/fluxcd/flagger/issues/1573
Signed-off-by: Brian Sonnenberg <bsonnenberg@google.com>
When cross-namespace references are disabled, ensure that UpstreamRef,
MetricTemplateRef, and AlertProviderRef default to the canary's namespace
if their namespace field is empty. This aligns the validation logic with
the rest of the controller and prevents false positives when the namespace
is omitted.
Fixes#1827
Signed-off-by: Barrera, Angel <angelbarrerasanchez@protonmail.com>
Implement flagger_canary_successes_total and flagger_canary_failures_total
counter metrics with deployment strategy detection and analysis status
tracking for better observability of canary deployment outcomes.
Signed-off-by: cappyzawa <cappyzawa@gmail.com>
Enhance existing scheduler tests for deployments, daemonsets, and
services by adding prometheus metrics verification using testutil.
This ensures that status metrics are correctly recorded during
canary promotion workflows and provides better test coverage for
the metrics recording functionality.
Signed-off-by: cappyzawa <cappyzawa@gmail.com>
`apisix` Helm chart has dependency on `etcd` chart which uses a pinned Bitnami image. These became unavailable on August 28, 2025: https://github.com/bitnami/containers/issues/83267
The image is still available in the `bitnamilegacy` repository.
Signed-off-by: Kevin Snyder <kevin.snyder@gusto.com>
Add a new field `.spec.service.headless` which if set to true results in
Flagger generating headless Services, i.e. with the Service's
`.spec.clusterIP` set to None.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
`nginx_ingress_controller_ingress_upstream_latency_seconds_sum` measures the connection latency, not the time it takes the backend to respond.
Fixes#1685
Signed-off-by: Federico Nafria <federiconafria@gmail.com>
Add a Keptn metrics provider for two resources:
* KeptnMetric: Verify the value of a single metric.
* Analysis (via AnalysisDefinition): Run a Keptn analysis over an
interval validating SLOs.
Signed-off-by: Florian Bacher <florian.bacher@dynatrace.com>
This should avoid frequent "Operation cannot be fulfilled" errors from
polluting Canary resource events and logs.
Signed-off-by: Aurel Canciu <aurel.canciu@nexhealth.com>
Modify `canary.IsPrimaryReady()` and `canary.Initialize()` to return a
boolean indicating if the error is retriable. Modify the scheduler to
rollback the analysis and mark the Canary object as failed if the above
two functions or `canary.IsCanaryRead()` returns false along with an
error.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
Add support for v1 of Gateway API `HTTPRoute`. Drop support for v1alpha2
as it was deprecated almost a year ago.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
Add a new field `.spec.webhooks[].retries` to specify the number of
retries when calling a webhook.
Signed-off-by: Joseph Kwasniewski <kwasniewski@gmail.com>
Fix the waiting logic to actually wait for the canary deployment to be
ready before continuing with the rest of the finalization logic.
Previously, the canary deployment was not being checked for a ready
status due to the the absence of the `Steps` field in the specified
backoff.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
Add support for mirroring requests while performing B/G deployments with
Gateway API. A `RequestMirror` filter pointing to the canary service is
added to the HTTPRoute during a Canary run. During the Canary run, drift
correction for `.spec.rules[].filters` is disabled to avoid removing the
mirror filter.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
This adds a new Checksum field to the canary webhook body, which is a
hash of the LastAppliedSpec and TrackedConfigs.
This can be used to identify the rollout of a specific configuration,
and differentiate between webhooks being sent for different
configuration and deployment versions.
Signed-off-by: Kevin McDermott <kevin@weave.works>
Skipper's installation requires the creation of a PodSecurityPolicy
object. Since PSP was removed from k8s 1.25, we need to run tests for
skipper on k8s 1.24.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
When the annotation of ingress is not set, the returned value is nil
(not empty map). Trying to assign to this map leads to panic.
Signed-off-by: Jiří Pinkava <j-pi@seznam.cz>
Suspend, if set to true will suspend the Canary, disabling any canary runs
regardless of any changes to its target, services, etc. Note that if the
Canary is suspended during an analysis, its paused until the Canary is unsuspended.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
Resume target scaler during finalization so that targetRef deployment
does not get stuck at 0 replicas after canary has been deleted.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
Run the `confirm-rollout` webhook check right before scaling up the
deployment only, instead of running it on every loop.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
In Linkerd 2.13 the Prometheus instance in
the `linkerd-viz` namespace is now locked behind an
[_AuthorizationPolicy_](https://github.com/linkerd/linkerd2/blob/stable-2.13.1/viz/charts/linkerd-viz/templates/prometheus-policy.yaml)
that only allows access to the `metrics-api` _ServiceAccount_.
This adds an extra _AuthorizationPolicy_ to authorize the `flagger`
_ServiceAccount_. It's created by default when using Kustomize, but
needs to be opted-in when using Helm via the new
`linkerdAuthPolicy.create` value. This also implies that the Flagger
workload has to be injected by the Linkerd proxy, and that can't happen
in the same `linkerd` namespace where the control plane lives, so we're
moving Flagger into the new injected `flagger-system` namespace.
The `namespace` field in `kustomization.yml` was resetting the namespace
for the new _AuthorizationPolicy_ resource, so that gets restored back
to `linkerd-viz` using a `patchesJson6902` entry. A better way to do
this would have been to use the `unsetOnly` field in a
_NamespaceTransformer_ (see kubernetes-sigs/kustomize#4708) but for
the life of me I couldn't make that work...
Signed-off-by: Alejandro Pedraza <alejandro@buoyant.io>
Use regex filtering to match against session affinity cookie headers
when using Istio instead of an exact match.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
Adding support for overriding the primary scaler replica count via
.spec.autoscalerRef.primaryScalerReplicas, a feature which would enable
users to define a different scaling configurations for the primary.
This can be useful in the situation where the user does not want to
scale the canary workload to the exact same size as the primary,
especially when opting for a canary deployment pattern where only a
small portion of traffic is routed to the canary workload pods.
Signed-off-by: Aurel Canciu <aurelcanciu@gmail.com>
Add `.spec.analysis.sessionAffinity` to configure session affinity for
weighted routing. Add support for session affinity in the Istio router,
using the `Set-Cookie` and `Cookie` headers.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
- Push Flagger Helm chart to `ghcr.io/fluxcd/charts/flagger`
- Sign Flagger Helm chart with Cosign and GitHub OIDC
- Push install manifests and overlays from `./kustomize` with Flux CLI to `ghcr.io/fluxcd/flagger-manifests`
- Sign Flagger manifests with Cosign and GitHub OIDC
Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
- Replace the Cosign static key with GitHub Actions OIDC when signing the flagger container image
- Sign the GitHub release assets checksums with Cosign keyless
- Sign the load-tester container image with Cosign keyless
Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
Without this, the canary replicas are updated twice:
to 1 replica then after a few seconds to the value of HPA minReplicas.
In some cases, when updated to 1 replica (before updated by HPA
controller to the minReplicas), it's considered ready: 1 of 1 (readyThreshold 100%),
and the canary weight is advanced to receive traffic with less capacity
than expected.
Co-Authored-By: Joshua Gibeon <joshuagibeon7719@gmail.com>
Co-authored-by: Sanskar Jaiswal <hey@aryan.lol>
Signed-off-by: Andy Librian <andylibrian@gmail.com>
without this change the HTTPProxy - podinfo.test was not getting created due to the following warning:
```
test 4m11s Warning Synced canary/podinfo HTTPProxy podinfo.test create error: HTTPProxy.projectcontour.io "podinfo" is invalid: spec.routes.retryPolicy.retryOn: Unsupported value: "": supported values: "5xx", "gateway-error", "reset", "connect-failure", "retriable-4xx", "refused-stream", "retriable-status-codes", "retriable-headers", "cancelled", "deadline-exceeded", "internal", "resource-exhausted", "unavailable"
```
Signed-off-by: Mae Anne Large <Mpluya@users.noreply.github.com>
Signed-off-by: Mae Large <mlarge@vmware.com>
Prevents the canary from getting triggered, when a canary deploy is
updated to match the primary deploy after an analysis fails.
Signed-off-by: Sanskar Jaiswal <sanskar.jaiswal@weave.works>
Adds Gateway API as a provider for progressive traffic shifting, A/B
testing and Blue-Green testing. Adds a new field in the Canary
`spec.service.gatewayRefs` which specifies the Gateway that Flagger
should use.
Signed-off-by: Sanskar Jaiswal <jaiswalsanskar078@gmail.com>
This allows to forbid access from canaries in non-whitelisted
namespaces.
In a multi-tenant context, this can be combined with network policies to
maintain isolation between namespaces.
Signed-off-by: Cédric Connes <cedric.connes@gmail.com>
Signed-off-by: Author Name <johnzhengaz@gmail.com>
It is easy tp raise: Halt advancement no values found for istio metric request-success-rate probably podinfo.test is not receiving traffic: running query failed: no values found
If it is inconsistence between the prometheus version and istio version.
Signed-off-by: John Zheng <john.zheng@hp.com>
Signed-off-by: Karl Heins <karlheins@northwesternmutual.com>
Support updating primary Deployment/DaemonSet/HPA/Service labels and annotations after first-time rollout
Also bring it up to same format as all the other
MAINTAINERS files (needed for fluxcd/community#155).
Signed-off-by: Daniel Holbach <daniel@weave.works>
In my self project I reference this nice script, the go.sum look like this(after run go mod tidy and
download):
```
k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400=
k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw=
k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk=
k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o=
k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo=
```
as you can see the, sometimes the go.sum only has `version/go.mod` line,
if we run the scripts, it will fail like this:
chmod: cannot access '/home/longkai/pkg/mod/k8s.io/code-generator@v0.22.1/go.mod/generate-groups.sh': Not a directory
so this pr fix this.
Finally, the list is sort by version ast, we want to choose the newer one.
Signed-off-by: longkai <im.longkai@gmail.com>
If a "primary" ConfigMap or Secret already exists, keep the list of
ownerReferences and append the updating Canary as ownerReference if it's
not already in the list. This will prevent the GC from deleting primary
ConfigMaps and Secrets used by multiple primary deployments when one is
deleted.
Signed-off-by: Zacharias Taubert <zacharias.taubert@gmail.com>
Some third party software relies on annotations and labels on istios VirtualServices. For instance external-dns makes use of the `external-dns.alpha.kubernetes.io/controller` annotation. Currently there is no way to set labels and annotations on the VirtualService resource.
This change takes the metadata from the `canary.Spec.Service.Apex` property to replicate exactly what is already possible for a traefik resource:
c36a13ccff/pkg/router/traefik.go (L59-L68)Fix#854
Signed-off-by: Jonny Langefeld <jonny.langefeld@gmail.com>
A minor issue I stumbled across while learning how to drive Flagger, is that the docs still use `istio_request_duration_seconds_bucket` to illustrate the query behind the `request-duration` metric. I understand that this changed with Istio 1.5 (https://github.com/fluxcd/flagger/issues/478), but it seems that in the current version of flagger, the correct metric must already be used, since I'm getting duration metrics out of Istio 1.10 :)
This change simply makes the docs clearer for those of us trying to understand exactly what `request-duration` entails!
Signed-off-by: David Young <davidy@funkypenguin.co.nz>
In the SMI TrafficSplit spec, Weight and Service are
required values for TrafficSplit Backend.
In flagger's SMI v1alpha2 implementation,
Service and Weight have the omitempty json option.
During canary analysis, flagger initially creates
a SMI TrafficSplit custom resource in which the
canary backend service has a Weight of 0.
The omitempty option causes Go to omit Weight
when it sends the custom resource to Kubernetes.
This throws an error during canary analysis.
Signed-off-by: Johnson Shi <Johnson.Shi@microsoft.com>
- breaking change: drop support for Ingress `k8s.io/api/networking/v1beta1`
- routing: use Ingress `k8s.io/api/networking/v1` for NGINX and Skipper routers
- e2e: update ingress-nginx v0.46.0 and skipper to v0.13.61
Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
The Deployment of the Flagger loadtester did not contain the correct
label app.kubernetes.io/name. This label is used for the Flagger
deployment and it is also used in the PodDisruptionBudget for
the Flagger operator. I added the same label to the Flagger
load tester to make the PodDisruptionBudget work correctly
for the Flagger loadtester.
Signed-off-by: Marcus Rodan <marcusrodan@gmail.com>
Use curly braces to specify an array value in helm set.
The latest versions of the chart need to have the additional arguments specified as a list or they error out:
```
Error: template: traefik/templates/_podtemplate.tpl:199:20: executing "traefik.podTemplate" at <.>: range can't iterate over --metrics.prometheus=true
```
Signed-off-by: Carson Anderson <carson.anderson@getweave.com>
This commit updates the linkerd version to `2.10`, along with
the install script to download the arm version.
It also updates the install script and metricsTempalte to install
and use the viz Prometheus respectively.
Signed-off-by: Tarun Pothulapati <tarunpothulapati@outlook.com>
In Linkerd 2.10, The Prometheus instance moved into the `viz`
extension which is installed separately from the core
control-plane. This means that the prometheus now exists in
the `linkerd-viz` namespace by default unless overriden.
This PR updates the URl to reflect the same
Signed-off-by: Tarun Pothulapati <tarunpothulapati@outlook.com>
Prometheus deployment created by the Helm chart is missing a pull secret,
variable is necessary to pull the prometheus image from private a repository
Signed-off-by: Joseph Villarreal Lopez <lapeyus@gmail.com>
Copying of Configmaps and Secrets managed through Flagger should now
follow the same label prefix filtering rules as for the workloads.
Extends: #709
Signed-off-by: Aurel Canciu <aurelcanciu@gmail.com>
description:Canary is the Schema for the Canary API.
type:object
properties:
properties:
apiVersion:
description:'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type:string
kind:
description:'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type:string
metadata:
type:object
spec:
spec:
description:CanarySpec defines the desired state of a Canary.
type:object
required:
required:
- targetRef
- targetRef
- service
- analysis
- analysis
properties:
properties:
provider:
provider:
@@ -97,7 +107,7 @@ spec:
name:
name:
type:string
type:string
autoscalerRef:
autoscalerRef:
description:HPA selector
description:Scaler selector
type:object
type:object
required:["apiVersion","kind","name"]
required:["apiVersion","kind","name"]
properties:
properties:
@@ -107,10 +117,24 @@ spec:
type:string
type:string
enum:
enum:
- HorizontalPodAutoscaler
- HorizontalPodAutoscaler
- ScaledObject
name:
name:
type:string
type:string
primaryScalerQueries:
type:object
additionalProperties:
type:string
primaryScalerReplicas:
type:object
properties:
minReplicas:
type:integer
minimum:1
maxReplicas:
type:integer
minimum:1
ingressRef:
ingressRef:
description:NGINX ingress selector
description:Ingress selector
type:object
type:object
required:["apiVersion","kind","name"]
required:["apiVersion","kind","name"]
properties:
properties:
@@ -122,6 +146,34 @@ spec:
- Ingress
- Ingress
name:
name:
type:string
type:string
routeRef:
description:APISIX route selector
type:object
required:["apiVersion","kind","name"]
properties:
apiVersion:
type:string
kind:
type:string
enum:
- ApisixRoute
name:
type:string
upstreamRef:
description:Gloo Upstream selector
type:object
required:["apiVersion","kind","name"]
properties:
apiVersion:
type:string
kind:
type:string
enum:
- Upstream
name:
type:string
namespace:
type:string
service:
service:
description:Kubernetes Service spec
description:Kubernetes Service spec
type:object
type:object
@@ -136,13 +188,24 @@ spec:
portName:
portName:
description:Container port name
description:Container port name
type:string
type:string
appProtocol:
description:Application protocol of the port
type:string
trafficDistribution:
description:Traffic distribution of the service
type:string
enum:
- PreferClose
- PreferSameZone
- PreferSameNode
targetPort:
targetPort:
description:Container target port name
description:Container target port name
anyOf:
x-kubernetes-int-or-string:true
- type:string
- type:number
portDiscovery:
portDiscovery:
description:Enable port dicovery
description:Enable port discovery
type:boolean
headless:
description:Headless if set to true, generates headless Kubernetes services.
type:boolean
type:boolean
timeout:
timeout:
description:HTTP or gRPC request timeout
description:HTTP or gRPC request timeout
@@ -167,15 +230,23 @@ spec:
description:URI match conditions
description:URI match conditions
type:array
type:array
items:
items:
type:object
properties:
properties:
uri:
authority:
type:object
oneOf:
oneOf:
- required:["exact"]
- not:
- required:["prefix"]
anyOf:
- required:["suffix"]
- required:
- required:["regex"]
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
properties:
exact:
exact:
format:string
format:string
@@ -183,12 +254,223 @@ spec:
prefix:
prefix:
format:string
format:string
type:string
type:string
suffix:
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
gateways:
description:
Names of gateways where the rule should be
applied.
items:
format:string
type:string
type:array
headers:
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
format:string
type:string
type:string
regex:
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
format:string
type:string
type:string
type:object
type:object
ignoreUriCase:
description:
Flag to specify whether the URI matching should
be case-insensitive.
type:boolean
method:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
name:
description:The name assigned to a match.
format:string
type:string
port:
description:
Specifies the ports on the host that is being
addressed.
type:integer
queryParams:
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
description:Query parameters for matching.
type:object
scheme:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
sourceLabels:
additionalProperties:
format:string
type:string
type:object
sourceNamespace:
description:
Source namespace constraining the applicability
of a rule to workloads in that namespace.
format:string
type:string
uri:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
withoutHeaders:
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
description:
withoutHeader has the same syntax with the
header, but has opposite meaning.
type:object
type:object
retries:
retries:
description:Retry policy for HTTP requests
description:Retry policy for HTTP requests
type:object
type:object
@@ -211,6 +493,54 @@ spec:
uri:
uri:
format:string
format:string
type:string
type:string
authority:
format:string
type:string
type:
format:string
type:string
mirror:
description:Mirror defines a schema for a filter that mirrors requests.
description:Represents the warmup duration of Service.
type:string
type:string
outlierDetection:
outlierDetection:
description:Settings controlling eviction of unhealthy hosts from the load balancing pool.
description:Settings controlling eviction of unhealthy hosts from the load balancing pool.
@@ -542,12 +916,27 @@ spec:
type:object
type:object
additionalProperties:
additionalProperties:
type:string
type:string
unmanagedMetadata:
description:UnmanagedMetadata is a list of metadata keys that should be ignored by Flagger.
type:object
properties:
annotations:
type:array
items:
type:string
labels:
type:array
items:
type:string
skipAnalysis:
skipAnalysis:
description:Skip analysis and promote canary
description:Skip analysis and promote canary
type:boolean
type:boolean
revertOnDeletion:
revertOnDeletion:
description:Revert mutated resources to original spec on deletion
description:Revert mutated resources to original spec on deletion
type:boolean
type:boolean
suspend:
description:Suspend Canary disabling/pausing all canary runs
type:boolean
analysis:
analysis:
description:Canary analysis for this canary
description:Canary analysis for this canary
type:object
type:object
@@ -586,6 +975,12 @@ spec:
mirrorWeight:
mirrorWeight:
description:Weight of traffic to be mirrored
description:Weight of traffic to be mirrored
type:number
type:number
primaryReadyThreshold:
description:Percentage of pods that need to be available to consider primary as ready
type:number
canaryReadyThreshold:
description:Percentage of pods that need to be available to consider canary as ready
type:number
match:
match:
description:A/B testing match conditions
description:A/B testing match conditions
type:array
type:array
@@ -615,6 +1010,34 @@ spec:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax)
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax)
format:string
format:string
type:string
type:string
queryParams:
description:Query parameters for matching.
type:object
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
type:string
prefix:
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
type:string
type:object
sourceLabels:
sourceLabels:
description:Applicable only when the 'mesh' gateway is included in the service.gateways list
description:Applicable only when the 'mesh' gateway is included in the service.gateways list
type:object
type:object
@@ -662,6 +1085,42 @@ spec:
namespace:
namespace:
description:Namespace of this metric template
description:Namespace of this metric template
type:string
type:string
templateVariables:
description:Additional variables to be used in the metrics query (key-value pairs)
type:object
additionalProperties:
type:string
alerts:
description:Alert list for this canary analysis
type:array
items:
type:object
required:
- providerRef
- name
properties:
name:
description:Name of the this alert
type:string
severity:
description:Severity level can be info, warn, error (default info)
type:string
enum:
- ""
- info
- warn
- error
providerRef:
description:Alert provider reference
type:object
required:["name"]
properties:
name:
description:Name of the alert provider
type:string
namespace:
description:Namespace of the alert provider
type:string
webhooks:
webhooks:
description:Webhook list for this canary
description:Webhook list for this canary
type:array
type:array
@@ -684,6 +1143,10 @@ spec:
- post-rollout
- post-rollout
- event
- event
- rollback
- rollback
- confirm-traffic-increase
muteAlert:
description:Mute all alerts for the webhook
type:boolean
url:
url:
description:URL address of this webhook
description:URL address of this webhook
type:string
type:string
@@ -692,12 +1155,57 @@ spec:
description:Request timeout for this webhook
description:Request timeout for this webhook
type:string
type:string
pattern:"^[0-9]+(m|s)"
pattern:"^[0-9]+(m|s)"
retries:
description:Number of retries for this webhook
type:number
disableTLS:
description:Disable TLS verification for this webhook
type:boolean
metadata:
metadata:
description:Metadata (key-value pairs) for this webhook
description:Metadata (key-value pairs) for this webhook
type:object
type:object
additionalProperties:
additionalProperties:
type:string
type:string
sessionAffinity:
description:SessionAffinity represents the session affinity settings for a canary run.
type:object
required:["cookieName"]
properties:
cookieName:
description:CookieName is the key that will be used for the session affinity cookie.
type:string
primaryCookieName:
description:CookieName is the key that will be used for the session affinity cookie.
type:string
domain:
description:Domain defines the host to which the cookie will be sent.
type:string
httpOnly:
description:HttpOnly forbids JavaScript from accessing the cookie, for example, through the Document.cookie property.
type:boolean
maxAge:
description:MaxAge indicates the number of seconds until the session affinity cookie will expire.
default:86400
type:number
partitioned:
description:Partitioned indicates that the cookie should be stored using partitioned storage.
type:boolean
path:
description:Path indicates the path that must exist in the requested URL for the browser to send the Cookie header.
type:string
sameSite:
description:SameSite controls whether or not a cookie is sent with cross-site requests.
type:string
enum:
- Strict
- Lax
- None
secure:
description:"Secure indicates that the cookie is sent to the server only when a request is made with the https: scheme (except on localhost)"
type:boolean
status:
status:
description:CanaryStatus defines the observed state of a canary.
type:object
properties:
properties:
phase:
phase:
description:Analysis phase of this canary
description:Analysis phase of this canary
@@ -708,28 +1216,46 @@ spec:
- Initialized
- Initialized
- Waiting
- Waiting
- Progressing
- Progressing
- WaitingPromotion
- Promoting
- Promoting
- Finalising
- Finalising
- Succeeded
- Succeeded
- Failed
- Failed
- Terminating
- Terminating
- Terminated
- Terminated
canaryWeight:
description:Traffic weight routed to canary
type:number
failedChecks:
failedChecks:
description:Failed check count of the current canary analysis
description:Failed check count of the current canary analysis
type:number
type:number
canaryWeight:
description:Traffic weight routed to canary
type:number
iterations:
iterations:
description:Iteration count of the current canary analysis
description:Iteration count of the current canary analysis
type:number
type:number
trackedConfigs:
description:TrackedConfig of this canary
additionalProperties:
type:string
type:object
lastAppliedSpec:
lastAppliedSpec:
description:LastAppliedSpec of this canary
description:LastAppliedSpec of this canary
type:string
type:string
lastPromotedSpec:
description:LastPromotedSpec of this canary
type:string
lastTransitionTime:
lastTransitionTime:
description:LastTransitionTime of this canary
description:LastTransitionTime of this canary
format:date-time
format:date-time
type:string
type:string
sessionAffinityCookie:
description:Session affinity cookie of the current canary run
type:string
primarySessionAffinityCookie:
description:Primary session affinity cookie of the current canary run
type:string
previousSessionAffinityCookie:
description:Session affinity cookie of the previous canary run
type:string
conditions:
conditions:
description:Status conditions of this canary
description:Status conditions of this canary
type:array
type:array
@@ -758,7 +1284,7 @@ spec:
description:Type of this condition
description:Type of this condition
type:string
type:string
---
---
apiVersion:apiextensions.k8s.io/v1beta1
apiVersion:apiextensions.k8s.io/v1
kind:CustomResourceDefinition
kind:CustomResourceDefinition
metadata:
metadata:
name:metrictemplates.flagger.app
name:metrictemplates.flagger.app
@@ -766,31 +1292,44 @@ metadata:
helm.sh/resource-policy:keep
helm.sh/resource-policy:keep
spec:
spec:
group:flagger.app
group:flagger.app
version:v1beta1
names:
kind:MetricTemplate
listKind:MetricTemplateList
plural:metrictemplates
singular:metrictemplate
categories:
- all
scope:Namespaced
versions:
versions:
- name:v1beta1
- name:v1beta1
served:true
served:true
storage:true
storage:true
- name:v1alpha1
served:true
storage:false
names:
plural:metrictemplates
singular:metrictemplate
kind:MetricTemplate
categories:
- all
scope:Namespaced
subresources:
subresources:
status:{}
status:{}
additionalPrinterColumns:
additionalPrinterColumns:
- name:Provider
- name:Provider
type:string
type:string
JSONPath:.spec.provider.type
jsonPath:.spec.provider.type
validation:
schema:
openAPIV3Schema:
openAPIV3Schema:
description:MetricTemplate is the Schema for the MetricTemplates API.
type:object
properties:
properties:
apiVersion:
description:'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type:string
kind:
description:'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type:string
metadata:
type:object
spec:
spec:
description:MetricTemplateSpec defines the desired state of a MetricTemplate.
type:object
required:
required:
- provider
- provider
- query
- query
@@ -808,11 +1347,23 @@ spec:
- prometheus
- prometheus
- influxdb
- influxdb
- datadog
- datadog
- stackdriver
- cloudwatch
- cloudwatch
- newrelic
- newrelic
- graphite
- dynatrace
- keptn
- splunk
address:
address:
description:API address of this provider
description:API address of this provider
type:string
type:string
headers:
description:Headers to add to HTTP(S) requests
type:object
additionalProperties:
type:array
items:
type:string
secretRef:
secretRef:
description:Kubernetes secret reference containing the provider credentials
description:Kubernetes secret reference containing the provider credentials
type:object
type:object
@@ -825,11 +1376,14 @@ spec:
region:
region:
description:Region of the provider
description:Region of the provider
type:string
type:string
insecureSkipVerify:
description:Disable SSL certificate validation for the provider address
type:boolean
query:
query:
description:Query of this metric template
description:Query of this metric template
type:string
type:string
---
---
apiVersion:apiextensions.k8s.io/v1beta1
apiVersion:apiextensions.k8s.io/v1
kind:CustomResourceDefinition
kind:CustomResourceDefinition
metadata:
metadata:
name:alertproviders.flagger.app
name:alertproviders.flagger.app
@@ -837,28 +1391,44 @@ metadata:
helm.sh/resource-policy:keep
helm.sh/resource-policy:keep
spec:
spec:
group:flagger.app
group:flagger.app
version:v1beta1
names:
kind:AlertProvider
listKind:AlertProviderList
plural:alertproviders
singular:alertprovider
categories:
- all
scope:Namespaced
versions:
versions:
- name:v1beta1
- name:v1beta1
served:true
served:true
storage:true
storage:true
names:
plural:alertproviders
singular:alertprovider
kind:AlertProvider
categories:
- all
scope:Namespaced
subresources:
subresources:
status:{}
status:{}
additionalPrinterColumns:
additionalPrinterColumns:
- name:Type
- name:Type
type:string
type:string
JSONPath:.spec.type
jsonPath:.spec.type
validation:
schema:
openAPIV3Schema:
openAPIV3Schema:
description:AlertProvider is the Schema for the AlertProvider API.
type:object
properties:
properties:
apiVersion:
description:'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type:string
kind:
description:'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type:string
metadata:
type:object
spec:
spec:
description:AlertProviderSpec defines the desired state of a AlertProvider.
type:object
oneOf:
oneOf:
- required:
- required:
- type
- type
@@ -875,9 +1445,19 @@ spec:
- msteams
- msteams
- discord
- discord
- rocket
- rocket
- gchat
channel:
description:Alert channel for this provider
type:string
username:
description:Bot username for this provider
type:string
address:
address:
description:Hook URL address of this provider
description:Hook URL address of this provider
type:string
type:string
proxy:
description:Http/s proxy of this provider
type:string
secretRef:
secretRef:
description:Kubernetes secret reference containing the provider address
description:Kubernetes secret reference containing the provider address
`metricsServer` | Prometheus URL, used when `prometheus.install` is `false` | `http://prometheus.istio-system:9090`
| `metricsServer` | Prometheus URL, used when `prometheus.install` is `false` | `http://prometheus.istio-system:9090` |
`prometheus.install` | If `true`, installs Prometheus configured to scrape all pods in the custer | `false`
| `prometheus.install` | If `true`, installs Prometheus configured to scrape all pods in the custer | `false` |
`prometheus.retention`| Prometheus data retention | `2h`
| `prometheus.retention` | Prometheus data retention | `2h` |
`selectorLabels` | List of labels that Flagger uses to create pod selectors | `app,name,app.kubernetes.io/name`
| `selectorLabels` | List of labels that Flagger uses to create pod selectors | `app,name,app.kubernetes.io/name` |
`configTracking.enabled` | If `true`, flagger will track changes in Secrets and ConfigMaps referenced in the target deployment | `true`
| `serviceMonitor.enabled` | If `true`, creates service and serviceMonitor for monitoring Flagger metrics | `false` |
`eventWebhook` | If set, Flagger will publish events to the given webhook | None
| `serviceMonitor.honorLabels` | If `true`, label conflicts are resolved by keeping label values from the scraped data and ignoring the conflicting server-side labels | `false` |
`slack.url` | Slack incoming webhook | None
| `serviceMonitor.namespace` | Namespace Servicemonitor is installed in | the same namespace |
`slack.channel` | Slack channel | None
| `serviceMonitor.labels` | labels for the ServiceMonitor passed to Prometheus Operator | `{}` |
`slack.user` | Slack username | `flagger`
| `configTracking.enabled` | If `true`, flagger will track changes in Secrets and ConfigMaps referenced in the target deployment | `true` |
`msteams.url` | Microsoft Teams incoming webhook | None
| `eventWebhook` | If set, Flagger will publish events to the given webhook | None |
`podMonitor.enabled` | If `true`, create a PodMonitor for [monitoring the metrics](https://docs.flagger.app/usage/monitoring#metrics) | `false`
| `slack.url` | Slack incoming webhook | None |
`podMonitor.namespace` | Namespace where the PodMonitor is created | the same namespace
| `slack.proxyUrl` | Slack proxy url | None |
`podMonitor.interval` | Interval at which metrics should be scraped | `15s`
| `slack.channel` | Slack channel | None |
`podMonitor.podMonitor` | Additional labels to add to the PodMonitor | `{}`
| `slack.user` | Slack username | `flagger` |
`leaderElection.enabled` | If `true`, Flagger will run in HA mode | `false`
| `msteams.url` | Microsoft Teams incoming webhook | None |
`leaderElection.replicaCount` | Number of replicas | `1`
| `msteams.proxyUrl` | Microsoft Teams proxy url | None |
`serviceAccount.create` | If `true`, Flagger will create service account | `true`
| `clusterName` | When specified, Flagger will add the cluster name to alerts | `""` |
`serviceAccount.name` | The name of the service account to create or use. If not set and `serviceAccount.create` is `true`, a name is generated using the Flagger fullname | `""`
| `podMonitor.enabled` | If `true`, create a PodMonitor for [monitoring the metrics](https://docs.flagger.app/usage/monitoring#metrics) | `false` |
`serviceAccount.annotations` | Annotations for service account | `{}`
| `podMonitor.namespace` | Namespace where the PodMonitor is created | the same namespace |
`ingressAnnotationsPrefix` | Annotations prefix for ingresses | `custom.ingress.kubernetes.io`
| `podMonitor.interval` | Interval at which metrics should be scraped | `15s` |
`includeLabelPrefix` | List of prefixes of labels that are copied when creating primary deployments or daemonsets. Use * to include all | `""`
| `podMonitor.podMonitor` | Additional labels to add to the PodMonitor | `{}` |
`rbac.create` | If `true`, create and use RBAC resources | `true`
| `podMonitor.honorLabels` | If `true`, label conflicts are resolved by keeping label values from the scraped data and ignoring the conflicting server-side labels | `false` |
`rbac.pspEnabled` | If `true`, create and use a restricted pod security policy | `false`
| `leaderElection.enabled` | If `true`, Flagger will run in HA mode | `false` |
`crd.create` | If `true`, create Flagger's CRDs (should be enabled for Helm v2 only) | `false`
| `leaderElection.replicaCount` | Number of replicas | `1` |
`resources.requests/cpu` | Pod CPU request | `10m`
| `serviceAccount.create` | If `true`, Flagger will create service account | `true` |
`resources.requests/memory` | Pod memory request | `32Mi`
| `serviceAccount.name` | The name of the service account to create or use. If not set and `serviceAccount.create` is `true`, a name is generated using the Flagger fullname | `""` |
`resources.limits/cpu` | Pod CPU limit | `1000m`
| `serviceAccount.annotations` | Annotations for service account | `{}` |
`resources.limits/memory` | Pod memory limit | `512Mi`
| `ingressAnnotationsPrefix` | Annotations prefix for ingresses | `custom.ingress.kubernetes.io` |
`affinity` | Node/pod affinities | None
| `includeLabelPrefix` | List of prefixes of labels that are copied when creating primary deployments or daemonsets. Use * to include all | `""` |
`nodeSelector` | Node labels for pod assignment | `{}`
| `rbac.create` | If `true`, create and use RBAC resources | `true` |
`threadiness` | Number of controller workers | `2`
| `rbac.pspEnabled` | If `true`, create and use a restricted pod security policy | `false` |
`tolerations` | List of node taints to tolerate | `[]`
| `crd.create` | If `true`, create Flagger's CRDs (should be enabled for Helm v2 only) | `false` |
`istio.kubeconfig.secretName` | The name of the Kubernetes secret containing the Istio shared control plane kubeconfig | None
| `resources.requests/cpu` | Pod CPU request | `10m` |
`istio.kubeconfig.key` | The name of Kubernetes secret data key that contains the Istio control plane kubeconfig | `kubeconfig`
| `resources.requests/memory` | Pod memory request | `32Mi` |
`ingressAnnotationsPrefix` | Annotations prefix for NGINX ingresses | None
| `resources.limits/cpu` | Pod CPU limit | `1000m` |
`ingressClass` | Ingress class used for annotating HTTPProxy objects, e.g. `contour` | None
| `resources.limits/memory` | Pod memory limit | `512Mi` |
`podPriorityClassName` | PriorityClass name for pod priority configuration | ""
description:Canary is the Schema for the Canary API.
type:object
properties:
properties:
apiVersion:
description:'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type:string
kind:
description:'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type:string
metadata:
type:object
spec:
spec:
description:CanarySpec defines the desired state of a Canary.
type:object
required:
required:
- targetRef
- targetRef
- service
- analysis
- analysis
properties:
properties:
provider:
provider:
@@ -97,7 +107,7 @@ spec:
name:
name:
type:string
type:string
autoscalerRef:
autoscalerRef:
description:HPA selector
description:Scaler selector
type:object
type:object
required:["apiVersion","kind","name"]
required:["apiVersion","kind","name"]
properties:
properties:
@@ -107,10 +117,24 @@ spec:
type:string
type:string
enum:
enum:
- HorizontalPodAutoscaler
- HorizontalPodAutoscaler
- ScaledObject
name:
name:
type:string
type:string
primaryScalerQueries:
type:object
additionalProperties:
type:string
primaryScalerReplicas:
type:object
properties:
minReplicas:
type:integer
minimum:1
maxReplicas:
type:integer
minimum:1
ingressRef:
ingressRef:
description:NGINX ingress selector
description:Ingress selector
type:object
type:object
required:["apiVersion","kind","name"]
required:["apiVersion","kind","name"]
properties:
properties:
@@ -122,6 +146,34 @@ spec:
- Ingress
- Ingress
name:
name:
type:string
type:string
routeRef:
description:APISIX route selector
type:object
required:["apiVersion","kind","name"]
properties:
apiVersion:
type:string
kind:
type:string
enum:
- ApisixRoute
name:
type:string
upstreamRef:
description:Gloo Upstream selector
type:object
required:["apiVersion","kind","name"]
properties:
apiVersion:
type:string
kind:
type:string
enum:
- Upstream
name:
type:string
namespace:
type:string
service:
service:
description:Kubernetes Service spec
description:Kubernetes Service spec
type:object
type:object
@@ -136,13 +188,24 @@ spec:
portName:
portName:
description:Container port name
description:Container port name
type:string
type:string
appProtocol:
description:Application protocol of the port
type:string
trafficDistribution:
description:Traffic distribution of the service
type:string
enum:
- PreferClose
- PreferSameZone
- PreferSameNode
targetPort:
targetPort:
description:Container target port name
description:Container target port name
anyOf:
x-kubernetes-int-or-string:true
- type:string
- type:number
portDiscovery:
portDiscovery:
description:Enable port dicovery
description:Enable port discovery
type:boolean
headless:
description:Headless if set to true, generates headless Kubernetes services.
type:boolean
type:boolean
timeout:
timeout:
description:HTTP or gRPC request timeout
description:HTTP or gRPC request timeout
@@ -167,15 +230,23 @@ spec:
description:URI match conditions
description:URI match conditions
type:array
type:array
items:
items:
type:object
properties:
properties:
uri:
authority:
type:object
oneOf:
oneOf:
- required:["exact"]
- not:
- required:["prefix"]
anyOf:
- required:["suffix"]
- required:
- required:["regex"]
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
properties:
exact:
exact:
format:string
format:string
@@ -183,12 +254,223 @@ spec:
prefix:
prefix:
format:string
format:string
type:string
type:string
suffix:
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
gateways:
description:
Names of gateways where the rule should be
applied.
items:
format:string
type:string
type:array
headers:
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
format:string
type:string
type:string
regex:
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
format:string
type:string
type:string
type:object
type:object
ignoreUriCase:
description:
Flag to specify whether the URI matching should
be case-insensitive.
type:boolean
method:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
name:
description:The name assigned to a match.
format:string
type:string
port:
description:
Specifies the ports on the host that is being
addressed.
type:integer
queryParams:
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
description:Query parameters for matching.
type:object
scheme:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
sourceLabels:
additionalProperties:
format:string
type:string
type:object
sourceNamespace:
description:
Source namespace constraining the applicability
of a rule to workloads in that namespace.
format:string
type:string
uri:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
withoutHeaders:
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
format:string
type:string
prefix:
format:string
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
format:string
type:string
type:object
description:
withoutHeader has the same syntax with the
header, but has opposite meaning.
type:object
type:object
retries:
retries:
description:Retry policy for HTTP requests
description:Retry policy for HTTP requests
type:object
type:object
@@ -211,6 +493,54 @@ spec:
uri:
uri:
format:string
format:string
type:string
type:string
authority:
format:string
type:string
type:
format:string
type:string
mirror:
description:Mirror defines a schema for a filter that mirrors requests.
description:Represents the warmup duration of Service.
type:string
type:string
outlierDetection:
outlierDetection:
description:Settings controlling eviction of unhealthy hosts from the load balancing pool.
description:Settings controlling eviction of unhealthy hosts from the load balancing pool.
@@ -542,12 +916,27 @@ spec:
type:object
type:object
additionalProperties:
additionalProperties:
type:string
type:string
unmanagedMetadata:
description:UnmanagedMetadata is a list of metadata keys that should be ignored by Flagger.
type:object
properties:
annotations:
type:array
items:
type:string
labels:
type:array
items:
type:string
skipAnalysis:
skipAnalysis:
description:Skip analysis and promote canary
description:Skip analysis and promote canary
type:boolean
type:boolean
revertOnDeletion:
revertOnDeletion:
description:Revert mutated resources to original spec on deletion
description:Revert mutated resources to original spec on deletion
type:boolean
type:boolean
suspend:
description:Suspend Canary disabling/pausing all canary runs
type:boolean
analysis:
analysis:
description:Canary analysis for this canary
description:Canary analysis for this canary
type:object
type:object
@@ -586,6 +975,12 @@ spec:
mirrorWeight:
mirrorWeight:
description:Weight of traffic to be mirrored
description:Weight of traffic to be mirrored
type:number
type:number
primaryReadyThreshold:
description:Percentage of pods that need to be available to consider primary as ready
type:number
canaryReadyThreshold:
description:Percentage of pods that need to be available to consider canary as ready
type:number
match:
match:
description:A/B testing match conditions
description:A/B testing match conditions
type:array
type:array
@@ -615,6 +1010,34 @@ spec:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax)
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax)
format:string
format:string
type:string
type:string
queryParams:
description:Query parameters for matching.
type:object
additionalProperties:
oneOf:
- not:
anyOf:
- required:
- exact
- required:
- prefix
- required:
- regex
- required:
- exact
- required:
- prefix
- required:
- regex
properties:
exact:
type:string
prefix:
type:string
regex:
description:RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
type:string
type:object
sourceLabels:
sourceLabels:
description:Applicable only when the 'mesh' gateway is included in the service.gateways list
description:Applicable only when the 'mesh' gateway is included in the service.gateways list
type:object
type:object
@@ -662,6 +1085,42 @@ spec:
namespace:
namespace:
description:Namespace of this metric template
description:Namespace of this metric template
type:string
type:string
templateVariables:
description:Additional variables to be used in the metrics query (key-value pairs)
type:object
additionalProperties:
type:string
alerts:
description:Alert list for this canary analysis
type:array
items:
type:object
required:
- providerRef
- name
properties:
name:
description:Name of the this alert
type:string
severity:
description:Severity level can be info, warn, error (default info)
type:string
enum:
- ""
- info
- warn
- error
providerRef:
description:Alert provider reference
type:object
required:["name"]
properties:
name:
description:Name of the alert provider
type:string
namespace:
description:Namespace of the alert provider
type:string
webhooks:
webhooks:
description:Webhook list for this canary
description:Webhook list for this canary
type:array
type:array
@@ -684,6 +1143,10 @@ spec:
- post-rollout
- post-rollout
- event
- event
- rollback
- rollback
- confirm-traffic-increase
muteAlert:
description:Mute all alerts for the webhook
type:boolean
url:
url:
description:URL address of this webhook
description:URL address of this webhook
type:string
type:string
@@ -692,12 +1155,57 @@ spec:
description:Request timeout for this webhook
description:Request timeout for this webhook
type:string
type:string
pattern:"^[0-9]+(m|s)"
pattern:"^[0-9]+(m|s)"
retries:
description:Number of retries for this webhook
type:number
disableTLS:
description:Disable TLS verification for this webhook
type:boolean
metadata:
metadata:
description:Metadata (key-value pairs) for this webhook
description:Metadata (key-value pairs) for this webhook
type:object
type:object
additionalProperties:
additionalProperties:
type:string
type:string
sessionAffinity:
description:SessionAffinity represents the session affinity settings for a canary run.
type:object
required:["cookieName"]
properties:
cookieName:
description:CookieName is the key that will be used for the session affinity cookie.
type:string
primaryCookieName:
description:CookieName is the key that will be used for the session affinity cookie.
type:string
domain:
description:Domain defines the host to which the cookie will be sent.
type:string
httpOnly:
description:HttpOnly forbids JavaScript from accessing the cookie, for example, through the Document.cookie property.
type:boolean
maxAge:
description:MaxAge indicates the number of seconds until the session affinity cookie will expire.
default:86400
type:number
partitioned:
description:Partitioned indicates that the cookie should be stored using partitioned storage.
type:boolean
path:
description:Path indicates the path that must exist in the requested URL for the browser to send the Cookie header.
type:string
sameSite:
description:SameSite controls whether or not a cookie is sent with cross-site requests.
type:string
enum:
- Strict
- Lax
- None
secure:
description:"Secure indicates that the cookie is sent to the server only when a request is made with the https: scheme (except on localhost)"
type:boolean
status:
status:
description:CanaryStatus defines the observed state of a canary.
type:object
properties:
properties:
phase:
phase:
description:Analysis phase of this canary
description:Analysis phase of this canary
@@ -708,28 +1216,46 @@ spec:
- Initialized
- Initialized
- Waiting
- Waiting
- Progressing
- Progressing
- WaitingPromotion
- Promoting
- Promoting
- Finalising
- Finalising
- Succeeded
- Succeeded
- Failed
- Failed
- Terminating
- Terminating
- Terminated
- Terminated
canaryWeight:
description:Traffic weight routed to canary
type:number
failedChecks:
failedChecks:
description:Failed check count of the current canary analysis
description:Failed check count of the current canary analysis
type:number
type:number
canaryWeight:
description:Traffic weight routed to canary
type:number
iterations:
iterations:
description:Iteration count of the current canary analysis
description:Iteration count of the current canary analysis
type:number
type:number
trackedConfigs:
description:TrackedConfig of this canary
additionalProperties:
type:string
type:object
lastAppliedSpec:
lastAppliedSpec:
description:LastAppliedSpec of this canary
description:LastAppliedSpec of this canary
type:string
type:string
lastPromotedSpec:
description:LastPromotedSpec of this canary
type:string
lastTransitionTime:
lastTransitionTime:
description:LastTransitionTime of this canary
description:LastTransitionTime of this canary
format:date-time
format:date-time
type:string
type:string
sessionAffinityCookie:
description:Session affinity cookie of the current canary run
type:string
primarySessionAffinityCookie:
description:Primary session affinity cookie of the current canary run
type:string
previousSessionAffinityCookie:
description:Session affinity cookie of the previous canary run
type:string
conditions:
conditions:
description:Status conditions of this canary
description:Status conditions of this canary
type:array
type:array
@@ -758,7 +1284,7 @@ spec:
description:Type of this condition
description:Type of this condition
type:string
type:string
---
---
apiVersion:apiextensions.k8s.io/v1beta1
apiVersion:apiextensions.k8s.io/v1
kind:CustomResourceDefinition
kind:CustomResourceDefinition
metadata:
metadata:
name:metrictemplates.flagger.app
name:metrictemplates.flagger.app
@@ -766,31 +1292,44 @@ metadata:
helm.sh/resource-policy:keep
helm.sh/resource-policy:keep
spec:
spec:
group:flagger.app
group:flagger.app
version:v1beta1
names:
kind:MetricTemplate
listKind:MetricTemplateList
plural:metrictemplates
singular:metrictemplate
categories:
- all
scope:Namespaced
versions:
versions:
- name:v1beta1
- name:v1beta1
served:true
served:true
storage:true
storage:true
- name:v1alpha1
served:true
storage:false
names:
plural:metrictemplates
singular:metrictemplate
kind:MetricTemplate
categories:
- all
scope:Namespaced
subresources:
subresources:
status:{}
status:{}
additionalPrinterColumns:
additionalPrinterColumns:
- name:Provider
- name:Provider
type:string
type:string
JSONPath:.spec.provider.type
jsonPath:.spec.provider.type
validation:
schema:
openAPIV3Schema:
openAPIV3Schema:
description:MetricTemplate is the Schema for the MetricTemplates API.
type:object
properties:
properties:
apiVersion:
description:'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type:string
kind:
description:'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type:string
metadata:
type:object
spec:
spec:
description:MetricTemplateSpec defines the desired state of a MetricTemplate.
type:object
required:
required:
- provider
- provider
- query
- query
@@ -808,11 +1347,23 @@ spec:
- prometheus
- prometheus
- influxdb
- influxdb
- datadog
- datadog
- stackdriver
- cloudwatch
- cloudwatch
- newrelic
- newrelic
- graphite
- dynatrace
- keptn
- splunk
address:
address:
description:API address of this provider
description:API address of this provider
type:string
type:string
headers:
description:Headers to add to HTTP(S) requests
type:object
additionalProperties:
type:array
items:
type:string
secretRef:
secretRef:
description:Kubernetes secret reference containing the provider credentials
description:Kubernetes secret reference containing the provider credentials
type:object
type:object
@@ -825,11 +1376,14 @@ spec:
region:
region:
description:Region of the provider
description:Region of the provider
type:string
type:string
insecureSkipVerify:
description:Disable SSL certificate validation for the provider address
type:boolean
query:
query:
description:Query of this metric template
description:Query of this metric template
type:string
type:string
---
---
apiVersion:apiextensions.k8s.io/v1beta1
apiVersion:apiextensions.k8s.io/v1
kind:CustomResourceDefinition
kind:CustomResourceDefinition
metadata:
metadata:
name:alertproviders.flagger.app
name:alertproviders.flagger.app
@@ -837,28 +1391,44 @@ metadata:
helm.sh/resource-policy:keep
helm.sh/resource-policy:keep
spec:
spec:
group:flagger.app
group:flagger.app
version:v1beta1
names:
kind:AlertProvider
listKind:AlertProviderList
plural:alertproviders
singular:alertprovider
categories:
- all
scope:Namespaced
versions:
versions:
- name:v1beta1
- name:v1beta1
served:true
served:true
storage:true
storage:true
names:
plural:alertproviders
singular:alertprovider
kind:AlertProvider
categories:
- all
scope:Namespaced
subresources:
subresources:
status:{}
status:{}
additionalPrinterColumns:
additionalPrinterColumns:
- name:Type
- name:Type
type:string
type:string
JSONPath:.spec.type
jsonPath:.spec.type
validation:
schema:
openAPIV3Schema:
openAPIV3Schema:
description:AlertProvider is the Schema for the AlertProvider API.
type:object
properties:
properties:
apiVersion:
description:'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type:string
kind:
description:'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type:string
metadata:
type:object
spec:
spec:
description:AlertProviderSpec defines the desired state of a AlertProvider.
type:object
oneOf:
oneOf:
- required:
- required:
- type
- type
@@ -875,9 +1445,19 @@ spec:
- msteams
- msteams
- discord
- discord
- rocket
- rocket
- gchat
channel:
description:Alert channel for this provider
type:string
username:
description:Bot username for this provider
type:string
address:
address:
description:Hook URL address of this provider
description:Hook URL address of this provider
type:string
type:string
proxy:
description:Http/s proxy of this provider
type:string
secretRef:
secretRef:
description:Kubernetes secret reference containing the provider address
description:Kubernetes secret reference containing the provider address
"expr":"histogram_quantile(0.50, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$primary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le))",
"expr":"histogram_quantile(0.50, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$primary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le)) / 1000",
"format":"time_series",
"format":"time_series",
"interval":"",
"interval":"",
"intervalFactor":1,
"intervalFactor":1,
@@ -411,7 +411,7 @@
"refId":"A"
"refId":"A"
},
},
{
{
"expr":"histogram_quantile(0.90, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$primary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le))",
"expr":"histogram_quantile(0.90, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$primary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le)) / 1000",
"format":"time_series",
"format":"time_series",
"hide":false,
"hide":false,
"intervalFactor":1,
"intervalFactor":1,
@@ -419,7 +419,7 @@
"refId":"B"
"refId":"B"
},
},
{
{
"expr":"histogram_quantile(0.99, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$primary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le))",
"expr":"histogram_quantile(0.99, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$primary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le)) / 1000",
"format":"time_series",
"format":"time_series",
"hide":false,
"hide":false,
"intervalFactor":1,
"intervalFactor":1,
@@ -509,7 +509,7 @@
"steppedLine":false,
"steppedLine":false,
"targets":[
"targets":[
{
{
"expr":"histogram_quantile(0.50, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$canary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le))",
"expr":"histogram_quantile(0.50, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$canary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le)) / 1000",
"format":"time_series",
"format":"time_series",
"interval":"",
"interval":"",
"intervalFactor":1,
"intervalFactor":1,
@@ -517,7 +517,7 @@
"refId":"A"
"refId":"A"
},
},
{
{
"expr":"histogram_quantile(0.90, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$canary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le))",
"expr":"histogram_quantile(0.90, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$canary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le)) / 1000",
"format":"time_series",
"format":"time_series",
"hide":false,
"hide":false,
"intervalFactor":1,
"intervalFactor":1,
@@ -525,7 +525,7 @@
"refId":"B"
"refId":"B"
},
},
{
{
"expr":"histogram_quantile(0.99, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$canary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le))",
"expr":"histogram_quantile(0.99, sum(irate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_workload=~\"$canary\", destination_workload_namespace=~\"$namespace\"}[1m])) by (le)) / 1000",
description:Flagger's load testing services based on rakyll/hey and bojand/ghz that generates traffic during canary analysis when configured as a webhook.
description:Flagger's load testing services based on rakyll/hey and bojand/ghz that generates traffic during canary analysis when configured as a webhook.
flag.StringVar(&eventWebhook,"event-webhook","","Webhook for publishing flagger events")
flag.StringVar(&eventWebhook,"event-webhook","","Webhook for publishing flagger events")
flag.StringVar(&msteamsURL,"msteams-url","","MS Teams incoming webhook URL.")
flag.StringVar(&msteamsURL,"msteams-url","","MS Teams incoming webhook URL.")
flag.StringVar(&msteamsProxyURL,"msteams-proxy-url","","MS Teams proxy URL.")
flag.StringVar(&includeLabelPrefix,"include-label-prefix","","List of prefixes of labels that are copied when creating primary deployments or daemonsets. Use * to include all.")
flag.StringVar(&includeLabelPrefix,"include-label-prefix","","List of prefixes of labels that are copied when creating primary deployments or daemonsets. Use * to include all.")
flag.StringVar(&namespace,"namespace","","Namespace that flagger would watch canary object.")
flag.StringVar(&namespace,"namespace","","Namespace that flagger would watch canary object.")
flag.StringVar(&meshProvider,"mesh-provider","istio","Service mesh provider, can be istio, linkerd, appmesh, contour, gloo, nginx or skipper.")
flag.StringVar(&meshProvider,"mesh-provider","istio","Service mesh provider, can be istio, linkerd, appmesh, contour, knative, gloo, nginx, skipper, traefik, apisix, osm or kuma.")
flag.StringVar(&selectorLabels,"selector-labels","app,name,app.kubernetes.io/name","List of pod labels that Flagger uses to create pod selectors.")
flag.StringVar(&selectorLabels,"selector-labels","app,name,app.kubernetes.io/name","List of pod labels that Flagger uses to create pod selectors.")
flag.StringVar(&ingressAnnotationsPrefix,"ingress-annotations-prefix","nginx.ingress.kubernetes.io","Annotations prefix for NGINX ingresses.")
flag.StringVar(&ingressAnnotationsPrefix,"ingress-annotations-prefix","nginx.ingress.kubernetes.io","Annotations prefix for NGINX ingresses.")
flag.StringVar(&ingressClass,"ingress-class","","Ingress class used for annotating HTTPProxy objects.")
flag.StringVar(&ingressClass,"ingress-class","","Ingress class used for annotating HTTPProxy objects.")
@@ -93,9 +121,12 @@ func init() {
flag.BoolVar(&enableConfigTracking,"enable-config-tracking",true,"Enable secrets and configmaps tracking.")
flag.BoolVar(&enableConfigTracking,"enable-config-tracking",true,"Enable secrets and configmaps tracking.")
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.