Google Kubernetes Engine에서 Spinnaker를 사용한 카나리아 분석 자동화

이 가이드에서는 자동화된 GKE(Google Kubernetes Engine)에서 Spinnaker의 자동화된 카나리아 분석 기능을 구성하는 과정을 안내합니다.

소개

Spinnaker는 App Engine, GKE, Compute Engine, AWS, Azure를 비롯한 다양한 컴퓨팅 플랫폼에서의 앱 배포를 관리하기 위해 Netflix와 Google이 주도하는 오픈소스 기반의 지속적 배포 시스템입니다. Spinnaker를 사용하면 카나리아 배포를 비롯한 고급 배포 방법을 구현할 수 있습니다.

카나리아 배포에서는 프로덕션 트래픽의 작은 부분에 새 버전의 앱을 노출하고 전체 배포로 진행하기 전 새 버전의 동작을 분석합니다. 이렇게 함으로써 새 버전을 모든 사용자에게 배포하기 전 위험 요소를 완화할 수 있습니다. 카나리아 배포를 사용하기 위해서는 이전 버전 앱 동작과 새 버전 앱 동작을 정확하게 비교해야 합니다. 이러한 차이는 미미할 수 있고 일정 시간이 지난 후에 나타날 수도 있습니다. 또한 다양한 측정항목을 조사해야 할 수도 있습니다.

이러한 문제를 해결하기 위해 Spinnaker는 자동화된 카나리아 분석 기능을 제공합니다. 이 기능은 모니터링 시스템에서 두 버전의 측정항목을 읽고, 통계적 분석을 실행하여 비교를 자동화합니다. 이 가이드에서는 GKE에 배포되고 Stackdriver에서 모니터링되는 앱에서 자동화된 카나리아 분석을 수행하는 방법을 보여줍니다.

Spinnaker는 배포 시나리오가 복잡하고 종종 전용 릴리스 엔지니어링 기능을 사용하는 조직을 위한 고급 앱 배포 및 관리 플랫폼입니다. 이 가이드는 Spinnaker를 사용한 경험이 없어도 실행할 수 있습니다. 하지만 프로덕션에서 자동화된 카나리아 분석을 구현하는 작업은 일반적으로 강력한 모니터링 시스템인 Spinnaker를 이미 사용한 경험이 있고, 릴리스가 안전한지 여부를 확인하는 방법을 알고 있는 팀에서 수행됩니다.

이 가이드 정보

이 가이드의 앱은 환경 변수를 사용해서 오류율이 구성된 간단한 'Hello World'입니다. 이 앱에는 사전 빌드된 Docker 이미지가 제공됩니다. 다음 이미지에 표시된 것처럼 이 앱은 Prometheus 형식으로 측정항목을 노출합니다. 이 형식은 Kubernetes 커뮤니티에서 인기 있는 오픈소스 모니터링 시스템이며, Stackdriver와 호환됩니다.

앱 아키텍처

목표

  • GKE 클러스터를 만듭니다.
  • Spinnaker를 설치합니다.
  • 카나리아 배포 없이 GKE에 앱을 배포합니다.
  • 앱의 카나리아 배포를 구성하고 실행합니다.
  • 자동화된 카나리아 분석을 구성합니다.
  • 자동화된 카나리아 분석을 테스트합니다.

비용

시작하기 전에

  1. GCP 프로젝트를 선택하거나 만듭니다.

    리소스 관리 페이지로 이동

  2. 프로젝트에 결제를 사용 설정합니다.

    결제 사용 설정

  3. Stackdriver 계정을 만듭니다.

    Stackdriver 문서로 이동

이 가이드를 마친 후에 계속 비용이 청구되지 않도록 하려면 만든 리소스를 삭제하면 됩니다. 자세한 내용은 삭제를 참조하세요.

환경 설정

