Cloud Deploy로 Cloud Run 애플리케이션 배포

1. 개요

이 실습에서는 Cloud Deploy를 사용하여 Cloud Run에 .Net 애플리케이션을 배포합니다. Dockerfile을 사용하지 않고 Cloud Build로 컨테이너 이미지를 빌드해 보겠습니다. Cloud Deploy를 사용하여 3가지 대상 환경이 있는 파이프라인을 설정하고 환경을 통해 출시 버전을 승격하는 단계를 진행합니다. 마지막으로 프로덕션 환경에 배포할 출시 버전을 승인합니다.

916a54f51af5ee54.png

Cloud Build란 무엇인가요?

Cloud Build를 사용하면 모든 프로그래밍 언어로 소프트웨어를 빠르게 빌드할 수 있습니다.

Cloud Deploy란 무엇인가요?

Cloud Deploy는 완전 관리형 지속적 배포 서비스입니다. Cloud Deploy를 사용하면 GKE, Anthos, Cloud Run을 위한 배포 파이프라인을 만들 수 있습니다.

Cloud Run이란 무엇인가요?

Cloud Run을 사용하면 모든 언어 (Go, Python, Java, Node.js, .NET, Ruby 등)로 작성된 확장 가능한 컨테이너화된 애플리케이션을 완전 관리형 플랫폼에 배포할 수 있습니다.

Skaffold란 무엇인가요?

Skaffold는 Kubernetes 기반 애플리케이션의 지속적인 개발을 지원하는 명령줄 도구입니다. Cloud Deploy는 렌더링 및 배포 작업에 Skaffold를 사용합니다.

학습할 내용

이 실습에서는 다음 작업을 진행하는 방법을 학습합니다.

  • Cloud Deploy 파이프라인 만들기
  • Dockerfile을 사용하지 않고 Cloud Build로 .Net 애플리케이션의 컨테이너 이미지 만들기
  • Cloud Deploy로 Cloud Run에 애플리케이션 배포
  • Cloud Deploy 출시 버전 승격

기본 요건

  • 이 실습에서는 Cloud 콘솔 및 셸 환경에 익숙하다고 가정합니다.

2. 설정 및 요구사항

Cloud 프로젝트 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 무작위로 다른 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

환경 설정

검색창 오른쪽에 있는 아이콘을 클릭하여 Cloud Shell을 활성화합니다.

eb0157a992f16fa3.png

Cloud Shell에서 다음 명령어를 실행하여 프로젝트 환경 변수를 설정합니다.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
export REGION=us-central1

API 사용 설정:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  clouddeploy.googleapis.com \
  artifactregistry.googleapis.com

애플리케이션 컨테이너 이미지를 저장할 Artifact Registry 저장소를 만듭니다.

gcloud artifacts repositories create containers-repo \
  --repository-format=docker \
  --location=${REGION} \
  --description="Containers repository"

3. 구성 파일 검토

29c2533441779de0.png

애플리케이션 소스 코드를 클론합니다.

git clone https://github.com/gitrey/deploy-cloudrun-app-with-clouddeploy.git
cd deploy-cloudrun-app-with-clouddeploy

Cloud Deploy 파이프라인 구성을 검토합니다.

clouddeploy.yaml

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: cloud-run-pipeline
description: application deployment pipeline
serialPipeline:
 stages:
 - targetId: dev-env
   profiles: [dev]
 - targetId: qa-env
   profiles: [qa]
 - targetId: prod-env
   profiles: [prod]
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev-env
description: Cloud Run development service
run:
 location: projects/_PROJECT_ID/locations/us-west1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: qa-env
description: Cloud Run QA service
run:
 location: projects/_PROJECT_ID/locations/us-central1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: prod-env
description: Cloud Run PROD service
run:
 location: projects/_PROJECT_ID/locations/us-south1

세 가지 환경을 정의하고 Cloud Run을 대상 서비스로 사용하는 skaffold.yaml 파일을 검토합니다.

skaffold.yaml

apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-app
profiles:
- name: dev
  manifests:
    rawYaml:
    - deploy-dev.yaml
