Google Cloud Deploy 및 Cloud Run 실험

이 문서는 Cloud Run에 컨테이너를 배포하는 Google Cloud Deploy배포 파이프라인을 시작하는 방법을 설명하는 실험 가이드입니다. 이 튜토리얼을 마치면 devprod 등 2가지 환경으로 Cloud Run을 타겟팅하는 CD 파이프라인이 표시됩니다. 파이프라인 단계를 통해 새 컨테이너 이미지를 배포하고 승격할 수 있으며 Google Cloud Console에서 프로세스를 확인할 수 있습니다.

이 튜토리얼에서는 여러 Google Cloud 서비스, 특히 구성 컨트롤러를 사용하며, 아직 미리보기에 있으며 일반적으로 제공되지 않는 GA 이전 서비스(Cloud Run Admin API v2)를 포함합니다. 구성 컨트롤러를 사용하면 Kubernetes 리소스 모델 (KRM)을 사용하여 GCP 리소스를 선언적으로 프로비저닝할 수 있습니다. Google Cloud Deploy는 구성 컨트롤러를 사용하여 배포 파이프라인의 일부로 Cloud Run 서비스를 만들고 관리합니다.

궁금한 점이 있거나 버그를 찾거나 의견을 공유하고 싶다면 clouddeploy-feedback-external@google.com으로 문의해 주세요.

Cloud Shell 튜토리얼

이 문서의 안내는 따라하기 쉬운 Cloud Shell 기반 튜토리얼에도 포함되어 있습니다. 안내 및 맥락을 위해 이 문서를 사용하는 동안 이 튜토리얼을 따라할 수 있습니다.

환경 설정하기

  1. 새 프로젝트를 만들고 Google Cloud CLI의 기본 프로젝트를 설정합니다.

    새 프로젝트로 시작하는 것이 좋습니다.

    gcloud config set project PROJECT_ID
    

    위 명령어에서 PROJECT_ID를 실제 프로젝트 ID로 바꿉니다. 이 문서 전체에서 코드 (명령어 및 파일)에는 {PROJECT_ID}가 자리표시자로 포함되어 있습니다. 여기서 교체하면 페이지를 새로고침하지 않는 한 이 문서의 모든 인스턴스가 채워집니다.

  2. 필요한 API를 사용 설정합니다.

    gcloud services enable \
        krmapihosting.googleapis.com \
        clouddeploy.googleapis.com \
        compute.googleapis.com \
        run.googleapis.com
    

    이 명령어는 이 실험을 완료하기 위해 필요한 다음 API를 사용 설정합니다.

    • Compute Engine
    • 구성 컨트롤러
    • Google Cloud Deploy
    • Cloud Build (Google Cloud Deploy를 통해 사용 설정됨)
    • Cloud Storage (Google Cloud Deploy를 통해 사용 설정됨)
    • Resource Manager
    • Cloud Run
    • Google Kubernetes Engine (구성 컨트롤러를 통해 사용 설정됨)
  3. Google Cloud CLI를 설치 및 구성했는지 확인합니다.

    또한 kubectl이 설치되어 있는지 확인해야 합니다.

    which kubectl || gcloud components install kubectl
    

    Cloud Shell에서 명령어를 실행하면 이러한 구성요소가 이미 설치되어 있습니다.

  4. 기본 Compute Engine 서비스 계정 구성

    기본적으로 Google Cloud Deploy는 기본 Compute Engine 서비스 계정을 사용합니다. 서비스 계정에 필요한 권한이 이미 있을 수 있습니다. 이 단계는 기본 서비스 계정에 대해 자동 역할 부여를 사용 중지하는 조직에 포함됩니다.

    다음 명령어를 실행하여 서비스 계정에 적절한 권한이 있는지 확인합니다.

    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"
    
    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"
    
  5. Google Cloud Deploy 개요를 검토합니다.

    이 개요는 Google Cloud Deploy 서비스 및 개념을 이해하는 데 도움이 될 것입니다.

구성 컨트롤러 설정