이 섹션에서는 가이드를 완료하는 데 필요한 인프라를 구성합니다. Cloud Shell에서 이 가이드의 모든 터미널 명령어를 실행합니다.

  1. Cloud Shell을 엽니다.

    Cloud Shell로 이동

  2. 프로젝트 ID를 변수로 내보냅니다.

    export GOOGLE_CLOUD_PROJECT=[PROJECT_ID]
    

    각 항목의 의미는 다음과 같습니다.

    • [PROJECT_ID]는 사용 중인 프로젝트의 ID를 나타냅니다.
  3. GKE 클러스터를 만듭니다.

    gcloud config set project $GOOGLE_CLOUD_PROJECT
    gcloud config set compute/zone us-central1-f
    gcloud services enable container.googleapis.com
    gcloud beta container clusters create kayenta-tutorial \
        --machine-type=n1-standard-2 --cluster-version=1.10 \
        --enable-stackdriver-kubernetes \
        --scopes=gke-default,compute-ro
    gcloud container clusters get-credentials kayenta-tutorial
    

  4. Stackdriver-Prometheus 통합 플러그인을 설치합니다.

    kubectl apply --as=admin --as-group=system:masters -f \
        https://storage.googleapis.com/stackdriver-prometheus-documentation/rbac-setup.yml
    curl -sS "https://storage.googleapis.com/stackdriver-prometheus-documentation/prometheus-service.yml" | \
        sed "s/_stackdriver_project_id:.*/_stackdriver_project_id: $GOOGLE_CLOUD_PROJECT/" | \
        sed "s/_kubernetes_cluster_name:.*/_kubernetes_cluster_name: kayenta-tutorial/" | \
        sed "s/_kubernetes_location:.*/_kubernetes_location: us-central1-f/" | \
        kubectl apply -f -
    

  5. 새로운 GKE 클러스터에 Spinnaker를 배포합니다.

    kubectl apply -f https://spinnaker.io/downloads/kubernetes/quick-install.yml
    

  6. 배포를 완료하는 데 몇 분 정도 걸립니다. 진행 상태를 확인하려면 watch kubectl -n spinnaker get pods 명령어를 실행합니다. watch 명령어를 중지하려면 Ctrl+C를 누릅니다. 배포가 완료되면 이 명령어가 모든 포드를 Ready 1/1로 출력합니다.

    NAME                                READY  STATUS    RESTARTS   AGE
    minio-deployment-7c665c4b57-jx7px   1/1    Running   0          5m
    spin-clouddriver-789c6fff77-rjtc6   1/1    Running   0          4m
    spin-deck-68b5968f7f-trmkn          1/1    Running   0          4m
    spin-echo-57dbff9fb8-rq5qc          1/1    Running   0          4m
    spin-front50-67965475b8-l24db       1/1    Running   0          4m
    spin-gate-6d8bbf8c45-m9pzn          1/1    Running   0          4m
    spin-halyard-59fd54bd69-xns49       1/1    Running   0          5m
    spin-kayenta-99b97b85f-4gvsv        1/1    Running   0          4m
    spin-orca-5748974888-cph9g          1/1    Running   0          4m
    spin-redis-6d49c9c5b9-q2hzm         1/1    Running   0          4m
    spin-rosco-6b4ddbcb94-mjrht         1/1    Running   0          4m
    

  7. Spinnaker에 액세스하려면 Spinnaker의 데크 구성요소로 로컬 포트를 전달합니다.

    DECK_POD=$(kubectl -n spinnaker get pods -l \
        cluster=spin-deck,app=spin \
        -o=jsonpath='{.items[0].metadata.name}')
    kubectl -n spinnaker port-forward $DECK_POD 8080:9000 >/dev/null &
    

  8. Cloud Shell에서 웹 미리보기 아이콘을 클릭하고 포트 8080에서 미리보기를 선택합니다.

    포트 8080의 웹 미리보기 아이콘

Spinnaker로 앱 배포

이 섹션에서는 GKE 클러스터에서 앱을 배포하도록 Spinnaker를 구성합니다.

Spinnaker 앱 만들기

배포하기 전 Spinnaker 앱을 만듭니다.

  1. Spinnaker에서 Actions(작업) > Create Application(애플리케이션 만들기)을 클릭합니다.

    애플리케이션 만들기 드롭다운 메뉴

  2. New Application(새 애플리케이션) 대화상자에서 다음 값을 입력합니다.

    • Name(이름): sampleapp
    • Owner Email(소유자 이메일): [example@example.com]

  3. 만들기를 클릭합니다.

이제 Spinnaker의 Spinnaker이 준비되었습니다. 아직은 구성이 완료되지 않았으므로 대부분의 탭이 비어 있습니다.

배포 파이프라인 만들기 및 실행

