diff --git a/README.md b/README.md index b37a0c344..28da53adc 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Deploy Flagger in the `istio-system` namespace using Helm: ```bash # add the Helm repository -helm repo add flagger https://stefanprodan.github.io/flagger +helm repo add flagger https://flagger.app # install or upgrade helm upgrade -i flagger flagger/flagger \ @@ -32,10 +32,11 @@ Flagger is compatible with Kubernetes >1.10.0 and Istio >1.0.0. ### Usage -Flagger requires two Kubernetes [deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/): -one for the version you want to upgrade called _primary_ and one for the _canary_. -Each deployment must have a corresponding ClusterIP [service](https://kubernetes.io/docs/concepts/services-networking/service/) -that exposes a port named http or https. These services are used as destinations in a Istio [virtual service](https://istio.io/docs/reference/config/istio.networking.v1alpha3/#VirtualService). +Flagger takes a Kubernetes deployment and creates a series of objects +(Kubernetes [deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/), +ClusterIP [services](https://kubernetes.io/docs/concepts/services-networking/service/) and +Istio [virtual services](https://istio.io/docs/reference/config/istio.networking.v1alpha3/#VirtualService)) +to drive the canary analysis and promotion. ![flagger-overview](https://raw.githubusercontent.com/stefanprodan/flagger/master/docs/diagrams/flagger-overview.png) @@ -70,76 +71,35 @@ Gated canary promotion stages: You can change the canary analysis _max weight_ and the _step weight_ percentage in the Flagger's custom resource. -Assuming the primary deployment is named _podinfo_ and the canary one _podinfo-canary_, Flagger will require -a virtual service configured with weight-based routing: +For a deployment named _podinfo_, a canary promotion can be defined using Flagger's custom resource: ```yaml -apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - name: podinfo -spec: - hosts: - - podinfo - http: - - route: - - destination: - host: podinfo - port: - number: 9898 - weight: 100 - - destination: - host: podinfo-canary - port: - number: 9898 - weight: 0 -``` - -Primary and canary services should expose a port named http: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: podinfo-canary -spec: - type: ClusterIP - selector: - app: podinfo-canary - ports: - - name: http - port: 9898 - targetPort: 9898 -``` - -Based on the two deployments, services and virtual service, a canary promotion can be defined using Flagger's custom resource: - -```yaml -apiVersion: flagger.app/v1beta1 +apiVersion: flagger.app/v1alpha1 kind: Canary metadata: name: podinfo namespace: test spec: - targetKind: Deployment - virtualService: - name: podinfo - primary: + targetRef: + apiVersion: apps/v1 + kind: Deployment name: podinfo - host: podinfo - canary: - name: podinfo-canary - host: podinfo-canary + service: + port: 9898 + gateways: + - public-gateway.istio-system.svc.cluster.local + hosts: + - podinfo.example.com canaryAnalysis: - # max number of failed checks + # max number of failed metric checks # before rolling back the canary - threshold: 10 + threshold: 5 # max traffic percentage routed to canary # percentage (0-100) maxWeight: 50 # canary increment step # percentage (0-100) - stepWeight: 5 + stepWeight: 10 metrics: - name: istio_requests_total # minimum req success rate (non 5xx responses) @@ -150,7 +110,7 @@ spec: # maximum req duration P99 # milliseconds threshold: 500 - interval: 1m + interval: 30s ``` The canary analysis is using the following promql queries: @@ -198,8 +158,6 @@ histogram_quantile(0.99, ### Automated canary analysis, promotions and rollbacks -![flagger-canary](https://raw.githubusercontent.com/stefanprodan/flagger/master/docs/diagrams/flagger-canary-hpa.png) - Create a test namespace with Istio sidecar injection enabled: ```bash @@ -208,33 +166,18 @@ export REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml ``` -Create the primary deployment, service and hpa: +Create a deployment: ```bash -kubectl apply -f ${REPO}/artifacts/workloads/primary-deployment.yaml -kubectl apply -f ${REPO}/artifacts/workloads/primary-service.yaml -kubectl apply -f ${REPO}/artifacts/workloads/primary-hpa.yaml +kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml ``` - -Create the canary deployment, service and hpa: +Create a canary promotion custom resource (replace the Istio gateway and the internet domain with your own):: ```bash -kubectl apply -f ${REPO}/artifacts/workloads/canary-deployment.yaml -kubectl apply -f ${REPO}/artifacts/workloads/canary-service.yaml -kubectl apply -f ${REPO}/artifacts/workloads/canary-hpa.yaml +kubectl apply -f ${REPO}/artifacts/canaries/canary.yaml ``` -Create a virtual service (replace the Istio gateway and the internet domain with your own): - -```bash -kubectl apply -f ${REPO}/artifacts/workloads/virtual-service.yaml -``` - -Create a canary promotion custom resource: - -```bash -kubectl apply -f ${REPO}/artifacts/rollouts/podinfo.yaml -``` +![flagger-canary-steps](https://raw.githubusercontent.com/stefanprodan/flagger/master/docs/diagrams/flagger-canary-steps.png) Canary promotion output: @@ -265,9 +208,9 @@ Events: Normal Synced 55s flagger Advance podinfo.test canary weight 40 Normal Synced 45s flagger Advance podinfo.test canary weight 45 Normal Synced 35s flagger Advance podinfo.test canary weight 50 - Normal Synced 25s flagger Copying podinfo-canary.test template spec to podinfo.test + Normal Synced 25s flagger Copying podinfo.test template spec to podinfo-primary.test Warning Synced 15s flagger Waiting for podinfo.test rollout to finish: 1 of 2 updated replicas are available - Normal Synced 5s flagger Promotion completed! Scaling down podinfo-canary.test + Normal Synced 5s flagger Promotion completed! Scaling down podinfo.test ``` During the canary analysis you can generate HTTP 500 errors and high latency to test if Flagger pauses the rollout. @@ -313,14 +256,14 @@ Events: Normal Synced 2m flagger Halt podinfo.test advancement success rate 55.06% < 99% Normal Synced 2m flagger Halt podinfo.test advancement success rate 47.00% < 99% Normal Synced 2m flagger (combined from similar events): Halt podinfo.test advancement success rate 38.08% < 99% - Warning Synced 1m flagger Rolling back podinfo-canary.test failed checks threshold reached 10 - Warning Synced 1m flagger Canary failed! Scaling down podinfo-canary.test + Warning Synced 1m flagger Rolling back podinfo.test failed checks threshold reached 10 + Warning Synced 1m flagger Canary failed! Scaling down podinfo.test ``` Trigger a new canary deployment by updating the canary image: ```bash -kubectl -n test set image deployment/podinfo-canary \ +kubectl -n test set image deployment/podinfo \ podinfod=quay.io/stefanprodan/podinfo:1.2.1 ``` @@ -349,9 +292,9 @@ Events: Normal Synced 55s flagger Advance podinfo.test canary weight 40 Normal Synced 45s flagger Advance podinfo.test canary weight 45 Normal Synced 35s flagger Advance podinfo.test canary weight 50 - Normal Synced 25s flagger Copying podinfo-canary.test template spec to podinfo.test + Normal Synced 25s flagger Copying podinfo.test template spec to podinfo-primary.test Warning Synced 15s flagger Waiting for podinfo.test rollout to finish: 1 of 2 updated replicas are available - Normal Synced 5s flagger Promotion completed! Scaling down podinfo-canary.test + Normal Synced 5s flagger Promotion completed! Scaling down podinfo.test ``` ### Monitoring @@ -388,7 +331,7 @@ Advance podinfo.test canary weight 40 Halt podinfo.test advancement request duration 1.515s > 500ms Advance podinfo.test canary weight 45 Advance podinfo.test canary weight 50 -Copying podinfo-canary.test template spec to podinfo-primary.test +Copying podinfo-canary.test template spec to podinfo.test Scaling down podinfo-canary.test Promotion completed! podinfo-canary.test revision 81289 ``` diff --git a/docs/flagger-0.0.1.tgz b/docs/flagger-0.0.1.tgz index 479a1eb49..1baba3940 100644 Binary files a/docs/flagger-0.0.1.tgz and b/docs/flagger-0.0.1.tgz differ diff --git a/docs/grafana-5.2.4.tgz b/docs/grafana-5.2.4.tgz index 6a607f558..53e83c7a0 100644 Binary files a/docs/grafana-5.2.4.tgz and b/docs/grafana-5.2.4.tgz differ diff --git a/docs/index.yaml b/docs/index.yaml index 129be98ee..68befafa6 100755 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,11 +3,11 @@ entries: flagger: - apiVersion: v1 appVersion: 0.0.1 - created: 2018-10-07T13:00:10.107115+03:00 + created: 2018-10-11T02:02:20.205592+03:00 description: Flagger is a Kubernetes operator that automates the promotion of canary deployments using Istio routing for traffic shifting and Prometheus metrics for canary analysis. - digest: ddf0eda9975979bdfc26f10c7b3c15f4a31ebe0484be3285fbaec99b893871be + digest: b6fe3d84b5981e667e0cfed6146a04474192553111a2d11157dc6b705ec8e14c home: https://github.com/stefanprodan/flagger name: flagger urls: @@ -16,10 +16,10 @@ entries: grafana: - apiVersion: v1 appVersion: 5.2.0 - created: 2018-10-07T13:00:10.10763+03:00 + created: 2018-10-11T02:02:20.206046+03:00 description: A Helm chart for monitoring progressive deployments powered by Istio and Flagger - digest: 1e19e9010d2939e19d0f8465287676b185f4772f5df5a75092a8fce0b4a50e5e + digest: 82e43b6777c39dfc6cf2dabf5d51148a48d64ed0efb3fa0cd09290602ccbfb87 home: https://github.com/stefanprodan/flagger name: grafana urls: @@ -28,9 +28,9 @@ entries: podinfo-flagger: - apiVersion: v1 appVersion: 1.2.1 - created: 2018-10-07T13:00:10.108001+03:00 + created: 2018-10-11T02:02:20.206405+03:00 description: Podinfo Helm chart for Flagger progressive delivery - digest: 35ce41d10df123a785ba359491668a143c5918ce6d3d24f5b545ca2cb9134d91 + digest: 2cddd159d311a1e20d08f486481c1743c70f9cecefc3ae7554b357a8186919d9 engine: gotpl home: https://github.com/stefanprodan/k8s-podinfo maintainers: @@ -58,4 +58,4 @@ entries: urls: - https://stefanprodan.github.io/flagger/podinfo-flagger-1.2.1.tgz version: 1.2.1 -generated: 2018-10-07T13:00:10.106238+03:00 +generated: 2018-10-11T02:02:20.204687+03:00 diff --git a/docs/podinfo-flagger-2.0.0.tgz b/docs/podinfo-flagger-2.0.0.tgz index 362c140d0..5819cd43e 100644 Binary files a/docs/podinfo-flagger-2.0.0.tgz and b/docs/podinfo-flagger-2.0.0.tgz differ