- name: qa
  manifests:
    rawYaml:
    - deploy-qa.yaml
- name: prod
  manifests:
    rawYaml:
    - deploy-prod.yaml
deploy:
  cloudrun: {}

서비스 구성 파일을 검토합니다.

deploy-dev.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi

deploy-qa.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app

deploy-prod.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: app-prod
spec:
  template:
    spec:
      containers:
      - image: app

컨테이너 이미지를 빌드하고 Cloud Deploy 출시를 만드는 단계가 포함된 cloudbuild.yaml 파일을 검토합니다.

cloudbuild.yaml

steps:
- name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: 'pack'
  args: ['build',
         '--builder=gcr.io/buildpacks/builder',
         '--publish', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID']
  id: Build and package .net app
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  args: 
      [
        "deploy", "releases", "create", "release-$_RELEASE_TIMESTAMP",
        "--delivery-pipeline", "cloud-run-pipeline",
        "--region", "${_REGION}",
        "--images", "app=${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID"
      ]
  entrypoint: gcloud

4. Cloud Deploy 파이프라인 만들기

clouddeploy.yaml에서 _PROJECT_ID 값을 바꿉니다.

sed -i "s/_PROJECT_ID/$PROJECT_ID/g" clouddeploy.yaml

Cloud Deploy 파이프라인을 만듭니다.

gcloud deploy apply \
  --file=clouddeploy.yaml \
  --region=${REGION} \
  --project=${PROJECT_ID}

Cloud Deploy에서 생성된 파이프라인을 검토합니다.

5. 컨테이너 이미지 빌드 및 출시 버전 만들기

Cloud Build 서비스 계정에 Cloud Deploy 운영자 권한을 추가합니다.

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/clouddeploy.operator

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

컨테이너 이미지 및 Cloud Deploy 출시 버전을 만듭니다.

export RELEASE_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud builds submit \
  --config cloudbuild-plus.yaml \
  --substitutions=_REGION=${REGION},_RELEASE_TIMESTAMP=${RELEASE_TIMESTAMP}

Cloud Deploy에서 생성된 출시 버전을 검토합니다. 개발 환경에 대한 배포가 완료될 때까지 기다립니다.

6. 출시 버전을 QA 및 PROD 환경으로 승격

Cloud 콘솔 또는 Cloud Shell을 사용하여 출시 버전을 다음 대상(qa-env)으로 승격합니다.

Cloud Shell로 출시 버전을 승격하고 gcloud 명령어를 실행하여 출시 버전을 승격합니다.

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

QA 환경에 대한 배포가 완료될 때까지 기다립니다. 출시 버전을 다음 대상(prod-env)으로 승격합니다.

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Cloud 콘솔에서 Cloud Deploy를 열고 프로덕션 배포를 위한 출시 버전을 승인합니다.

4c838b60770e9691.png

Cloud Deploy 파이프라인 상태와 사용 가능한 DORA 측정항목('배포 수', '배포 빈도', '배포 실패율')을 검토합니다.

측정항목

설명

배포 횟수

배포 파이프라인의 최종 대상에 대한 성공 및 실패 배포의 총 개수입니다.

배포 빈도

배포 파이프라인이 배포 파이프라인의 최종 대상에 배포되는 빈도입니다.DORA (DevOps Research and Assessment) 프로그램에서 정의하는 4가지 주요 측정항목 중 하나입니다.

배포 실패율

배포 파이프라인의 최종 대상에 대한 출시 실패율입니다.

Cloud Run에 배포된 애플리케이션을 검토합니다.

d6372b5350f10875.png

7. 축하합니다.

축하합니다. Codelab을 완료했습니다.

학습한 내용

  • Cloud Deploy 파이프라인을 만드는 방법
  • Cloud Build로 .Net 애플리케이션의 컨테이너 이미지를 만드는 방법
  • Cloud Deploy로 Cloud Run에 애플리케이션을 배포하는 방법을 알아봅니다.
  • Cloud Deploy 출시 버전을 승격하는 방법

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

8. 다음 단계