이 섹션에서는 먼저 successRate 매개변수를 사용해서 4개의 포드가 포함된 GKE 배포를 만드는 간단한 Spinnaker 파이프라인으로 앱을 배포합니다. 이러한 포드는 successRate 매개변수에 따른 비율로 오류를 무작위로 발생시킵니다. 이 가이드에서 이러한 포드는 100 - successRate의 비율로 500개의 오류를 발생시킵니다.

  1. Cloud Shell에서 제공된 JSON 파일로 파이프라인을 만듭니다. 다음 명령어는 파이프라인의 JSON 정의를 Spinnaker API에 직접 게시합니다.

    wget https://raw.githubusercontent.com/spinnaker/spinnaker/master/solutions/kayenta/pipelines/simple-deploy.json
    curl -d@simple-deploy.json -X POST \
        -H "Content-Type: application/json" -H "Accept: /" \
        http://localhost:8080/gate/pipelines
    

  2. Spinnaker의 파이프라인 섹션에서 Simple deploy라는 파이프라인이 표시됩니다. 항목이 표시되지 않으면 페이지를 다시 로드합니다. Start Manual Execution(수동 실행 시작)을 클릭합니다.

    단순 배포 파이프라인의 수동 실행 시작

  3. Confirm Execution(실행 확인) 창에서 Success Rate(성공률)70을 선택한 후 Run(실행)을 클릭합니다. 몇 초 후 파이프라인이 앱과 4개의 포드 구성을 성공적으로 배포합니다.

  4. Cloud Shell에서 이 가이드가 끝날 때까지 새 앱에 요청을 수행하는 포드를 만듭니다.

    kubectl -n default run injector --image=alpine -- \
        /bin/sh -c "apk add --no-cache --yes curl; \
        while true; do curl -sS --max-time 3 \
        http://sampleapp:8080/; done"
    

인젝터의 로그 확인

  1. 앱의 동작을 보기 위해 인젝터의 로그를 확인합니다.

    kubectl -n default logs -f \
        $(kubectl -n default get pods -l run=injector \
        -o=jsonpath='{.items[0].metadata.name}')
    

  2. 많은 수의 내부 서버 오류 메시지가 로그에 표시됩니다. 인젝터의 로그 보기를 중지하려면 Ctrl+C를 누릅니다.

앱 상태 확인

이제 앱이 배포되었고 트래픽을 제공하므로, 올바르게 작동하는지 확인해야 합니다. 물론 이 가이드에서는 성공률 70%로만 앱을 배포했기 때문에 올바르게 작동하지 않는다는 것을 이미 알고 있습니다.

이 앱은 Stackdriver에서 주입된 Prometheus 형식의 측정항목으로 /metrics 엔드포인트를 노출합니다. 이 섹션에서는 이러한 측정항목을 Stackdriver에서 시각화합니다.

  1. Stackdriver에서 측정항목 탐색기로 이동합니다.

    측정항목 탐색기

  2. 리소스 유형 및 측정항목 찾기 필드에서 다음을 입력합니다.

    external.googleapis.com/prometheus/requests
    

  3. 그룹화 기준 필드에서 그래프를 세분화하기 위해 http_code를 입력합니다. 다음 그래프에서 앱이 응답하는 HTTP 요청 비율은 HTTP 상태 코드로 그룹화됩니다.

    앱에서 응답한 HTTP 요청 그래프

그래프에 표시된 것처럼 앱의 현재 오류율은 예상대로 수용할 수 없는 30%입니다. 이 가이드의 나머지 부분에서는 이렇게 오류율이 높은 앱을 더 이상 배포할 수 없도록 카나리아 배포 파이프라인 및 자동 분석을 설정하는 과정을 안내합니다.

카나리아 배포 만들기

이 섹션에서는 앱을 프로덕션에 완전히 배포하기 전 새 버전을 테스트하기 위해 자동화된 분석 없이 카나리아 배포 파이프라인을 만듭니다. 다음 이미지에서는 이 파이프라인의 여러 단계를 보여줍니다.

