대상에 애플리케이션 카나리아 배포

이 빠른 시작에서는 Cloud Deploy를 사용하여 카나리아 배포의 샘플 애플리케이션 이미지를 Google Kubernetes Engine 또는 Cloud Run에 제공하는 방법을 보여줍니다. GKE Enterprise로 카나리아 배포를 실행할 수도 있지만 GKE 및 Cloud Run만 이 빠른 시작에 표시됩니다.

카나리아 배포는 이미 배포된 애플리케이션 버전과 새 버전 간에 트래픽을 분할합니다. Cloud Run은 배포 파이프라인에서 구성한 비율을 기준으로 트래픽을 분배합니다. GKE가 새 버전을 일정한 비율의 포드에 배포합니다. 이 빠른 시작에서는 먼저 50%로 배포한 다음 100%로 배포합니다.

이 빠른 시작에서는 대상(prod)이 하나만 있습니다. 따라서 애플리케이션을 실행하기 위해 GKE 클러스터 또는 Cloud Run 서비스를 하나만 만듭니다.

이 빠른 시작에서 다루는 작업은 다음과 같습니다.

  1. 하나의 GKE 클러스터를 만들거나 하나의 Cloud Run 서비스를 정의합니다.

    카나리아 배포를 GKE Enterprise 클러스터에 배포할 수 있지만 이 빠른 시작에서는 GKE 및 Cloud Run만 사용합니다.

  2. Skaffold 구성 및 Kubernetes 매니페스트를 만들어 배포할(사전 빌드된) 컨테이너 이미지를 지정합니다.

  3. Cloud Deploy 배포 파이프라인 및 배포 대상을 정의합니다.

  4. 하나의 타겟에 자동으로 배포되는 출시 버전을 만들어 배포 파이프라인을 호출합니다.

    이 첫 번째 출시 버전은 카나리아 단계를 건너뜁니다.

  5. Google Cloud 콘솔에서 배포 파이프라인과 출시 버전을 확인합니다.

  6. 이번에는 카나리아 단계를 실행하여 애플리케이션을 50%로 배포하는 두 번째 출시 버전을 만듭니다.

  7. 100% 배포를 위해 출시 버전을 진행합니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. CLI가 이미 설치되어 있으면 최신 버전으로 실행 중인지 확인합니다.

    gcloud components update
    

  13. 기본 Compute Engine 서비스 계정에 충분한 권한이 있는지 확인합니다.

    서비스 계정에 이미 필요한 권한이 있을 수 있습니다. 기본 서비스 계정의 자동 역할 부여를 중지한 프로젝트를 위해 포함된 단계입니다.

    1. 먼저 clouddeploy.jobRunner 역할을 추가합니다.

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.jobRunner"
      

    2. 특정 런타임의 개발자 역할을 추가합니다.
      • GKE 및 Gateway API를 사용하는 GKE의 경우:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/container.developer"
        

      • Cloud Run의 경우:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/run.developer"
        

    3. 런타임에 배포할 수 있는 actAs 권한이 포함된 iam.serviceAccountUser 역할을 추가합니다.

      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

런타임 환경 만들기

GKE

하나의 GKE Autopilot 클러스터를 만듭니다.

 gcloud container clusters create-auto canary-quickstart-cluster \
                  --project=PROJECT_ID \
                  --region=us-central1

GKE + Gateway API

  1. Istio 사용을 지원하는 권장 설정이 있는 하나의 GKE 클러스터를 만듭니다.

    gcloud container clusters create canary-quickstart-cluster \
           --machine-type=n1-standard-1 \
           --num-nodes 4 \
           --region=us-central1 \
           --project=PROJECT_ID
    
  2. 클러스터 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials canary-quickstart-cluster \
           --project=PROJECT_ID \
           --region=us-central1
    
  3. 클러스터에 아직 없는 경우 Kubernetes Gateway API CRD를 설치합니다.

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
    
  4. Istio를 설치하여 Istio의 게이트웨이 컨트롤러 구현을 사용 설정합니다.

    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \
    && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
    

