Gateway API 네트워킹을 사용하여 GKE 및 GKE Enterprise에 카나리아 배포

이 문서에서는 카나리아 배포를 구성하고 사용하여 Kubernetes Gateway API 서비스 메시와 함께 Cloud Deploy를 사용하여 GKE 또는 GKE Enterprise에 애플리케이션을 배포하는 방법을 설명합니다.

카나리아 배포는 애플리케이션의 새 버전을 점진적으로 출시하는 배포 방식입니다. 애플리케이션의 성능을 모니터링하면서 새 버전으로 전송되는 트래픽의 비율을 점진적으로 늘립니다. 이렇게 하면 잠재적인 문제를 조기에 파악하고 사용자에게 미치는 영향을 최소화할 수 있습니다.

Gateway API를 사용하는 GKE 및 GKE Enterprise의 카나리아 배포 작동 방식

  1. 배포 및 서비스 참조 외에도 HTTPRoute 리소스에 서비스를 참조하는 backendRefs 규칙을 제공합니다.

  2. Cloud Deploy는 원래 배포 이름에 -canary가 추가된 새 배포와 원래 서비스 이름에 -canary가 추가된 새 서비스를 만듭니다.

    보안 비밀, ConfigMap, 수평형 포드 자동 확장 처리도 -canary를 사용하여 복사되고 이름이 변경됩니다.

  3. 각 카나리아 단계에서 Cloud Deploy는 해당 단계의 백분율에 따라 원래 배포의 포드와 카나리아 배포의 포드 간의 가중치를 업데이트하도록 HTTPRoute를 수정합니다.

    HTTPRoute 리소스 변경사항 전파가 지연될 수 있으므로 구성에 routeUpdateWaitTime 속성을 포함합니다. 그러면 시스템에서 전파를 위해 지정된 시간을 기다립니다.

  4. stable 단계 중에는 -canary 배포가 0으로 축소되고 원래 배포가 새 릴리스 배포를 사용하도록 업데이트됩니다.

    또한 HTTPRoute가 원래 사용자가 제공한 값으로 돌아갑니다.

    Cloud Deploy는 stable 단계까지 원래 배포 또는 서비스를 수정하지 않습니다.

Cloud Deploy를 사용하면 단일 스테이지 또는 여러 스테이지에서 GKE 및 GKE Enterprise에 카나리아 배포를 구성할 수 있습니다.

이 안내에는 카나리아 구성과 관련된 내용만 포함됩니다. Google Kubernetes Engine 클러스터에 배포 문서에는 배포 파이프라인 구성 및 실행에 대한 일반 안내가 포함되어 있습니다.

필수 권한 필요

Cloud Deploy를 사용하는 데 필요한 다른 Identity and Access Management 권한 외에도 카나리아 배포에 필요할 수 있는 추가 작업을 수행하기 위해 다음 권한이 필요합니다.

  • clouddeploy.rollouts.advance
  • clouddeploy.rollouts.ignoreJob
  • clouddeploy.rollouts.cancel
  • clouddeploy.rollouts.retryJob
  • clouddeploy.jobRuns.get
  • clouddeploy.jobRuns.list
  • clouddeploy.jobRuns.terminate

이러한 권한이 포함된 사용 가능한 역할에 대한 자세한 내용은 IAM 역할 및 권한을 참조하세요.

skaffold.yaml 준비

skaffold.yaml 파일은 Kubernetes 매니페스트가 렌더링되고 배포되는 방식을 정의합니다. GKE/GKE Enterprise에 대한 카나리아 배포의 경우 매니페스트를 올바르게 가리키고 필요한 빌드 아티팩트를 정의해야 합니다. skaffold.yaml 자체에는 표준 배포에 필요한 항목 이외의 특별한 카나리아 관련 구성이 필요하지 않습니다. Skaffold 프로필을 사용하여 커스텀 카나리아 단계의 다양한 매니페스트 변형을 관리할 수 있습니다.

Kubernetes 매니페스트 준비

Kubernetes 매니페스트에는 Deployment 리소스와 Service 리소스가 모두 포함되어야 합니다. ServiceDeployment에서 관리하는 포드의 라벨과 일치하는 selector를 정의해야 합니다. Cloud Deploy가 찾는 기본 라벨은 app이지만 파이프라인에서 구성할 수 있습니다.

DeploymentService 외에도 매니페스트에는 트래픽 분할을 위해 구성되고 Service 및 연결된 게이트웨이를 참조하는 HTTPRoute 리소스가 포함되어야 합니다.

자동화된 카나리아 구성