카나리아 배포 파이프라인의 단계 그림

  • 0단계: Simple Deploy 파이프라인에서와 같이, 파이프라인이 성공률 매개변수를 입력으로 사용합니다. 이 새로운 파이프라인은 이 매개변수를 사용하여 여러 성공률을 시뮬레이션합니다. 이것이 파이프라인의 Configuration(구성) 단계입니다.
  • 1단계: Find Baseline Version(기준 버전 찾기) 단계에서는 Simple Deploy 파이프라인의 최근 실행으로부터 프로덕션에서 실행 중인 앱의 현재 버전을 검색합니다. 이 가이드에서는 현재 배포된 앱의 성공률을 검색합니다.
  • Find Baseline Version(기준 버전 찾기) 단계와 함께 Deploy Canary Config(카나리아 구성 배포) 단계에서는 앱의 카나리아 버전을 위한 새로운 성공률 구성을 배포합니다.
  • 2단계: Deploy Canary(카나리아 배포)Deploy Baseline(기준 배포) 단계는 비교할 두 버전인 새로운 카나리아 버전과 기준 버전을 배포합니다. 카나리아 버전은 Deploy Canary Config(카나리아 구성 배포)에서 생성된 구성을 사용하고, 기준 버전은 프로덕션 버전에서 사용되는 구성을 사용합니다.

  • 3단계: Manual Judgment(수동 판단) 단계에서는 개발자가 작업을 계속하기 전까지 파이프라인을 중지합니다. 이 단계 중에는 카나리아 버전이 올바르게 작동하는지 확인할 수 있습니다.

  • 4단계: 수동 판단 단계를 지나서 작업을 계속하면 Delete Canary(카나리아 삭제)Delete Baseline(기준 삭제) 단계 모두 인프라를 삭제합니다.
  • 삭제와 함께 Deploy to Production(프로덕션에 배포) 단계가 실행되고 처음에 지정한 것과 동일한 성공률 매개변수를 사용해서 Simple Deploy 파이프라인을 트리거합니다. 카나리아에서 테스트한 것과 동일한 앱 버전이 프로덕션에 배포됩니다.
  • Deploy to Production(프로덕션에 배포) 단계는 개발자가 Manual Judgment(수동 판단) 단계 중에 작업을 계속하도록 선택한 경우에만 트리거됩니다.
  • 5단계: 마지막으로 Successful Deployment(배포 성공) 단계에서는 전체 파이프라인이 성공적인지 확인합니다. Manual Judgment(수동 판단) 단계에서 작업을 진행하도록 지정했는지 확인하고, Deploy to Production(프로덕션에 배포), Delete Canary(카나리아 삭제), Delete Baseline(기준 삭제) 단계가 성공적으로 실행된 경우에만 실행됩니다.