Cloud Run

Cloud Run을 사용하는 경우 이 명령어를 건너뛰어도 되므로 아무 작업도 수행할 필요가 없습니다.

Skaffold 구성 및 애플리케이션 매니페스트 준비

Cloud Deploy는 Skaffold를 사용하여 배포할 항목의 세부정보와 대상에 적절하게 배포하는 방법을 제공합니다.

이 빠른 시작에서는 배포할 Kubernetes 매니페스트 또는 Cloud Run 서비스 구성을 식별하는 skaffold.yaml 파일을 만듭니다.

  1. 터미널 창을 엽니다.

  2. 새 디렉터리를 만들어 해당 디렉터리로 이동합니다.

    GKE

    mkdir deploy-canary-quickstart-gke
    cd deploy-canary-quickstart-gke
    

    GKE + Gateway API

    mkdir deploy-canary-quickstart-gke-gatewayapi
    cd deploy-canary-quickstart-gke-gatewayapi
    

    Cloud Run

    mkdir deploy-canary-quickstart-run
    cd deploy-canary-quickstart-run
    
  3. 다음 콘텐츠로 skaffold.yaml라는 파일을 만듭니다.

    GKE

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - kubernetes.yaml
    deploy:
      kubectl: {}
    

    GKE + Gateway API

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - kubernetes.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - run.yaml
    deploy:
      cloudrun: {}
    

    이 파일은 매니페스트를 식별하는 최소한의 Skaffold 구성입니다. 이 빠른 시작에서는 해당 파일을 만듭니다. 하지만 간단한 비프로덕션 애플리케이션의 경우 Cloud Deploy에서 자동으로 생성되도록 할 수도 있습니다.

    이 파일에 대한 자세한 내용은 skaffold.yaml 참조를 확인하세요.

  4. 애플리케이션 매니페스트를 만듭니다.

    GKE

    다음 콘텐츠로 deploy-canary-quickstart-gke 디렉터리에 kubernetes.yaml이라는 파일을 만듭니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      namespace: default
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
    

    이 파일은 애플리케이션을 배포하기 위해 클러스터에 적용되는 Kubernetes 매니페스트입니다. 이 매니페스트에는 카나리아 배포에 필요한 서비스 및 배포 리소스와 Gateway API를 사용하는 데 필요한 HTTPRoute 및 게이트웨이 리소스가 포함됩니다.

    배포할 컨테이너 이미지는 여기에서 자리표시자 my-app-image로 설정되며, 버전을 만들 때 특정 이미지로 대체됩니다.

    GKE + Gateway API

    다음 콘텐츠로 deploy-canary-quickstart-gke-gatewayapi 디렉터리에 kubernetes.yaml이라는 파일을 만듭니다.

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: my-gateway
      annotations:
        networking.istio.io/service-type: "ClusterIP"
    spec:
      gatewayClassName: istio
      listeners:
      - name: default
        hostname: "*.example.com"
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: All
    ---
    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: my-httproute
    spec:
      parentRefs:
      - kind: Gateway
        name: my-gateway
      hostnames:
      - "test.example.com"
      rules:
      - backendRefs:
        - name: my-service
          port: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
      - name: tcp-port
        protocol: TCP
        port: 80
        targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    

    이 파일은 애플리케이션을 배포하기 위해 클러스터에 적용되는 Kubernetes 매니페스트입니다. 이 매니페스트에는 카나리아 배포에 필요한 서비스 및 배포 리소스와 Gateway API를 사용하는 데 필요한 HTTPRoute 및 게이트웨이 리소스가 포함됩니다.

    배포할 컨테이너 이미지는 여기에서 자리표시자 my-app-image로 설정되며, 버전을 만들 때 특정 이미지로 대체됩니다.

    Cloud Run

    다음 콘텐츠로 deploy-canary-quickstart-run 디렉터리에 run.yaml이라는 파일을 만듭니다.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: my-canary-run-service
    spec:
      template:
        spec:
          containers:
          - image: my-app-image
    

    이 파일은 Cloud Run에서 서비스를 만들기 위해 배포 시 적용되는 기본 Cloud Run 서비스 정의입니다. 배포할 컨테이너 이미지는 여기에서 자리표시자 my-app-image로 설정되며, 버전을 만들 때 특정 이미지로 대체됩니다.

