mirror of
https://github.com/fluxcd/flagger.git
synced 2026-03-02 17:51:00 +00:00
185 lines
4.4 KiB
Markdown
185 lines
4.4 KiB
Markdown
# Flagger with Prometheus Operator
|
|
|
|
This guide will show you how to use Flagger and Prometheus Operator.
|
|
This guide will handle only Blue/Green Deployment with podinfo application
|
|
|
|
## Prerequisites
|
|
|
|
Flagger and Prometheus Operator requires a Kubernetes cluster **v1.11** or newer
|
|
|
|
Install Prometheus-Operator with Helm v3:
|
|
|
|
```bash
|
|
helm repo add stable https://kubernetes-charts.storage.googleapis.com
|
|
helm repo update
|
|
kubectl create ns monitoring
|
|
helm upgrade -i prometheus stable/prometheus-operator \
|
|
--namespace monitoring \
|
|
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
|
|
--set fullnameOverride=prometheus
|
|
```
|
|
|
|
The `prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false` option allows Prometheus-Operator to watch serviceMonitor outside of his namespace.
|
|
|
|
You can also set `prometheus.service.type=nodePort` if you want to have access the Prometheus UI
|
|
|
|
Install Flagger with Helm v3:
|
|
|
|
```bash
|
|
helm repo add flagger https://flagger.app
|
|
helm repo update
|
|
kubectl create ns flagger
|
|
helm upgrade -i flagger flagger/flagger \
|
|
--namespace flagger \
|
|
--set metricsServer=http://prometheus-prometheus.monitoring:9090 \
|
|
--set meshProvider=kubernetes
|
|
```
|
|
|
|
The `meshProvider` option can be changed to your value, if you want to do something else than Blue/Green Deployment
|
|
|
|
Install Flagger Loadtester with Helm v3:
|
|
|
|
```bash
|
|
helm repo add flagger https://flagger.app
|
|
helm repo update
|
|
kubectl create ns flagger
|
|
helm upgrade -i loadtester flagger/loadtester \
|
|
--namespace flagger
|
|
```
|
|
|
|
Install podinfo with Helm v3:
|
|
|
|
```bash
|
|
helm repo add sp https://stefanprodan.github.io/podinfo
|
|
helm repo update
|
|
kubectl create ns test
|
|
helm upgrade -i podinfo sp/podinfo \
|
|
--namespace test
|
|
```
|
|
|
|
## Setting ServiceMonitor
|
|
|
|
Prometheus Operator is using mostly serviceMonitor instead of annotations.
|
|
In order to catch metrics for primary and canary service, you will need to create 2 serviceMonitors :
|
|
|
|
```yaml
|
|
apiVersion: monitoring.coreos.com/v1
|
|
kind: ServiceMonitor
|
|
metadata:
|
|
name: podinfo
|
|
namespace: test
|
|
spec:
|
|
endpoints:
|
|
- path: /metrics
|
|
port: http
|
|
interval: 15s
|
|
selector:
|
|
matchLabels:
|
|
app: podinfo
|
|
```
|
|
|
|
```yaml
|
|
apiVersion: monitoring.coreos.com/v1
|
|
kind: ServiceMonitor
|
|
metadata:
|
|
name: podinfo-canary
|
|
namespace: test
|
|
spec:
|
|
endpoints:
|
|
- path: /metrics
|
|
port: http
|
|
interval: 15s
|
|
selector:
|
|
matchLabels:
|
|
app: podinfo-canary
|
|
```
|
|
|
|
We are setting `interval: 15s` to have a more aggressive scraping
|
|
If you do not define it, you must to use a longer interval in the Canary object
|
|
|
|
## Setting Custom metrics
|
|
|
|
Prometheus Operator is relabeling for every serviceMonitor, you can create custom metrics to you own filter.
|
|
|
|
```yaml
|
|
apiVersion: flagger.app/v1beta1
|
|
kind: MetricTemplate
|
|
metadata:
|
|
name: request-success-rate
|
|
namespace: test
|
|
spec:
|
|
provider:
|
|
address: http://prometheus-prometheus.monitoring:9090
|
|
type: prometheus
|
|
query: |
|
|
rate(
|
|
http_requests_total{
|
|
namespace="{{ namespace }}",
|
|
job="{{ target }}-canary",
|
|
status!~"5.*"
|
|
}[{{ interval }}])
|
|
/
|
|
rate(
|
|
http_requests_total{
|
|
namespace="{{ namespace }}",
|
|
job="{{ target }}-canary"
|
|
}[{{ interval }}]
|
|
) * 100
|
|
```
|
|
|
|
You can also use `pod="{{ target }}-[0-9a-zA-Z]+(-[0-9a-zA-Z]+)"` instead of `job={{ target }}-canary`, if you want.
|
|
|
|
## Creating Canary
|
|
|
|
```yaml
|
|
apiVersion: flagger.app/v1beta1
|
|
kind: Canary
|
|
metadata:
|
|
name: podinfo
|
|
namespace: test
|
|
spec:
|
|
provider: kubernetes
|
|
targetRef:
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
name: podinfo
|
|
progressDeadlineSeconds: 60
|
|
service:
|
|
port: 9898
|
|
portDiscovery: true
|
|
analysis:
|
|
interval: 30s
|
|
iterations: 10
|
|
threshold: 2
|
|
metrics:
|
|
- name: http-success-rate
|
|
templateRef:
|
|
name: request-success-rate
|
|
namespace: test
|
|
thresholdRange:
|
|
min: 99
|
|
interval: 1m
|
|
webhooks:
|
|
- name: smoke-test
|
|
type: pre-rollout
|
|
url: "http://loadtester.flagger/"
|
|
timeout: 15s
|
|
metadata:
|
|
type: bash
|
|
cmd: "curl -sd 'anon' http://podinfo-canary.test:9898/token | grep token"
|
|
- name: load-test
|
|
type: rollout
|
|
url: "http://loadtester.flagger/"
|
|
timeout: 5s
|
|
metadata:
|
|
type: cmd
|
|
cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test:9898"
|
|
```
|
|
|
|
## Test the canary
|
|
|
|
Execute `kubectl -n test set image deployment/podinfo podinfo=stefanprodan/podinfo:3.1.0` to see if everything works
|
|
|
|
|
|
|