Cloud Deploy에서 출시 프로모션 및 출시 진행 자동화

이 페이지에서는 Cloud Deploy를 사용해서 대상에 대해 출시를 자동으로 프로모션하고 다음 단계로 출시를 진행하는 방법을 보여줍니다.

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

  1. GKE 클러스터 2개 또는 Cloud Run 서비스 2개를 만듭니다.

  2. Skaffold 구성과 Kubernetes 매니페스트 또는 Cloud Run 서비스 정의를 만듭니다.

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

    이 파이프라인은 devstaging에 해당하는 2개 대상에 배포됩니다. 그리고 staging 대상에는 카나리아 배포 전략이 사용됩니다.

  4. 다음 두 가지 자동화 규칙을 정의합니다.

    • dev 출시가 성공하면 staging 대상에 출시를 프로모션하는 자동화.

    • canary-25` 단계가 성공적으로 완료되면 stable 단계로 출시를 진행하는 자동화.

  5. dev 대상에 자동으로 배포되는 출시를 만들어 배포 파이프라인을 인스턴스화합니다.

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

    자동 프로모션으로 인해 이 출시가 staging으로 자동 승격됩니다.

    staging 대상에 카나리아 배포 전략이 사용되고 이것이 해당 런타임에 대한 첫 번째 배포이기 때문에 canary-25 단계를 건너뜁니다. 카나리아 단계를 처음 건너뛰는 이유에 대한 자세한 내용은 단계를 건너뛰는 이유를 참조하세요.

    자동화된 단계 진행으로 인해 출시가 stable 단계로 진행됩니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    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. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. API Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    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. clouddeploy.releaser 역할을 추가합니다.
      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.releaser"
      
    3. 특정 런타임의 개발자 역할을 추가합니다.
      • 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"
        
    4. 런타임에 배포할 기본 서비스 계정에 대해 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
      
    5. 기본 서비스 계정을 사용하기 위해 자신에 대한 actAs 권한을 포함하여 iam.serviceAccountUser 역할을 추가합니다.
      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=user:YOUR_EMAIL_ADDRESS \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

      여기에서 YOUR_EMAIL_ADDRESS는 Google Cloud에 액세스하는 데 사용되는 이메일 주소입니다.

런타임 환경 만들기

Cloud Run에 배포하는 경우 이 명령어를 건너뛸 수 있습니다.

GKE의 경우 기본 설정으로 automation-quickstart-cluster-devautomation-quickstart-cluster-staging라는 클러스터 두 개를 만듭니다. 클러스터의 Kubernetes API 엔드포인트는 공개 인터넷에서 네트워크에 연결할 수 있어야 합니다. GKE 클러스터는 기본적으로 외부에서 액세스할 수 있습니다.

gcloud container clusters create-auto automation-quickstart-cluster-dev \
                 --project=PROJECT_ID \
                 --region=us-central1 \
                 && gcloud container clusters create-auto automation-quickstart-cluster-staging \
                 --project=PROJECT_ID \
                 --region=us-central1

프로젝트 번호를 가져옵니다.

기본 서비스 계정을 식별하려면 프로젝트 번호가 필요합니다. 이 작업은 자동화 리소스를 구성하는 데 필요합니다.

  1. 다음 명령어를 실행하여 프로젝트 번호를 가져옵니다.

    gcloud projects describe PROJECT_ID
    
  2. 명령줄 출력에서 프로젝트 번호를 복사하여 여기에 붙여넣습니다.

    이를 명령어로 실행할 필요가 없습니다. 여기에 붙여넣으면 이 빠른 시작의 뒷부분에 있는 자동화 구성의 서비스 계정 참조가 채워집니다.

    PROJECT_NUMBER
    

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

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

이 빠른 시작에서는 샘플 앱을 배포하는 데 사용할 애플리케이션 매니페스트를 식별하는 skaffold.yaml 파일을 만듭니다.

  1. 터미널 창을 엽니다.

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

    GKE

    mkdir deploy-automation-gke-quickstart
    cd deploy-automation-gke-quickstart
    

    Cloud Run

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

    GKE

    apiVersion: skaffold/v4beta7
    kind: Config
    metadata:
      name: gke-automation
    manifests:
      rawYaml:
      - k8s-deployment.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta7
    kind: Config
    metadata:
      name: run-automation
    profiles:
    - name: dev
      manifests:
        rawYaml:
        - run-dev.yaml
    - name: staging
      manifests:
        rawYaml:
        - run-staging.yaml
    deploy:
      cloudrun: {}
    

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

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

  4. Cloud Run에 대한 서비스 정의 집합 쌍이거나 GKE에 대한 Kubernetes 매니페스트일 수 있는 애플리케이션에 대한 정의를 만듭니다.

    GKE

    다음 콘텐츠로 k8s-deployment.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 매니페스트입니다.

    Cloud Run

    1. 다음 콘텐츠로 run-dev.yaml이라는 파일을 만듭니다.

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: my-automation-run-service-dev
      spec:
        template:
          spec:
            containers:
            - image: my-app-image
      
    2. 다음 콘텐츠로 run-staging.yaml이라는 파일을 만듭니다.

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

    이 파일은 배포 시 Cloud Run 서비스를 만드는 데 사용되는 단순 Cloud Run 서비스 정의입니다.

배포 파이프라인, 대상, 자동화 만들기

파이프라인 및 대상을 파일 하나 또는 별도의 파일로 정의할 수 있습니다. 또한 개별 파일에 자동화 작업을 정의할 수 있습니다. 이 빠른 시작에서는 파이프라인, 대상, 자동화에 대해 하나의 파일을 사용합니다.

  1. 배포 파이프라인, 대상 정의, 자동화 작업을 만듭니다.

    GKE

    deploy-automation-gke-quickstart 디렉터리에서 다음 콘텐츠로 새 파일 clouddeploy.yaml을 만듭니다.

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-automation-demo-app-1
    description: Automation demonstration pipeline
    serialPipeline:
      stages:
      - targetId: automation-quickstart-dev
      - targetId: automation-quickstart-staging
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              kubernetes:
                serviceNetworking:
                  service: "my-service"
                  deployment: "my-deployment"
            canaryDeployment:
              percentages: [25]
              verify: false
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-dev
    description: Dev cluster to demonstrate deploy automation
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-staging
    description: Staging cluster to demonstrate deploy automation
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/promote
    description: promotes a release
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-dev
    rules:
    - promoteReleaseRule:
        name: "promote-release"
        wait: 1m
        toTargetId: "@next"
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/advance
    description: advances a rollout
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-staging
    rules:
    - advanceRolloutRule:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    

    Cloud Run

    deploy-automation-run-quickstart 디렉터리에서 다음 콘텐츠로 새 파일 clouddeploy.yaml을 만듭니다.

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-automation-demo-app-1
    description: Automation demonstration pipeline
    serialPipeline:
      stages:
      - targetId: automation-quickstart-dev
        profiles: [dev]
      - targetId: automation-quickstart-staging
        profiles: [staging]
        strategy:
          canary:
            runtimeConfig:
              cloudRun:
                automaticTrafficControl: true
            canaryDeployment:
              percentages: [25]
              verify: false
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-dev
    description: Dev cluster to demonstrate deploy automation
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-staging
    description: Staging cluster to demonstrate deploy automation
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/promote
    description: Promotes a release to the next target
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-dev
    rules:
    - promoteReleaseRule:
        name: "promote-release"
        wait: 1m
        toTargetId: "@next"
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/advance
    description: advances a rollout
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
      targets:
      - id: automation-quickstart-staging
    rules:
    - advanceRolloutRule:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    
  2. Cloud Deploy 서비스에 파이프라인 및 대상을 등록합니다.

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

    이제 두 개의 GKE 또는 Cloud Run 대상으로 구성된 하나의 다중 대상이 있는 파이프라인을 사용하여 애플리케이션을 배포할 수 있습니다.

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

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

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

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

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

  4. 파이프라인 이름을 클릭하여 배포 파이프라인 시각화 및 세부정보를 엽니다.

  5. 배포 파이프라인 세부정보에서 자동화 탭을 선택합니다.

    생성한 두 개의 자동화가 표시됩니다.

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

출시 버전 만들기

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

GKE

deploy-automation-gke-quickstart 디렉터리에서 다음 명령어를 실행하여 배포할 컨테이너 이미지를 나타내는 release 리소스를 만듭니다.

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

Cloud Run

deploy-automation-run-quickstart 디렉터리에서 다음 명령어를 실행하여 배포할 컨테이너 이미지를 나타내는 release 리소스를 만듭니다.

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

기본적으로 출시 버전을 만들 때는 파이프라인의 첫 번째 대상에 대해 출시가 자동으로 생성됩니다.

이 빠른 시작에는 2개의 자동화가 포함되기 때문에 2개 항목이 자동으로 발생합니다.

  • 첫 번째 대상에서 배포가 성공하면 출시가 두 번째 대상으로 자동 프로모션됩니다.

    프로모션 자동화에는 대기 시간이 1분 걸립니다.

  • 카나리아 구성이 25% 적용되는 두 번째 대상에서는 두 번째 자동화로 출시가 canary-25에서 stable로 진행됩니다.

    이 첫 번째 출시에서는 canary-25 단계를 건너뜁니다. 이는 카나리아 배포를 수행할 기존 앱 버전이 없기 때문입니다. 또한 출시가 자동으로 stable로 진행됩니다.

    진행 자동화에는 지연 시간이 1분 걸립니다.

모든 것이 완료되면 애플리케이션이 두 대상에 성공적으로 배포되고, 사용자가 추가로 수행해야 할 작업이 없습니다.

카나리아 배포 전략 실행에 대해 자세히 알아보려면 카나리아 빠른 시작을 참조하세요.

Google Cloud 콘솔에서 결과 보기

Google Cloud 콘솔에서 자동화 실행을 포함한 결과를 확인할 수 있습니다.

  1. Cloud Deploy 배포 파이프라인 페이지로 이동해서 배포 파이프라인을 확인합니다.

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

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

    파이프라인 시각화에 앱의 배포 상태가 표시됩니다. 시간이 충분히 경과하면 두 대상 모두 녹색으로 표시됩니다.

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

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

  3. 자동 실행 탭을 클릭합니다.

    생성한 두 자동화 각각에 하나씩 2개의 항목이 있습니다. 이 중 하나를 클릭하여 해당 자동화 실행에 대한 세부정보를 확인할 수 있습니다.

    Google Cloud 콘솔에 표시된 자동화 실행 세부정보

삭제

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

  1. GKE 클러스터 또는 Cloud Run 서비스를 삭제합니다.

    GKE

    gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \
    && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_ID
    

    Cloud Run

    gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \
    && gcloud run services delete my-automation-run-service-staging --region=us-central1 --project=PROJECT_ID
    
  2. 배포 파이프라인, 대상, 자동화, 출시 버전, 출시를 삭제합니다.

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

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

    Cloud Storage 브라우저 페이지 열기

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

다음 단계