Google Cloud Deploy는 구성 컨트롤러 인스턴스를 사용하여 Cloud Run 서비스 및 버전을 배포합니다.

  1. 구성 컨트롤러를 만들기 전에 기본 네트워크가 있는지 확인합니다.

    gcloud compute networks list
    

    콘솔이 성공하면 다음과 같이 출력됩니다.

    NAME: default
    SUBNET_MODE: AUTO
    BGP_ROUTING_MODE: REGIONAL
    IPV4_RANGE:
    GATEWAY_IPV4:
    

    기본 네트워크가 없는 경우 다음 명령어를 실행합니다.

    gcloud compute networks create default --subnet-mode=auto
    

    출력이 올바르다면 이 명령어를 실행할 필요가 없습니다.

    추가 문제가 발생하면 구성 컨트롤러 문제 해결 가이드를 참고하거나 조직의 관리자에게 문의하세요.

  2. 구성 컨트롤러 인스턴스를 만듭니다.

    gcloud anthos config controller create cc-deployrun --location=us-central1
    
  1. 배포할 프로젝트 내에서 구성 컨트롤러 권한을 부여합니다. 다음 명령어는 구성 컨트롤러가 프로젝트에서 Cloud Run 서비스를 만들고 관리하는 데 필요한 최소한의 권한을 제공합니다.

    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    
    gcloud projects add-iam-policy-binding "PROJECT_ID" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/run.admin" \
        --project "PROJECT_ID"
    
    gcloud projects add-iam-policy-binding "PROJECT_ID" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/iam.serviceAccountUser" \
        --project "PROJECT_ID"
    

구성 파일 만들기

Google Cloud Deploy는 Skaffold를 사용하여 배포할 항목 및 별도의 대상에 올바르게 배포하는 방법에 대한 세부정보를 제공합니다. 이 실험에는 run-devrun-prod의 두 가지 타겟이 있습니다.

Google Cloud Deploy Cloud Run 실험 대상, run-dev 및 run-prod

이 섹션에서는 Google Cloud Deploy 배포 파이프라인을 통해 애플리케이션을 배포할 Cloud Run 매니페스트를 식별하는 skaffold.yaml 파일을 만듭니다. 또한 각 대상 환경(각각 run-dev-service.yaml 및 run-prod-service.yaml)에 대해 Cloud Run 서비스의 매니페스트를 생성합니다.

  1. 매니페스트를 위한 새 디렉터리를 만들고 해당 디렉터리로 이동합니다.

    mkdir deploy-cloudrun
    cd deploy-cloudrun
    
  2. 이 디렉터리에 skaffold.yaml 파일을 만듭니다.

    skaffold.yaml는 특정 출시 버전에 대해 파이프라인의 각 대상에 어떤 매니페스트를 배포할지 Google Cloud Deploy에 알려줍니다.

    apiVersion: skaffold/v2beta26
    kind: Config
    profiles:
     - name: prod
       deploy:
         kubectl:
           manifests:
             - run-prod-*.yaml
     - name: dev
       deploy:
         kubectl:
           manifests:
             - run-dev-*.yaml
    
  3. 동일한 디렉터리에 run-dev-service.yaml 파일을 만듭니다.

    이 선언적 매니페스트는 Cloud Run 서비스의 dev 환경 버전을 나타냅니다.

    컨테이너 확장을 인스턴스 2개로 제한하는 등 이 환경에 맞춤설정된 설정을 확인합니다. 라벨과 이름은 프로젝트에서 이 버전의 서비스를 구분하는 데 사용됩니다. 이미지 이름은 특정 컨테이너 이미지가 아닌 run-container라는 변수입니다. Google Cloud Deploy에서 출시 버전을 만들 때 특정 컨테이너 이미지로 대체됩니다.

    apiVersion: run.cnrm.cloud.google.com/v1beta1
    kind: RunService
    metadata:
      labels:
        cloud-deploy-target: run-dev
      name: deploytest-dev
      namespace: config-control
    spec:
      ingress: INGRESS_TRAFFIC_ALL
      location: us-central1
      projectRef:
        external: projects/PROJECT_ID
      template:
        containers:
          - env:
              - name: environment
                value: dev
            image: run-container
        scaling:
          maxInstanceCount: 2
      traffic:
        - percent: 100
          type: TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST
    
  4. 동일한 디렉터리에 run-prod-service.yaml 파일을 만듭니다.

    이 매니페스트는 Cloud Run 서비스의 prod 버전을 나타냅니다. 업데이트된 이름, 라벨, 확장 설정은 물론 run-container의 재사용도 주목하세요.

    apiVersion: run.cnrm.cloud.google.com/v1beta1
    kind: RunService
    metadata:
      labels:
        cloud-deploy-target: run-prod
      name: deploytest-prod
      namespace: config-control
    spec:
      ingress: INGRESS_TRAFFIC_ALL
      location: us-central1
      projectRef:
        external: projects/PROJECT_ID
      template:
        containers:
          - env:
              - name: environment
                value: prod
            image: run-container
        scaling:
          maxInstanceCount: 10
      traffic:
        - percent: 100
          type: TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST
    

전달 파이프라인 및 대상 만들기