이제 Canary Deploy 파이프라인을 만들 수 있습니다.

  1. Canary Deploy 파이프라인을 만들려면 다음 명령어를 실행하여 Simple Deploy 파이프라인의 ID를 가져오고 이를 Canary Deploy 파이프라인에 삽입합니다.

    wget https://raw.githubusercontent.com/spinnaker/spinnaker/master/solutions/kayenta/pipelines/canary-deploy.json
    export PIPELINE_ID=$(curl \
        localhost:8080/gate/applications/sampleapp/pipelineConfigs/Simple%20deploy \
        | jq -r '.id')
    jq '(.stages[] | select(.refId == "9") | .pipeline) |= env.PIPELINE_ID | (.stages[] | select(.refId == "8") | .pipeline) |= env.PIPELINE_ID' canary-deploy.json | \
        curl -d@- -X POST \
        -H "Content-Type: application/json" -H "Accept: /" \
        http://localhost:8080/gate/pipelines
    

  2. Spinnaker에서 Canary Deploy 파이프라인이 표시되지 않으면 sampleapp 페이지를 다시 로드하고 Pipelines(파이프라인)를 클릭합니다.

  3. Canary Deploy 파이프라인을 시작하려면 다음 안내를 따르세요.

    1. Start Manual Execution(수동 실행 시작)을 클릭합니다.
    2. Success Rate(성공률)80을 선택합니다.
    3. 실행을 클릭합니다.
  4. 파이프라인이 Manual Judgment(수동 판단) 단계에 도달하면 카나리아 버전을 기준 버전과 비교해야 하므로, Continue(계속)를 클릭하지 않습니다.

    카나리아 파이프라인의 수동 판단 단계

  5. Cloud Shell에서 kubectl -n default get pods 명령어를 실행하여 라벨이 canary 및 baseline으로 지정된 새 포드를 찾습니다.

    NAME                                READY STATUS  RESTARTS  AGE
    injector-66bd655ffd-9ntwx           1/1   Running 0         30m
    sampleapp-5cdf8f55dd-995rz          1/1   Running 0         28m
    sampleapp-5cdf8f55dd-dqq8n          1/1   Running 0         28m
    sampleapp-5cdf8f55dd-ntq57          1/1   Running 0         28m
    sampleapp-5cdf8f55dd-rlpzp          1/1   Running 0         28m
    sampleapp-baseline-567b8d6849-gsgqr 1/1   Running 0          4m
    sampleapp-canary-54b9759dd6-gmjhc   1/1   Running 0          4m
    

  6. Stackdriver에서 측정항목 탐색기로 이동합니다.

    측정항목 탐색기

  7. 측정항목 탐색기에 이미 구성된 측정항목이 있으면 양식에서 모든 기존 구성을 삭제합니다.

  8. 첫 번째 측정항목으로 카타리아 데이터를 선택하고 다음 매개변수를 지정합니다.

    1. 측정항목: external.googleapis.com/prometheus/requests
    2. 필터:

      • http_code = 500
      • pod_name = sampleapp-canary-*
  9. 두 번째 측정항목으로 기준 데이터를 선택하려면 + 측정항목 추가를 클릭하고 다음 필드를 완료합니다.

    1. 측정항목: external.googleapis.com/prometheus/requests
    2. 필터:

      • http_code = 500
      • pod_name = sampleapp-baseline-*
  10. 카나리아 버전(다음 그래프에서 자주색)과 기준 버전(다음 그래프에서 파란색)을 비교합니다. 색상은 그래프에서 다르게 표시될 수 있습니다. 이 가이드에서는 카나리아 버전의 오류율이 기준 버전보다 낮습니다. 따라서 카나리아 버전을 프로덕션에 완전히 배포하는 것이 안전합니다. 카나리아 버전의 오류율이 낮지 않으면 이 단계에서 배포를 중지하고 앱을 수정해야 할 수 있습니다.

    카나리아 오류율과 기준 버전 비교 그래프

  11. Spinnaker의 Manual Judgement(수동 판단) 대화상자에서 Continue(계속)를 클릭합니다.

    카나리아 파이프라인의 수동 판단 단계

  12. 배포가 완료되면 Stackdriver에서 다시 측정항목 탐색기로 돌아갑니다.

    측정항목 탐색기

  13. 측정항목 탐색기에 이미 구성된 측정항목이 있으면 양식에서 모든 기존 구성을 삭제합니다.

  14. 리소스 유형 및 측정항목 찾기 필드에서 다음을 입력합니다.

    external.googleapis.com/prometheus/requests
    

  15. 그룹화 기준 필드에 http_code를 입력합니다. 다음 그래프에서 앱이 응답하는 HTTP 요청 비율은 HTTP 상태 코드로 분할됩니다.

    HTTP 요청 비율 비교 그래프

    이 그래프는 프로덕션, 기준, 카나리아의 모든 포드에 대해 200 및 500의 HTTP 코드 비율을 보여줍니다. 카나리아 버전의 오류율이 더 낮기 때문에, 이를 프로덕션에 배포했습니다. 총 요청 수가 약간 낮아지는 배포 중 짧은 기간이 지난 후 전체 오류율이 낮아지는 것을 볼 수 있습니다. 이 때 카나리아 버전이 프로덕션에 올바르게 배포됩니다.

카나리아 분석 자동화

카나리아 배포는 유용하지만, 현재 구현에서는 수동 과정입니다. 전체 배포를 수행하기 전 카나리아가 원하는 대로 작동하는지를 수동으로 확인해야 합니다. 그리고 카나리아 버전과 기준 버전 사이의 차이가 항상 명확하지는 않습니다.

사람이 분석을 직접 수행할 필요가 없고, 측정항목 집합 중에서 문제를 직접 감지하는 것보다 자동화된 통계적 분석을 수행하는 것이 더 적합하기 때문에 자동화된 카나리아 분석이 더 유용합니다. 이 섹션에서는 Manual Judgement(수동 판단) 단계를 자동화된 카나리아 분석으로 바꿉니다.

카나리아 지원 사용 설정

