Cloud Deploy로 출시

1. 목표

이 튜토리얼에서는 preview, canary, prod라는 3개의 GKE 클러스터를 만듭니다. 그런 다음 각 클러스터에 해당하는 Cloud Deploy 대상과 이러한 대상에서 배포를 수행하기 위한 단계의 순서를 정의하는 Cloud Deploy 파이프라인을 만듭니다.

배포 흐름은 Cloud Deploy 출시 버전을 만들고 미리보기 클러스터에서 배포를 수행하는 cloudbuild 파이프라인에 의해 트리거됩니다. 미리보기에서 배포가 성공적이고 예상대로 작동하는지 확인한 후 카나리아 클러스터에서 출시 버전을 수동으로 승격합니다. 프로덕션 클러스터의 출시 버전을 승격하려면 승인이 필요합니다. Cloud Deploy UI에서 프로덕션 파이프라인을 승인하고 최종적으로 승격합니다.

이 튜토리얼의 목표는 다음과 같은 단계로 나눌 수 있습니다.

  • 작업공간 준비
  • Cloud Deploy 대상 정의
  • Cloud Deploy 파이프라인 정의
  • 출시 버전 만들기
  • 배포 승격
  • 프로덕션 버전 승인

자습형 환경 설정

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

2. 플랫폼 설정

작업공간 준비 중

이 튜토리얼을 실행하는 데 필요한 환경을 설정해 보겠습니다. 이 단계가 완료되면 배포를 실행할 수 있는 GKE 클러스터가 생성됩니다.

  1. gcloud 구성 기본값 설정

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. 저장소 클론

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. 환경 변수 설정하기

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. API 사용 설정

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. GKE 클러스터 만들기
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

Cloud Deploy 대상 정의

  1. cloudshell에서 다음 명령어를 사용하여 preview.yaml이라는 배포 디렉터리에 파일을 만듭니다.

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. Cloud Shell에서 다음 명령어를 사용해 배포 디렉터리에 canary.yaml이라는 이름의 파일을 만듭니다.

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. Cloud Shell에서 다음 명령어를 사용해 배포 디렉터리에 prod.yaml이라는 이름의 파일을 만듭니다.

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

true로 설정된 requiredApproval 태그를 확인합니다. 승인이 부여될 때까지 프로덕션 대상으로 승격할 수 없습니다. 출시 버전을 승인하려면roles/clouddeploy.approver 역할이 필요합니다.

  1. 배포 대상 만들기
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

3. 앱 제작

새 애플리케이션을 만드는 과정에서 CICD 파이프라인은 일반적으로 자동 빌드, 통합 테스트 및 배포를 수행하도록 설정됩니다. 다음 단계는 새 앱 설정 프로세스의 일부로 간주됩니다. 각각의 새 애플리케이션에는 배포 파이프라인이 구성됩니다.

Cloud Deploy 파이프라인 정의

  1. Cloud Shell에서 다음 명령어를 사용해 배포 디렉터리에pipeline.yaml이라는 이름의 파일을 만듭니다.

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

serialPipeline 태그에는 이 배포 파이프라인이 배포하도록 구성된 모든 대상의 목록인 steps라는 태그가 포함되어 있습니다.

targetId는 배포 파이프라인의 이 단계에서 사용할 특정 대상을 식별합니다. 값은 대상 정의의 metadata.name 속성입니다.

profiles는 skaffold.yaml에서 가져온 0개 이상의 Skaffold 프로필 이름 목록입니다. Cloud Deploy는 출시 버전을 만들 때 Skaffold 렌더링이 포함된 프로필을 사용합니다.

  1. 파이프라인 적용

gcloud beta deploy apply --file deploy/pipeline.yaml

4. 개발 단계

애플리케이션이 개발됨에 따라 자동화된 CICD 도구 모음이 애셋을 빌드하고 저장합니다. 다음 명령어가 실행되어 skaffold를 사용하여 애플리케이션을 빌드하고 Cloud Deploy로 배포할 애셋을 저장합니다. 이 단계는 모든 애플리케이션 빌드의 CICD 프로세스에서 수행합니다.

  1. Skaffold로 애플리케이션 빌드 및 저장

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. 출시 단계

CICD 프로세스가 끝나면(일반적으로 코드에 프로덕션 태그 지정) cloud deploy release 명령어를 호출하여 출시 프로세스를 시작합니다. 나중에 배포가 검증되고 승인되면 자동화된 프로세스 또는 수동 승인을 통해 작업을 승격하고 승인하여 다양한 대상 환경에서 출시 버전을 이동합니다.