Google Cloud Deploy 배포 파이프라인과 대상을 하나의 파일 또는 별도의 파일로 정의할 수 있습니다. 이 튜토리얼에서는 편의상 단일 파일을 만듭니다.

  1. 최근에 만든 매니페스트 (/deploy-cloudrun/)가 있는 디렉터리에서 clouddeploy.yaml 파일을 만듭니다.

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
     name: my-run-app-1
    description: main application pipeline
    serialPipeline:
     stages:
     - targetId: run-dev
       profiles:
       - dev
     - targetId: run-prod
       profiles:
       - prod
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
     name: run-dev
    description: Cloud Run development environment
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/krmapihost-cc-deployrun
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
     name: run-prod
    description: Cloud Run production environment
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/krmapihost-cc-deployrun
    

    cloudeploy.yaml은 배포 파이프라인의 두 단계(run-devrun-prod)로 진행되는 시퀀스를 정의합니다. 또한 이 두 단계 각각의 타겟도 정의합니다.

    두 대상은 GKE 클러스터와 동일한 구성 컨트롤러를 가리킵니다. 이 구성 컨트롤러는 구성 컨트롤러 생성 시 생성된 기본 GKE 클러스터에서 지원되며, 각 매니페스트를 사용하여 각 환경의 Cloud Run 서비스를 만듭니다.

    GKE 클러스터

  2. Google Cloud Deploy에 배포 파이프라인 및 대상을 등록합니다.

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

    출력은 다음과 같습니다.

    Waiting for the operation on resource projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1.
    Waiting for the operation on resource projects/sample-project/locations/us-central1/targets/run-dev...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/targets/run-dev.
    Waiting for the operation on resource projects/sample-project/locations/us-central1/targets/run-prod...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/targets/run-prod.
    

출시 버전 생성 및 컨테이너 배포

구성 파일이 준비되고 배포 파이프라인과 대상이 등록되면 이제 배포할 컨테이너 이미지를 나타내는 출시 리소스를 만들 수 있습니다. 예시 컨테이너를 사용하여 echoserver를 배포합니다.

gcloud deploy releases create run-release-001 --project=PROJECT_ID --region=us-central1 --delivery-pipeline=my-run-app-1 --labels="use-case=my-cloud-run-experiment" --images=run-container="us-docker.pkg.dev/cloudrun/container/hello"

출력은 다음과 같습니다.