배포 파이프라인 및 대상 만들기

배포 파이프라인 및 대상을 파일 하나 또는 별도의 파일로 정의할 수 있습니다. 이 빠른 시작에서는 파이프라인과 단일 대상에 대해 하나의 파일을 만듭니다.

GKE

다음 콘텐츠로 deploy-canary-quickstart-gke 디렉터리에 clouddeploy.yaml이라는 파일을 만듭니다.

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "my-service"
              deployment: "my-deployment"
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod GKE cluster
gke:
 cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster

GKE + Gateway API

다음 콘텐츠로 deploy-canary-quickstart-gke-gatewayapi 디렉터리에 clouddeploy.yaml이라는 파일을 만듭니다.

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            gatewayServiceMesh:
              httpRoute: "my-httproute"
              service: "my-service"
              deployment: "my-deployment"
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod GKE cluster
gke:
 cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster

Cloud Run

다음 콘텐츠로 deploy-canary-quickstart-run 디렉터리에 clouddeploy.yaml이라는 파일을 만듭니다.

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod Run Service
run:
  location: projects/PROJECT_ID/locations/us-central1
  1. Cloud Deploy 서비스에 파이프라인 및 대상을 등록합니다.

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    이제 카나리아 배포 전략을 위해 구성된 대상 하나가 있는 파이프라인이 있습니다.

  2. 파이프라인 및 대상을 확인합니다.

    Google Cloud 콘솔에서 Cloud Deploy 배포 파이프라인 페이지로 이동하여 사용 가능한 배포 파이프라인 목록을 확인합니다.

    배포 파이프라인 페이지 열기

    방금 만든 배포 파이프라인이 표시되고 구성한 하나의 대상이 대상 열에 나열됩니다.

    Google Cloud 콘솔의 배포 파이프라인 시각화

출시 버전 만들기

출시 버전은 배포되는 변경사항을 나타내는 중앙 Cloud Deploy 리소스입니다. 배포 파이프라인은 해당 출시의 수명 주기를 정의합니다. 수명 주기에 대한 자세한 내용은 Cloud Deploy 서비스 아키텍처를 참조하세요.

배포할 컨테이너 이미지를 나타내는 release 리소스를 만들려면 deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi 또는 deploy-canary-quickstart-run 디렉터리에서 다음 명령어를 실행합니다.

GKE

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

GKE + Gateway API

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

Cloud Run

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4

매니페스트 또는 서비스 정의의 자리표시자 (my-app-image)를 특정 SHA-규정 이미지로 대체하는 데 사용하는 --images= 플래그에 주의하세요. 이 방법으로 매니페스트를 템플릿화하고 출시 생성 시 SHA로 한정된 이미지 이름을 사용하는 것이 좋습니다.

출시 버전을 만들면 Cloud Deploy는 출시 리소스 또한 자동으로 만들어 하나의 대상 prod에 즉시 배포합니다.

안정 단계로 건너뛰기

이 첫 번째 출시 버전에서는 카나리아 단계를 건너뛰고 100%(안정 단계)로 배포합니다. 이는 애플리케이션이 이전에 배포되지 않았으므로 포드의 50%(GKE용) 또는 서비스(Cloud Run용)의 트래픽 분할 방법을 계산할 방법이 없기 때문입니다. 포드(GKE) 또는 버전(Cloud Run)이 아직 없습니다.

카나리아 단계를 건너뛰었으므로 이제 트래픽을 100%로 가져오는 안정 단계를 시작할 준비가 되었습니다. 그 후 다른 출시 버전을 만들고 카나리아를 실행할 것입니다.

애플리케이션이 이미 실행 중인 실제 상황에서는 일반적으로 카나리아 배포를 실행하므로 이 단계를 건너뛰는 것은 드물게 수행됩니다.

