[flagger] 정리

zzery·2022년 5월 22일

일지(2022~2024)

목록 보기
12/25

CRDs

  • Canaries : flagger로 배포 관리를 위한 리소스 (canary, A/B test, Blue/Green)
  • AlertProvider : 알림 관리를 위한 리소스 (Slack/Teams, 게시할 채널 등 정의)
  • MetricTemplate : canary analysis에서 사용할 메트릭 정의

적용 방법

flagger 관련이 모두 설치된 상황에서

  1. application 배포 (deployment, service, configMap)
  2. 해당 app에 대한 canary 리소스 배포 (1과 같이 수행해도 됨)

canary

targetRef

  • 참조할 대상의 deployment 정보
  • 해당 deployment의 selector.matchLabels 중 단 하나를 사용함.
    •  ####### 예시
        selector:
      	matchLabels:
        		app: podinfo
        		code: POD001
    • flagger의 기본 참조 라벨은 app, name, app.kubernetes.io/name 이렇게 3개라 app 라벨을 사용
    • 만약 code 라벨을 사용하고 싶다면 helm 차트의 selectorLabels 에 작성 필요.

service

  • service, virtualService(istio의 경우)에 대한 정보 작성
  • 만약 해당하는 리소스가 없다면 자동으로 생성함 (즉 최소 요구사항은 deployment 한개)
  • 이미 virtualService가 있던 경우에는?
    • ❯ k get vs
      NAME                GATEWAYS        HOSTS                             AGE
      local-dev-podinfo   ["local-dev"]   ["local.dev"]                     2m17s
      podinfo-service     ["local-dev"]   ["local.dev","podinfo-service"]   81s # new
    • canary에 기존 라우팅과 동일하게 설정했다면 모두 primary로 향하게 됨
    • 기존 service도 primary를 향하는 것으로 바뀜
    • 새 변경사항은 -canary 네이밍이 붙은 service로 연결
  • 다만 이렇게 할 경우, 호출하면 -primary로만 연결됨.
  • canary analysis로 weight가 바뀌는데, 이 부분은 -primary가 갱신되기 전까지 확인 불가능.
  • 하여간 canary를 배포하면 자동 생성하는 virtualService도 있긴 하다. (아래 참고)
    • ❯ k get vs
      NAME                GATEWAYS        HOSTS                 AGE
      local-dev-podinfo   ["local-dev"]   ["local.dev"]         19m
      podinfo-service     ["mesh"]        ["podinfo-service"]   3m45s
  • 자동 생성되는 virtualService 내용
    • route 항목을 보면 primarycanary마다 가중치를 주고 있음.
    • apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        annotations:
          kustomize.toolkit.fluxcd.io/reconcile: disabled
        creationTimestamp: "2022-05-22T08:44:20Z"
        generation: 7
        name: podinfo-service
        namespace: default
        ownerReferences:
        - apiVersion: flagger.app/v1beta1
          blockOwnerDeletion: true
          controller: true
          kind: Canary
          name: podinfo
          uid: 2258d59c-2aa0-4039-a9b9-3888a5fcb255
        resourceVersion: "333156"
        uid: 66cd6b7f-4d7b-4cd4-8d90-43d3d7413ef5
      spec:
        gateways:
        - local-dev
        hosts:
        - local.dev
        - podinfo-service
        http:
        - match:
          - uri:
              prefix: /podinfo
          retries:
            attempts: 3
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream
          rewrite:
            uri: /
          route:
          - destination:
              host: podinfo-service-primary
            weight: 100
          - destination:
              host: podinfo-service-canary
            weight: 0

canary 작성 예시

apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: podinfo
spec:
  # deployment reference
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
    
  # the maximum time in seconds for the canary deployment
  # to make progress before it is rollback (default 600s)
  progressDeadlineSeconds: 60
  
  service:
    # service reference
    name: podinfo-service
    port: 9898
    targetPort: 9898
    # Istio gateways (optional)
    gateways:
    - local-dev
    # Istio virtual service host names (optional)
    hosts:
    - local.dev
    match:
      - uri:
          prefix: /podinfo
    rewrite:
      uri: /
    # Istio traffic policy (optional)
    trafficPolicy:
      tls:
        mode: DISABLE
    # Istio retry policy (optional)
    retries:
      attempts: 3
      perTryTimeout: 1s
      retryOn: "gateway-error,connect-failure,refused-stream"
      
  analysis:
    # schedule interval (default 60s)
    interval: 10s
    # max number of failed metric checks before rollback
    threshold: 5
    # max traffic percentage routed to canary
    # percentage (0-100)
    maxWeight: 50
    # canary increment step
    # percentage (0-100)
    stepWeight: 10
    alerts:
      - name: "info alert"
        severity: info # error, warn, info
        providerRef:
          name: info-alert
          namespace: flagger-system

      - name: "warn alert"
        severity: warn # error, warn, info
        providerRef:
          name: error-alert
          namespace: flagger-system          

    metrics:
    # - name: request-success-rate
    - name: istio_requests_total
      thresholdRange:
        min: 50
      interval: 15s

    # # custom metric
    # - name: "404s percentage"
    #   templateRef:
    #     name: not-found-percentage
    #     namespace: istio-system
    #   thresholdRange:
    #     max: 5
    #   interval: 1m
profile
이 블로그의 모든 글은 수제로 짜여져 있습니다...

0개의 댓글