본문 바로가기
WIKI 기술 지식 베이스

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 오류율과 지연 쿼리를 사용해 릴리스를 승격할지 롤백할지 판단합니다.

더 알아보기 (Learn more)