A new phase of this series: progressive delivery with Flagger. We cover what Flagger is, its controller and CRD architecture, service mesh and ingress requirements, and how canary analysis, traffic shifting, and automatic promotion work.

In episode 14 you learned notifications: how every FluxCD controller produces events and how the Alert forwards them to Slack, Discord, or a webhook. Now we enter a new phase that leverages that observability: progressive delivery.
In this episode 15 we'll get to know Flagger, the progressive delivery tool that's part of the FluxCD ecosystem. We'll learn its concept, architecture, installation, and workflow — before dissecting canary, blue-green, and A/B testing strategies practically in episodes 16 and 17.
Progressive delivery is an approach to deploying a new version gradually while measuring its impact before all traffic is shifted. Unlike a rolling update, which only focuses on availability, progressive delivery focuses on quality verification during the deployment process.
| Approach | Traffic Control | Verification | Risk |
|---|---|---|---|
| Rolling update | None, gradual replicas | Basic health check | Medium |
| Canary | Gradual shifting | Metrics and analysis | Low |
| Blue-green | Full switch | Pre-promotion test | Low |
| A/B testing | Header or cookie | Experiment metrics | Low |
Flagger supports all of the strategies above: canary, A/B testing, and blue-green, with configurable metrics analysis.
Flagger is an open-source progressive delivery tool developed by Weaveworks and a part of the FluxCD ecosystem. Flagger runs as a Kubernetes controller that watches Deployment or DaemonSet objects, then automates the whole analysis and traffic shifting cycle.
Some important things about Flagger:
Canary CRDFlagger consists of one controller and several CRDs. Here are its main components:
| Component | Role |
|---|---|
| Flagger controller | Runs the analysis loop, creates canary resources, and makes promote or rollback decisions |
| Canary CRD | Defines the target, service, and analysis configuration |
| MetricTemplate CRD | Reusable metrics query templates for analysis |
| AlertProvider CRD | Flagger notification configuration to Slack, Teams, Discord, and more |
A minimal Canary CRD:
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: podinfo
namespace: test
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: podinfo
service:
port: 9898
analysis:
interval: 1m
iterations: 10
stepWeight: 10
maxWeight: 50
metrics:
- name: request-success-rate
threshold: 99
interval: 1mAn example MetricTemplate for a custom metric:
apiVersion: flagger.app/v1beta1
kind: MetricTemplate
metadata:
name: not-found-percentage
namespace: test
spec:
provider:
type: prometheus
address: http://prometheus.observability:9090
query: |
sum(rate(http_request_duration_seconds_count{status="404"}[2m]))
/
sum(rate(http_request_duration_seconds_count[2m]))An example AlertProvider:
apiVersion: flagger.app/v1beta1
kind: AlertProvider
metadata:
name: on-call
namespace: flux-system
spec:
type: slack
channel: on-call
secretRef:
name: slack-urlFlagger is installed through a Helm chart. Basic requirements: a Kubernetes cluster version 1.16 or later, kubectl, and Prometheus running in the cluster.
helm repo add flagger https://flagger.app
helm upgrade -i flagger flagger/flagger \
--namespace flux-system \
--set crd.create=true \
--set meshProvider=nginx \
--set metricsServer=http://prometheus.observability:9090Flagger is usually installed in the flux-system namespace, while the application resources it manages live in other namespaces. The meshProvider parameter determines how Flagger shifts traffic, and metricsServer points to the Prometheus used for analysis.
Flagger doesn't shift traffic itself — it delegates to the installed service mesh or ingress controller:
| Category | Provider |
|---|---|
| Service mesh | Istio, Linkerd, AWS App Mesh, Kuma, Open Service Mesh |
| Ingress controller | NGINX, Contour, Gloo, Traefik, Skipper |
| Gateway API | Supported for modern HTTPRoute-based routing |
Important
The meshProvider choice at install time must match what's actually installed in the cluster. Configuring the wrong provider will make Flagger fail to shift traffic when the canary analysis starts.
When a new Deployment is applied, Flagger runs the following cycle:
stepWeight and iterationsDuring the process, Flagger sends notifications through the AlertProvider, for example when the canary is scaled up, promoted, or rolled back. The entire process runs automatically without human intervention.
kubectl get canaries.flagger.app -n test
kubectl describe canary podinfo -n testTip
Use kubectl get canaries.flagger.app to see each canary's status, including the analysis phase, traffic weight, and the last promotion result.
Episode 15 introduced Flagger as the progressive delivery engine in the FluxCD ecosystem.
The key takeaways:
In the next episode, episode 16, we'll dissect Canary Deployments in depth: Canary CRD configuration, gradual traffic shifting strategy, metrics analysis, and the conditions that trigger automatic rollback. See you!