Prometheus Operator로 canary 분석
Prometheus Operator로 canary 분석 (Canary analysis with Prometheus Operator)
Prometheus Operator를 canary 분석에 사용하는 방법을 이 문서에서 알려드릴게요. ServiceMonitor와 MetricTemplate을 활용해 Flagger가 Prometheus 메트릭으로 릴리스를 검증하도록 구성해 봅시다.
출처: 문서
본문
사전 준비 (Prerequisites)
Flagger는 Kubernetes 클러스터 v1.16 이상과 Prometheus Operator v0.40 이상이 필요합니다.
Helm v3로 Prometheus Operator를 설치합니다:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
kubectl create ns monitoring
helm upgrade -i prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
--set fullnameOverride=prometheus
prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false 옵션은 Prometheus Operator가 자신의 네임스페이스 밖에 있는 serviceMonitor들도 감시할 수 있게 해줍니다.
메트릭 서버를 Prometheus로 설정하여 Flagger를 설치합니다:
helm repo add flagger https://flagger.app
kubectl create ns flagger-system
helm upgrade -i flagger flagger/flagger \
--namespace flagger-system \
--set metricsServer=http://prometheus-prometheus.monitoring:9090 \
--set meshProvider=kubernetes
Flagger 테스터를 설치합니다:
helm upgrade -i loadtester flagger/loadtester \
--namespace flagger-system
podinfo 데모 앱을 설치합니다:
helm repo add podinfo https://stefanprodan.github.io/podinfo
kubectl create ns test
helm upgrade -i podinfo podinfo/podinfo \
--namespace test \
--set service.enabled=false
서비스 모니터 (Service monitors)
데모 앱은 Prometheus로 계측되어 있으므로, podinfo의 메트릭 엔드포인트를 스크래핑할 ServiceMonitor 오브젝트를 생성할 수 있습니다:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: podinfo-canary
namespace: test
spec:
endpoints:
- path: /metrics
port: http
interval: 5s
selector:
matchLabels:
app: podinfo-canary
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: podinfo-primary
namespace: test
spec:
endpoints:
- path: /metrics
port: http
interval: 5s
selector:
matchLabels:
app: podinfo
보다 공격적인 스크래핑을 위해 interval: 5s로 설정합니다. 정의하지 않으려면 Canary 오브젝트에서 더 긴 간격을 사용해야 합니다.
메트릭 템플릿 (Metric templates)
HTTP 요청 오류율을 측정하는 메트릭 템플릿을 생성합니다:
apiVersion: flagger.app/v1beta1
kind: MetricTemplate
metadata:
name: error-rate
namespace: test
spec:
provider:
address: http://prometheus-prometheus.monitoring:9090
type: prometheus
query: |
100 - rate(
http_requests_total{
namespace="{{ namespace }}",
job="{{ target }}-canary",
status!~"5.*"
}[{{ interval }}])
/
rate(
http_requests_total{
namespace="{{ namespace }}",
job="{{ target }}-canary"
}[{{ interval }}]
) * 100
HTTP 요청 평균 지속 시간을 측정하는 메트릭 템플릿을 생성합니다:
apiVersion: flagger.app/v1beta1
kind: MetricTemplate
metadata:
name: latency
namespace: test
spec:
provider:
address: http://prometheus-prometheus.monitoring:9090
type: prometheus
query: |
histogram_quantile(0.99,
sum(
rate(
http_request_duration_seconds_bucket{
namespace="{{ namespace }}",
job="{{ target }}-canary"
}[{{ interval }}]
)
) by (le)
)
Canary 분석 (Canary analysis)
메트릭 템플릿을 사용해 HTTP 오류율과 지연 검사로 canary 분석을 구성할 수 있습니다:
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: 80
targetPort: http
name: podinfo
analysis:
interval: 30s
iterations: 10
threshold: 2
metrics:
- name: error-rate
templateRef:
name: error-rate
thresholdRange:
max: 1
interval: 30s
- name: latency
templateRef:
name: latency
thresholdRange:
max: 0.5
interval: 30s
webhooks:
- name: load-test
type: rollout
url: "http://loadtester.flagger-system/"
timeout: 5s
metadata:
type: cmd
cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test/"
위 스펙을 바탕으로 Flagger는 primary와 canary Kubernetes ClusterIP 서비스를 생성합니다.
canary 분석 중 Prometheus가 canary 서비스를 스크래핑하고, Flagger는 HTTP 오류율과 지연 쿼리를 사용해 릴리스를 승격할지 롤백할지 판단합니다.