출시 버전 만들기

Cloud Deploy의 작동 방식을 이해하기 위해 앞서 이 튜토리얼에서 Cloud Deploy 파일을 만들었습니다. 데모를 위해 동일한 Cloud Deploy 파일을 만들고 샘플 go 애플리케이션이 포함된 GitHub 저장소에 푸시했으며 Cloud Deploy를 사용하여 해당 애플리케이션의 출시를 수행합니다.

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

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

버전 검토

Cloud Deploy 출시 버전이 생성되면 미리보기인 첫 번째 대상에 자동으로 출시됩니다.

  1. <Cloud Deploy>로 이동합니다. (Google Cloud 콘솔에서)
  2. 'sample-app'을 클릭합니다.

이 화면에는 파이프라인이 그래픽으로 표시됩니다.

  1. 미리보기 상자 왼쪽에 있는 녹색 윤곽선이 표시되면 출시 버전이 해당 환경에 배포되었음을 나타냅니다.
  2. 원하는 경우 화면 하단 섹션의 '출시 세부정보'에서 버전 이름을 클릭하여 발표곡에 관한 추가 세부정보를 검토할 수도 있습니다.
  3. 출시 버전에서 애플리케이션이 성공적으로 배포되었는지 확인하고 다음 명령어를 실행합니다.

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 화면 오른쪽 상단의 웹 미리보기 아이콘을 클릭합니다.
  2. 포트 8080에서 미리보기 선택

그러면 'Hello World!' 메시지가 표시된 새 페이지로 이동합니다.

  1. 터미널에서 ctrl+c를 사용하여 포트 전달을 종료합니다.

출시 버전 승격

이제 출시 버전이 파이프라인의 첫 번째 대상 (미리보기)에 배포되었으므로 다음 대상 (카나리아)으로 승격할 수 있습니다. 다음 명령어를 실행하여 프로세스를 시작합니다.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

신곡 프로모션 검토

  1. Google Cloud 콘솔의 샘플 앱 파이프라인으로 이동합니다.
  2. Canary 상자 왼쪽에 있는 녹색 윤곽선이 표시되면 출시 버전이 해당 환경에 배포되었음을 나타냅니다.
  3. 애플리케이션에 대한 터널을 만들어 애플리케이션이 올바르게 배포되었는지 확인

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 화면 오른쪽 상단의 웹 미리보기 아이콘을 클릭합니다.
  2. 포트 8080에서 미리보기 선택

그러면 'Hello World!' 메시지가 표시된 새 페이지로 이동합니다.

  1. 터미널에서 ctrl+c를 사용하여 포트 전달을 종료합니다.

프로덕션 출시 승인

prod.yaml을 통해 prod 타겟을 만들 때 requiredApproval 태그를 true로 지정했음을 기억하세요. 이렇게 하면 프로덕션에서의 프로모션 승인 요구사항이 강제 적용됩니다.

  1. 다음 명령어를 사용하여 카나리아 릴리스를 프로덕션으로 승격합니다.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. Google Cloud 콘솔의 샘플 앱 파이프라인으로 이동합니다.
  2. 노란색 표시기에 '1개 대기 중'이 표시됩니다.

이 메시지는 프로덕션 배포 대기 중인 출시 버전이 있지만 검토 및 승인이 필요함을 나타냅니다.

  1. '검토'를 클릭합니다. 버튼을 클릭하세요.
  2. 다음 화면에서 '검토'를 클릭합니다. 프로덕션의 승인 화면에 액세스하기
  3. 원하는 경우 매니페스트 차이를 검토하여 변경사항을 검토합니다. 이 경우에는 완전히 새로운 파일입니다.
  4. '승인'을 클릭합니다. 버튼
  5. 샘플 앱 파이프라인 페이지로 돌아가면 프로덕션 출시가 진행 중인 것을 볼 수 있습니다.

프로덕션 버전 검토

다른 환경과 마찬가지로 아래 단계에 따라 배포가 완료되면 배포할 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 포트 전달을 만듭니다.

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 화면 오른쪽 상단의 웹 미리보기 아이콘을 클릭합니다.
  2. 포트 8080에서 미리보기 선택

그러면 'Hello World!' 메시지가 표시된 새 페이지로 이동합니다.

  1. 터미널에서 ctrl+c를 사용하여 포트 전달을 종료합니다.