mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
Merge pull request #524 from Wihrt/prometheus-operator-docs
docs: Add prometheus-operator tutorial
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
# 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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user