Kubernetes Gateway API (Istio 또는 지원되는 구현 사용)를 사용하여 메시/게이트웨이에서 관리하고 Cloud Deploy에서 오케스트레이션하는 정확한 비율 기반 트래픽 분할을 수행합니다.

  1. Gateway API 리소스 설정: 게이트웨이와 기본 서비스 메시 (예: Istio) 또는 게이트웨이 컨트롤러가 클러스터에 올바르게 구성되어 있는지 확인합니다.

  2. 출시 버전을 만들 때 Cloud Deploy에 제공되는 Kubernetes 매니페스트에는 다음이 포함됩니다.

    • 게이트웨이 리소스를 참조하는 HTTPRoute입니다.

    • 배포

    • 서비스

  3. 배포 파이프라인과 카나리아 배포를 수행할 대상을 구성합니다.

    • 대상 구성은 모든 대상에서 동일합니다.

    • 특정 대상에 대한 진행 시퀀스의 배포 파이프라인 구성에는 Kubernetes Gateway API HTTPRoute 구성, 배포, 서비스를 참조하는 gatewayServiceMesh 스탠자가 포함되어 있습니다.

      strategy:
       canary:
         runtimeConfig:
           kubernetes:
             gatewayServiceMesh:
               httpRoute: "ROUTE"
               service: "SERVICE"
               deployment: "DEPLOYMENT"
               routeUpdateWaitTime: "WAIT_TIME"
               podSelectorLabel: "LABEL"
         canaryDeployment:
           percentages:
           - 50
      

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

      • ROUTE는 원하는 라우팅 동작을 정의하는 httpRoute 구성입니다.

      • SERVICE는 GKE 및 GKE Enterprise에 대한 카나리아 배포를 위해 Cloud Deploy에 필요한 서비스 구성입니다.

      • DEPLOYMENT는 GKE 및 GKE Enterprise에 대한 카나리아 배포를 위해 Cloud Deploy에 필요한 배포 구성입니다.

      • WAIT_TIME은 삭제된 요청이 없도록 HTTPRoute 리소스 변경사항이 전파를 완료할 때까지 Cloud Deploy에서 대기하는 시간입니다. 예를 들면 routeUpdateWaitTime: 60s입니다.

        Istio 없이 Gateway API를 사용해서 카나리아를 실행하는 중이고 Gateway API가 Google Cloud 부하 분산기에 연결되어 있으면 카나리아 인스턴스를 축소할 때 소량의 트래픽이 손실될 수 있습니다. 이 동작이 관찰되면 이 설정을 구성할 수 있습니다.

      • LABEL은 포드 선택기 라벨입니다. 이 값은 매니페스트에 정의된 Kubernetes 서비스 및 배포의 라벨 선택기와 일치해야 합니다. 이는 선택사항입니다. 기본값은 app입니다.

커스텀 자동 카나리아 구성

이렇게 하면 맞춤 단계 정의 (이름, 비율, 프로필, 확인, 후크)가 GKE 또는 GKE Enterprise용 Cloud Deploy의 자동 트래픽 관리와 결합됩니다. 단계를 정의하면 Cloud Deploy에서 백분율과 선택한 runtimeConfig에 따라 기본 리소스 조작을 처리합니다.

이를 구성하려면 strategy.canary 블록 내에 serviceNetworking이 포함된 runtimeConfig 섹션과 customCanaryDeployment 섹션 (phaseConfigs 정의)을 모두 포함하세요. Cloud Deploy는 지정된 Skaffold 프로필을 렌더링에 사용하지만 runtimeConfig 및 단계 비율에 따라 트래픽을 자동으로 조정합니다.

serialPipeline:
  stages:
  - targetId: gke-prod
    profiles: []
    strategy:
      canary:
        # Include runtimeConfig for automatic traffic management
        runtimeConfig:
          kubernetes:
            gatewayServiceMesh:
              httpRoute: "my-route"
              service: "my-app"
              deployment: "my-deployment"  
        # Include customCanaryDeployment for phase customization
        customCanaryDeployment:
          phaseConfigs:
          - phaseId: "warmup"
            percentage: 10
            profiles: ["profile-a"] # Profile used for rendering this phase
            verify: true
          - phaseId: "scaling"
            percentage: 50
            profiles: ["profile-b"] # Different profile for this phase
            verify: true
          - phaseId: "stable"
            percentage: 100
            profiles: ["profile-b"] # Can reuse profiles
            verify: true

다른 클러스터에 HTTPRoute 배포

Gateway API 서비스 메시를 사용하여 카나리아를 구성한 경우 HTTPRoute를 배포할 대체 비타겟 클러스터를 지정할 수 있습니다.