먼저 Spinnaker에서 Kayenta라는 자동화된 카나리아 분석 기능을 구성합니다. Kayenta를 구성하려면 Spinnaker를 구성하고 배포하기 위해 사용하는 것과 동일한 도구인 Halyard를 사용합니다.

  1. Cloud Shell에서 프로젝트 ID를 가져옵니다.

    echo $GOOGLE_CLOUD_PROJECT
    

  2. Halyard 포드에서 셸을 표시합니다.

    export HALYARD_POD=$(kubectl -n spinnaker get pods -l \
        stack=halyard,app=spin \
        -o=jsonpath='{.items[0].metadata.name}')
    kubectl -n spinnaker exec -it $HALYARD_POD -- bash
    

  3. Stackdriver를 백엔드로 사용하도록 Kayenta를 구성합니다.

    hal config canary google enable
    hal config canary google account add kayenta-tutorial --project [PROJECT_ID]
    hal config canary google edit --stackdriver-enabled=true
    

    각 항목의 의미는 다음과 같습니다.

    • [PROJECT_ID]는 검색한 프로젝트 ID를 나타냅니다.
  4. 새 구성을 적용하고 Halyard 포드를 종료합니다.

    hal deploy apply
    exit
    

  5. 배포를 완료하는 데 몇 분 정도 걸립니다. 진행 상태를 확인하려면 watch kubectl -n spinnaker get pods 명령어를 실행합니다. 배포가 완료되면 이 명령어가 Ready 1/1 상태의 모든 포드를 출력합니다. watch 명령어를 중지하려면 Ctrl+C를 누릅니다.

    NAME                               READY  STATUS   RESTARTS AGE
    minio-deployment-7c665c4b57-prl6d  1/1    Running  0        1h
    spin-clouddriver-6c4f954667-8769c  1/1    Running  0        1h
    spin-deck-7d44499f9b-hkqz4         1/1    Running  0        1h
    spin-echo-6cf4bbbbfc-vxzlr         1/1    Running  0        1h
    spin-front50-7666c894c6-fm7sz      1/1    Running  0        1h
    spin-gate-76f789696d-vsn98         1/1    Running  0        1h
    spin-halyard-59fd54bd69-vb99h      1/1    Running  0        1h
    spin-kayenta-84f6b9b697-5krhh      1/1    Running  0        1m
    spin-orca-78f5c74c6f-srl4f         1/1    Running  0        1h
    spin-redis-6d49c9c5b9-gddgv        1/1    Running  0        1h
    spin-rosco-699cb484f7-grthh        1/1    Running  0        1h
    

자동 카나리아 분석 기능 구성

이제 Kayenta가 사용 설정되었으므로 sampleapp에 맞게 구성합니다.

  1. Spinnaker에서 Config(구성)를 클릭합니다.

  2. Features(기능) 섹션에서 Canary(카나리아)를 선택한 후 Save Changes(변경사항 저장)를 클릭합니다.

    파이프라인의 기능 스크린샷

카나리아 구성 만들기

Spinnaker에서 자동화된 카나리아 분석은 여러 측정항목에서 통계 테스트를 실행하고 점수를 출력합니다. 이 점수 범위는 0~100 사이이며, 기준과 카나리아 사이의 비교를 통과 또는 실패한 측정항목 수를 나타냅니다. 각 그룹에 대해 서로 다른 가중치를 사용해서 여러 그룹에 측정항목을 배치하면 점수가 달라질 수 있습니다. 분석 점수에 따라 배포를 진행할지 여부를 결정할 수 있습니다. 이 가이드에서와 같이 단일 측정항목을 사용할 경우 점수는 0(실패) 또는 100(통과)만 가능합니다.

하나의 앱은 여러 앱 간에 공유될 수 있는 여러 개의 카나리아 구성을 포함할 수 있습니다. 카나리아 구성에는 두 가지 기본 요소가 포함됩니다.

  • 분석할 측정항목 집합(여러 그룹에 존재할 수 있음)
  • 점수의 한계 및 통과 임계값

배포 파이프라인에서 카나리아 구성은 Canary Analysis(카나라이 분석) 단계 중에 사용됩니다. 이 단계에는 여러 개의 카나리아 실행이 포함될 수 있습니다. 실행 점수가 한계 임계값 미만인 경우, 해당 단계가 중지되고 다른 실행이 수행되지 않습니다. 마지막 실행 점수가 통과 임계값보다 높아야 전체 단계가 성공한 것으로 고려됩니다.