Creating temporary tarball archive of 4 file(s) totalling 2.0 KiB before compression.
Uploading tarball of [.] to [gs://sample-project_clouddeploy_us-central1/source/1643560782.447815-aed1fdf4973b4d25b9b7d09ff9fbbaa9.tgz]
Waiting for operation [operation-1643560782826-5d6cf50a08a8d-e40f7a45-ac4aa0ae]...done.
Created Cloud Deploy release run-release-001.
Creating rollout projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-dev-0001 in target run-dev...done.

이번이 첫 번째 출시 (진행 중인 첫 번째 대상에 배포)이므로, Google Cloud Deploy는 자동으로 롤아웃 리소스를 만들고, 진행의 첫 번째 타겟 (run-dev)에 앱을 배포합니다. 출시가 완료될 때까지 몇 분 정도 기다려야 할 수 있으며 다음 명령어를 사용하여 롤아웃 상태를 추적할 수 있습니다.

gcloud deploy rollouts list --delivery-pipeline=my-run-app-1 --region=us-central1 --release run-release-001

출력은 다음과 같습니다.

approvalState: DOES_NOT_NEED_APPROVAL
createTime: '2022-02-10T21:25:11.228171Z'
deployEndTime: '2022-02-10T21:26:37.984888Z'
deployStartTime: '2022-02-10T21:26:09.778897390Z'
deployingBuild: projects/435050644073/locations/us-central1/builds/59f588d1-0cbc-4c46-9574-7e3f3b763ae6
enqueueTime: '2022-02-10T21:26:09.108240Z'
etag: 5f57d54f8b11d20e
name: projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-dev-0001
state: SUCCEEDED
targetId: run-dev
uid: 9cab18e1dfea4054b7d182b707c21f75

이제 앱이 첫 번째 대상에 배포되었으므로 Cloud Run 서비스(deploytest-dev)가 예상대로 실행되는지 확인할 수 있습니다.

gcloud run services list --region=us-central1

출력은 다음과 같습니다.


SERVICE: deploytest-dev
REGION: us-central1
URL: https://deploytest-dev-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T04:25:13.081829Z

출시 버전 승격

이제 애플리케이션이 첫 번째 대상 run-dev에 배포되었으므로 다음 명령어를 사용하여 애플리케이션을 승격합니다.

gcloud deploy releases promote --release=run-release-001 --delivery-pipeline=my-run-app-1 --region=us-central1 --project=PROJECT_ID

출력은 다음과 같습니다.

Promoting release run-release-001 to target run-prod.

Do you want to continue (Y/n)? Y

Creating rollout projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-prod-0001 in target run-prod...done.

Google Cloud Console에서 출시 승격

완료되면 Cloud Run 프로덕션 서비스가 실행 중인지 다시 확인합니다.

gcloud run services list --region=us-central1

출력은 다음과 같습니다.


SERVICE: deploytest-dev
REGION: us-central1
URL: https://deploytest-dev-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T04:25:13.081829Z


SERVICE: deploytest-prod
REGION: us-central1
URL: https://deploytest-prod-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T16:04:43.468907Z

Cloud Run 서비스

Cloud Deploy 콘솔에서 결과 보기

배포 파이프라인을 통한 출시 진행 상황을 보려면 Google Cloud Deploy 콘솔을 열고 my-run-app-1 배포 파이프라인으로 이동합니다.

파이프라인 시각화의 출시 진행 상황

출시 버전 검토

배포 파이프라인 세부정보 뷰의 출시 표에서 관련 이름 run-release-001를 클릭하여 생성된 출시 버전의 세부정보를 볼 수 있습니다.

출시 세부정보 뷰에서 지정된 이미지 (컨테이너) 매개변수 (빌드 아티팩트) 및 렌더링된 서비스 매니페스트와 같은 애셋을 추가로 검사할 수 있습니다.

버전 세부정보

출시 검토

각 출시는 출시 페이지에도 나와 있습니다. 출시 이름을 클릭하면 출시 및 렌더링 및 배포 로그에 대한 자세한 정보가 포함된 출시 세부정보가 열립니다.

출시 세부정보

Cloud Run 콘솔에서 서비스 보기

Cloud Run Console에서 생성된 서비스 로그를 사용하여 서비스가 올바르게 시작되었는지 검토할 수 있습니다.

Cloud Run 서비스 로그

챌린지 운동

지금까지 Cloud Run 서비스 배포 파이프라인을 만들어 개발 환경에서 컨테이너를 프로덕션 환경으로 승격했습니다. 다음은 Google Cloud Deploy의 Cloud Run 배포 파이프라인을 더 자세히 살펴보기 위해 수행할 수 있는 챌린지 연습 목록입니다.

  • 프로덕션 서비스 환경의 배포 파이프라인에 대한 승인을 추가합니다.

  • 기존 Cloud Run 서비스 중 하나를 변환하여 Google Cloud Deploy 배포 파이프라인을 사용합니다.

  • Kustomize를 사용하여 devprod의 Cloud Run 서비스 매니페스트를 매개변수화합니다. Google Cloud Deploy Skaffold 프로필 둘러보기 튜토리얼도 참조하세요.

삭제

이 실험이 완료되면 프로젝트를 삭제하거나 프로젝트의 리소스를 삭제하여 이러한 리소스에 대한 요금이 Google Cloud 계정에 청구되지 않도록 할 수 있습니다.

  1. 구성 컨트롤러를 통해 배포된 Cloud Run 서비스를 클러스터에서 직접 삭제합니다.

    구성 컨트롤러 클러스터에서 네임스페이스를 삭제하면 생성된 Cloud Run 서비스가 모두 삭제됩니다.

    kubectl -n config-control delete runservice deploytest-dev
    
    kubectl -n config-control delete runservice deploytest-prod
    
  2. 구성 컨트롤러를 삭제합니다.

    gcloud anthos config controller delete cc-deployrun  --location=us-central1 --project=PROJECT_ID
    
  3. 배포 파이프라인을 삭제합니다.

    gcloud deploy delivery-pipelines delete my-run-app-1 --force --region=us-central1 --project=PROJECT_ID
    

    이렇게 하면 배포 파이프라인 자체와 Google Cloud Deploy가 해당 파이프라인용으로 만든 모든 출시 및 출시 리소스가 삭제됩니다.

  4. Cloud Storage Console을 사용하여 Google Cloud Deploy가 만든 Cloud Storage 버킷을 삭제합니다.

    스토리지 버킷은 [PROJECT]_clouddeploy_[region][region].deploy-artifacts.[project-id].appspot.com 같은 이름 지정 규칙과 다음 명령어를 사용하여 식별할 수 있습니다.

    gsutil ls | egrep "_clouddeploy_|deploy-artifacts.PROJECT_ID.appspot.com" | xargs --max-lines=1 echo gsutil gsutil -m rm -r
    

    그러면 버킷 목록이 올바른지 확인한 후 실행할 명령어가 출력됩니다.

    gsutil rb gs://PROJECT_ID_clouddeploy_us-central1/
    gsutil rb gs://us-central1.deploy-artifacts.PROJECT_ID.appspot.com/