이렇게 하려면 카나리아 전략 구성에서 routeDestinations 스탠자를 사용하여 HTTPRoute의 대상 클러스터를 식별하고, 불리언 설정을 사용하여 서비스를 동일한 비타겟 클러스터에 전파합니다. 타겟 구성에서 클러스터를 식별하는 associatedEntities 스탠자를 만듭니다.

  1. 타겟에서 associatedEntities를 구성합니다.

    각 항목은 Cloud Deploy가 HTTPRoute와 선택적으로 Kubernetes 서비스를 배포하는 클러스터입니다. 타겟 정의에 associatedEntities 스탠자를 포함합니다.

    associatedEntities:
      [KEY]:
        gkeClusters:
        - cluster: [PATH]
          dnsEndpoint: [true|false]
          internalIp: [true|false]
          proxyUrl:
    

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

    • KEY은 연결된 이 그룹의 임의 이름입니다. 이 이름을 사용하여 카나리아 구성의 routeDestinations에서 엔티티를 참조합니다.

    • PATH은 HTTPRoute (선택적으로 서비스)가 배포될 GKE 클러스터를 식별하는 리소스 경로입니다.

    • dnsEndpoint는 여러 엔드포인트가 구성된 경우 클러스터의 DNS 엔드포인트를 사용할지 여부를 나타냅니다. 기본값은 false입니다.

    • internalIp는 여러 엔드포인트가 구성된 경우 클러스터의 내부 IP(비공개 IP)를 사용할지 여부를 나타냅니다. 기본값은 false입니다.

    internalIp가 있거나 없는 클러스터를 원하는 만큼 포함할 수 있습니다.

  2. 카나리아 구성에서 routeDestinations을 구성합니다.

    각 경로 대상은 associatedEntities 스탠자를 참조하고 서비스를 대체 클러스터에도 배포할지 여부를 나타냅니다. 카나리아 구성의 gatewayServiceMesh 스탠자 내부에 다음을 추가합니다.

    routeDestinations:
      destinationIds: ["KEY"]
      propagateService: [true|false]
    

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

    • KEYassociatedEntities의 타겟에 구성한 이름입니다. 이 이름을 사용하여 카나리아 구성의 routeDestinations에서 엔티티를 참조합니다.

      연결된 대상 외에도 대상 클러스터에 HTTPRoute를 배포하기 위해 @self 값을 제공할 수도 있습니다.

    • propagateService는 HTTPRoute 외에 연결된 클러스터에 서비스를 배포할지 여부를 나타냅니다. 기본값은 false입니다.

GKE 또는 GKE Enterprise 카나리아 실행

  1. 파이프라인 및 타겟 등록: 배포 파이프라인과 GKE 또는 GKE Enterprise 타겟 구성 파일을 적용합니다.

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=gke-targets.yaml --region=REGION
    

    배포 파이프라인에는 선택한 런타임에 자동 또는 커스텀 카나리아 구성이 포함됩니다.

  2. 버전 만들기: 이미지 이름을 제공하여 배포를 시작합니다.

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
      # e.g., --images=my-cloudrun-service=gcr.io/my-project/my-app:v1.1
      # Add --skaffold-file or --source if not using default Skaffold config discovery
    

    PIPELINE_NAME으로 식별된 배포 파이프라인에는 이 문서에 설명된 자동 또는 커스텀 카나리아 구성이 포함되어 있습니다.

  3. 카나리아를 진행합니다.

    gcloud CLI

    gcloud deploy rollouts advance ROLLOUT_NAME \
                                --release=RELEASE_NAME \
                                --delivery-pipeline=PIPELINE_NAME \
                                --region=REGION
    

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

    ROLLOUT_NAME은 다음 단계로 진행하려는 현재 출시의 이름입니다.

    RELEASE_NAME은 이 출시가 속한 출시 버전의 이름입니다.

    PIPELINE_NAME은 이 출시 버전의 배포를 관리하는 데 사용하는 배포 파이프라인의 이름입니다.

    REGION은 출시 버전이 생성된 리전의 이름입니다(예: us-central1). 필수 항목입니다.

    gcloud deploy rollouts advance 명령어에 대한 자세한 내용은 Google Cloud SDK 참조를 확인하세요.

    Google Cloud 콘솔

    1. 배포 파이프라인 페이지를 엽니다.

    2. 배포 파이프라인 목록에 표시된 파이프라인을 클릭합니다.

      배포 파이프라인 세부정보 페이지에는 배포 파이프라인의 진행 상태가 그래픽으로 표시됩니다.

    3. 출시 탭의 배포 파이프라인 세부정보에서 출시 이름을 클릭합니다.

      해당 출시의 출시 세부정보 페이지가 표시됩니다.

       Google Cloud 콘솔의 출시 세부정보

      이 예시에서는 출시에 canary-50 단계와 stable 단계가 있습니다. 출시에 더 많은 단계나 다른 단계가 있을 수 있습니다.

    4. 출시 진행을 클릭합니다.

      출시가 다음 단계로 진행됩니다.

건너뛴 단계

카나리아를 배포할 때 애플리케이션이 이 런타임에 아직 배포되지 않았으면 Cloud Deploy가 카나리아 단계를 건너뛰고 안정 단계를 실행합니다. 왜 이렇게 되는지 확인하려면 처음으로 단계 건너뛰기를 참조하세요.

다음 단계