카나리아 구성을 만들려면 다음 단계를 수행하세요.

  1. 카나리아가 사용 설정되었으므로 Spinnaker를 다시 로드합니다. Pipelines(파이프라인) 섹션이 Delivery(제공)로 바뀝니다. Delivery(제공) 섹션에서 Canary Configs(카나리아 구성)로 이동합니다.

  2. Add Configuration(구성 추가)을 클릭합니다.

  3. Configuration Name(구성 이름)kayenta-test를 입력합니다.

  4. Filter Templates(필터 템플릿) 섹션에서 Add Template(템플릿 추가)을 클릭합니다.

  5. Add Template(템플릿 추가) 대화상자에 다음 값을 입력한 후 OK(확인)를 클릭합니다.

    • Name(이름): http_code
    • Template(템플릿): metric.labels.http_code = "500" AND resource.label.pod_name = starts_with("${scope}")

    scope 변수에는 Kayenta가 측정항목을 확인하는 GKE 배포의 이름으로 런타임에 채워집니다. 기준의 경우에는 sampleapp-baseline이고 카나리아의 경우에는 sampleapp-canary입니다.

  6. Metrics(측정항목) 섹션에서 Add Metric(측정항목 추가)을 클릭합니다.

  7. Add Metric(측정항목 추가) 대화상자에서 다음 값을 입력한 후 OK(확인)를 클릭합니다.

    • Name(이름): error_rate
    • Fail on(실패 기준): increase
    • Filter Template(필터 템플릿): http_code
    • Metric type(측정항목 유형): external.googleapis.com/prometheus/requests
  8. Scoring(점수) 섹션에서 다음 값을 선택합니다.

    • Marginal(한계): 75
    • Pass(통과): 95
    • Group 1(그룹 1): 100
  9. Save Changes(변경사항 저장)를 클릭합니다.

파이프라인에 카나리아 분석 단계 추가