Google Cloud 콘솔에서 결과 보기

이제 첫 번째 출시 버전을 만들어 출시가 생성되었으므로 Google Cloud 콘솔에서 출시 버전 및 출시를 볼 수 있습니다. 또한 출시 버전의 현재 상태를 보여주는 파이프라인 시각화를 볼 수 있습니다.

  1. Google Cloud 콘솔에서 Cloud Deploy 배포 파이프라인 페이지로 이동하여 my-canary-demo-app-1 배포 파이프라인을 확인합니다.

    배포 파이프라인 페이지 열기

  2. 배포 파이프라인 이름 'my-canary-demo-app-1'을 클릭합니다.

    파이프라인 시각화에 앱의 배포 상태가 표시됩니다. 파이프라인에는 단계가 하나뿐이므로 시각화에 노드가 하나만 표시됩니다.

    Google Cloud 콘솔의 배포 파이프라인 시각화

    출시 버전은 배포 파이프라인 세부정보출시 탭에 표시됩니다.

  3. 출시 이름 test-release-001를 클릭합니다.

    출시 아래에 출시가 표시됩니다. 출시를 클릭하여 배포 로그를 비롯한 세부정보를 볼 수 있습니다.

    Google Cloud 콘솔의 출시

    출시 상태는 '진행 대기 중'이고 파이프라인 시각화에 표시된 대상에는 '안정 단계로 진행' 링크가 있습니다.

출시 단계로 진행

첫 번째 출시 후에는 카나리아 단계를 건너뛰고 100%로 애플리케이션을 배포하는 '안정' 단계 출시가 시작됩니다.

  1. 파이프라인 시각화에서 안정 단계로 진행을 클릭합니다.

  2. 메시지가 표시되면 진행을 클릭하여 확인합니다.

몇 분 후 출시가 '안정' 상태가 되고 애플리케이션이 100%로 배포됩니다.

안정 단계의 배포 파이프라인

카나리아 배포 실행

첫 번째 출시 버전에서 카나리아 단계를 건너뛰었으므로 이 출시에서는 카나리아 배포를 실행하는 다른 출시 버전을 생성합니다.

  1. release를 만들려면 deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi 또는 deploy-canary-quickstart-run 디렉터리에서 다음 명령어를 실행합니다.

    GKE

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    GKE + Gateway API

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    Cloud Run

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
    

    몇 분 후 출시가 생성되고 카나리아 단계가 실행됩니다.

    카나리아 단계를 시작하는 배포 파이프라인

    첫 번째 출시 단계가 완료되면 이제 출시가 카나리아 단계에 있습니다.

    Google Cloud 콘솔의 배포 파이프라인 시각화, 50%로 애플리케이션 배포

    즉, 애플리케이션이 이제 50%로 배포됩니다. serviceNetworking 기반 GKE의 경우 포드의 절반에 배포됩니다. Gateway API 기반 GKE 및 Cloud Run 트래픽의 경우 50%로 할당됩니다.

  2. 출시 진행을 클릭한 후 메시지가 표시되면 진행을 클릭합니다.

    이렇게 하면 출시가 '안정' 단계로 진행되어 애플리케이션이 100%로 배포됩니다.

    안정 단계의 배포 파이프라인, 100%로 배포

삭제

이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 수행합니다.

  1. canary-quickstart-cluster 클러스터를 삭제합니다(GKE만 해당).

    gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
    
  2. my-canary-run-service 서비스를 삭제합니다(Cloud Run만 해당).

    gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID
    
  3. 배포 파이프라인, 대상, 모든 출시 및 출시 리소스를 삭제합니다.

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  4. Cloud Deploy에서 만든 Cloud Storage 버킷을 삭제합니다.

    하나는 _clouddeploy로 끝나고 다른 하나는 [region].deploy-artifacts.[project].appspot.com입니다.

    Cloud Storage 브라우저 페이지 열기

빠른 시작을 완료하셨습니다.

다음 단계