이제 카나리아 구성이 준비되었으므로, 기존 배포 파이프라인을 수정해서 Manual Judgment(수동 판단) 단계를 이 구성을 사용하는 Canary Analysis(카나리아 분석) 단계로 바꿉니다.

  1. Delivery(제공) > Pipelines(파이프라인)로 이동하고 Canary Deploy(카나리아 배포) 파이프라인에 대해 Configure(구성)를 클릭합니다.

    카나리아 배포를 위한 구성 버튼 스크린샷

  2. Add Stage(단계 추가)를 클릭합니다.

  3. Type(유형)Canary Analysis(카나리아 분석)를 선택합니다.

  4. Depends On(종속 대상) 섹션에서 다음 선택 항목에 종속되도록 새 단계를 수정합니다.

    • Deploy Canary(카나리아 배포)
    • Deploy Baseline(기준 배포)
  5. Extended Params(확장 매개변수) 섹션에서 Add Field(필드 추가)를 클릭하고, 키가 perSeriesAligner이고 값이 ALIGN_RATE인 매개변수를 추가합니다.

  6. Canary Analysis Configuration(카나리아 분석 구성) 섹션에 다음 값을 채웁니다.

    매개변수 이름 정의
    Config Name(구성 이름) kayenta-test 앞에서 만든 카나리아 구성 이름입니다.
    Delay(지연) 0 분석을 수행하기 전 앱 가동을 위해 지정한 시간입니다.
    Interval(간격) 5 Kayenta가 단일 통계 분석을 실행하기 위해 사용해야 하는 시간 간격입니다.
    Baseline(기준) sampleapp-baseline Kayenta가 기준으로 사용해야 하는 GKE 배포입니다.
    Baseline Location(기준 위치) 기본값 기준이 존재하는 GKE 네임스페이스입니다.
    Canary(카나리아) sampleapp-canary Kayenta가 카나리아로 사용해야 하는 GKE 배포입니다.
    Canary Location(카나리아 위치) 기본값 카나리아가 존재하는 GKE 네임스페이스입니다.
    Lifetime(수명) 0시간 5분 카나리아 분석이 지속되어야 하는 시간입니다.
    Resource Type(리소스 유형) k8s_container 카나리아 분석을 실행할 대상 리소스 유형입니다. Stackdriver Debugger API를 쿼리하기 위해 사용됩니다.
    Metrics Account(측정항목 계정) kayenta-tutorial 측정항목을 쿼리하기 위해 Kayenta에서 사용되는 계정입니다. 여기에서는 Spinnaker에 {{stackdriver_name_short} 액세스 권한을 부여하기 위해 이전에 구성한 Google 계정입니다.
    저장소 계정 kayenta-minio 필요한 파일(예: 카나리아 보고서)을 저장하기 위해 Kayenta에서 사용되는 계정입니다.

  7. Execution Options(실행 옵션) 섹션에서 Ignore the failure(실패 무시)를 선택합니다. 카나리아 분석이 실패하더라도 기준 및 카나리아를 삭제할 수 있도록 실패를 무시합니다. 나중에 이 가이드에서 잠재적인 카나리아 실패를 고려하도록 단계를 수정합니다.

  8. 파이프라인 스키마에서 Deploy to Production(프로덕션에 배포)을 클릭합니다

    파이프라인에 대한 프로덕션에 배포 버튼 스크린샷

  9. Depends On(종속 대상) 섹션을 다음 매개변수로 변경합니다.

    1. Canary Analysis(카나리아 분석)를 추가합니다.
    2. Manual Judgment(수동 판단)를 삭제합니다.
  10. 카나리아 분석이 성공할 경우에만 프로덕션에 배포하려면 Conditional on Expression(표현식 조건) 매개변수를 변경합니다.

    ${ #stage('Canary Analysis')['status'].toString() == 'SUCCEEDED'}
    

  11. 파이프라인 스키마에서 Delete Canary(카나리아 삭제)를 클릭하고 Depends On(종속 대상) 섹션을 다음 매개변수로 변경합니다.

    1. Canary Analysis(카나리아 분석)를 추가합니다.
    2. Manual Judgment(수동 판단)를 삭제합니다.
  12. 파이프라인 스키마에서 Delete Baseline(기준 삭제)을 클릭하고 Depends On(종속 대상) 섹션을 변경합니다.

    1. Canary Analysis(카나리아 분석)를 추가합니다.
    2. Manual Judgment(수동 판단)를 삭제합니다.
  13. 카나리아 분석이 실패할 경우 전체 파이프라인이 실패하도록 하려면 파이프라인 스키마에서 Successful deployment(배포 성공)를 클릭한 후 기존 사전 조건에 대해 Edit(수정) 아이콘을 클릭합니다.

    성공적인 배포를 위한 기존 사전 조건 편집

    1. Expression(표현식)을 다음과 같이 변경합니다.

      ${ #stage('Canary Analysis')['status'].toString() == 'SUCCEEDED'}
      

    2. Update(업데이트)를 클릭합니다

  14. Manual Judgement(수동 판단) 단계를 새로 생성된 Canary Analysis(카나리아 분석) 단계로 바꾸는 과정을 마무리합니다.

    1. 파이프라인 스키마에서 Manual Judgment(수동 판단)를 클릭합니다.
    2. Remove stage(단계 삭제)를 클릭합니다.
  15. Save Changes(변경사항 저장)를 클릭합니다. 이제 파이프라인이 다음 이미지와 비슷하게 표시됩니다. 카나리아 분석 파이프라인 시각화

새 파이프라인 테스트

이제 자동화된 카나리아 분석이 구성되었으므로, 파이프라인을 테스트하여 예상한 대로 작동하는지 확인합니다.

  1. Delivery(제공) > Pipelines(파이프라인)로 이동하고 Canary Deploy(카나리아 배포) 파이프라인에 대해 또는 CLI를 사용한 경우 Automated Canary Deploy(자동화된 카나리아 배포)에 대해 Start Manual Execution(수동 실행 시작)을 클릭합니다.

  2. Success Rate(성공률)60을 선택한 후 Run(실행)을 클릭합니다.

  3. 카나리아 분석의 현재 진행 상태를 확인하려면 Canary Analysis(카나리아 분석)를 클릭한 후 Task Status(작업 상태)를 클릭합니다. 몇 분이 지나면 프로덕션에서 현재 성공률이 80이기 때문에 Canary Analysis(카나리아 분석) 단계가 실패합니다. Canary Analysis(카나리아 분석) 단계가 실패하면 이 카나리아 분석에 대한 보고서로 이동합니다.

    1. Canary Analysis(카나리아 분석)를 클릭합니다.
    2. Canary Summary(카나리아 요약)를 클릭합니다.
    3. Report(보고서) 아이콘을 클릭합니다. 보고서 페이지에서 카나리아 버전의 오류율이 기준 버전의 오류율보다 높게 표시됩니다.

      카나리아 분석 요약의 보고 아이콘

  4. 이 섹션의 단계를 반복하지만 성공적인 카나리아 분석을 위해 Success Rate(성공률)90을 선택합니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  1. GCP 콘솔에서 프로젝트 페이지로 이동합니다.

    프로젝트 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 프로젝트 삭제를 클릭합니다. 프로젝트 이름 옆의 체크박스를 선택한 다음 프로젝트 삭제 클릭
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

리소스 삭제

이 가이드에서 사용한 GCP 프로젝트를 보존하려는 경우 개별 리소스를 삭제합니다.

  1. Spinnaker를 삭제합니다.

    kubectl delete -f https://spinnaker.io/downloads/kubernetes/quick-install.yml
    

  2. GKE 클러스터를 삭제합니다.

    gcloud container clusters delete kayenta-tutorial
    

  3. 확인 프롬프트가 표시되면 Y를 입력합니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...