1. 목표
이 튜토리얼에서는 preview, canary, prod라는 GKE 클러스터를 세 개 만듭니다. 그런 다음 각 클러스터에 해당하는 Cloud Deploy 타겟과 이러한 타겟에서 배포를 실행하는 단계의 시퀀스를 정의할 Cloud Deploy 파이프라인을 만듭니다.
배포 흐름은 Cloud Deploy 출시를 만들고 미리보기 클러스터에서 배포를 실행하는 cloudbuild 파이프라인에 의해 트리거됩니다. 미리보기 배포가 완료되고 예상대로 작동하는지 확인한 후 카나리아 클러스터에서 릴리스를 수동으로 승격합니다. 프로덕션 클러스터에서 출시를 프로모션하려면 승인이 필요합니다. Cloud Deploy UI에서 프로덕션 파이프라인을 승인한 후 최종적으로 프로모션합니다.
이 튜토리얼의 목표는 다음 단계로 나눌 수 있습니다.
- 작업공간 준비
- Cloud Deploy 대상 정의
- Cloud Deploy 파이프라인 정의
- 출시 버전 만들기
- 배포 승격
- 프로덕션 출시 승인
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud Console은 고유한 문자열을 자동으로 생성합니다. 일반적으로 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID를 참조해야 하며(일반적으로
PROJECT_ID
로 식별됨), 마음에 들지 않는 경우 임의로 다시 생성하거나 직접 지정해서 사용할 수 있는지 확인하세요. 프로젝트가 생성되면 프로젝트 ID가 '고정'됩니다. - 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참조하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하려면 Codelab의 끝에 있는 '삭제' 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
2. 플랫폼 설정
작업공간 준비
이 튜토리얼을 실행하는 데 필요한 환경을 설정합니다. 이 단계가 완료되면 배포를 실행할 수 있는 GKE 클러스터가 생성됩니다.
- gcloud config 기본값 설정
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- 저장소 클론
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- 환경 변수 설정하기
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
- API 사용 설정
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- 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 대상 정의
- 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.
- 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
- 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
requireApproval 태그가 true로 설정되어 있는 것을 확인할 수 있습니다. 승인이 부여될 때까지 프로덕션 타겟으로 승격할 수 없습니다. 출시를 승인하려면 roles/clouddeploy.approver 역할이 필요합니다.
- 배포 대상 만들기
`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 파이프라인 정의
- 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
태그에는 이 배포 파이프라인이 배포하도록 구성된 모든 타겟의 목록인 stages라는 태그가 포함됩니다.
targetId
은 이 배포 파이프라인 단계에서 사용할 특정 타겟을 식별합니다. 값은 타겟 정의의 metadata.name 속성입니다.
profiles
은 skaffold.yaml의 0개 이상의 Skaffold 프로필 이름 목록입니다. Cloud Deploy는 출시 버전을 만들 때 skaffold 렌더링과 함께 프로필을 사용합니다.
- 파이프라인 적용
gcloud beta deploy apply --file deploy/pipeline.yaml
4. 개발 단계
애플리케이션이 개발되면 자동화된 CICD 도구 모음은 애셋을 빌드하고 저장합니다. 다음 명령어는 skaffold를 사용하여 애플리케이션을 빌드하고 Cloud Deploy로 배포할 애셋을 저장하기 위해 실행됩니다. 이 단계는 모든 애플리케이션 빌드에 대해 CICD 프로세스에서 실행합니다.
- 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 출시 버전이 생성되면 미리보기인 첫 번째 대상에 자동으로 출시됩니다.
- Google Cloud 콘솔의<Cloud Deploy>로 이동합니다.
- 'sample-app'을 클릭합니다.
이 화면에는 파이프라인이 그래픽으로 표시됩니다.
- 미리보기 상자의 왼쪽에 녹색 윤곽선이 표시되면 해당 환경에 출시가 배포되었음을 의미합니다.
- 원하는 경우 화면 하단의 '출시 세부정보'에서 출시 이름을 클릭하여 출시에 관한 추가 세부정보를 검토합니다.
- 출시에서 애플리케이션을 성공적으로 배포했는지 확인합니다. cloushell에서 다음 명령어를 실행합니다.
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
- 화면 오른쪽 상단에 있는 웹 미리보기 아이콘을 클릭합니다.
- 포트 8080에서 미리보기 선택
그러면 'Hello World!' 메시지가 표시된 새 페이지로 이동합니다.
- 터미널에서
ctrl+c
를 사용하여 포트 전달을 종료합니다.
출시 버전 승격
이제 출시 버전이 파이프라인의 첫 번째 타겟 (미리보기)에 배포되었으므로 다음 타겟 (카나리아)으로 승격할 수 있습니다. 다음 명령어를 실행하여 프로세스를 시작합니다.
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
출시 프로모션 검토
- Google Cloud 콘솔의 샘플 앱 파이프라인으로 이동합니다.
- Canary 상자의 왼쪽에 녹색 윤곽선이 표시되면 출시가 해당 환경에 배포되었음을 의미합니다.
- 애플리케이션에 대한 터널을 만들어 애플리케이션이 올바르게 배포되었는지 확인
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
- 화면 오른쪽 상단에 있는 웹 미리보기 아이콘을 클릭합니다.
- 포트 8080에서 미리보기 선택
그러면 'Hello World!' 메시지가 표시된 새 페이지로 이동합니다.
- 터미널에서
ctrl+c
를 사용하여 포트 전달을 종료합니다.
프로덕션 출시 승인
prod.yaml을 통해 프로덕션 타겟을 만들 때 requireApproval 태그를 true로 지정했습니다. 이렇게 하면 프로덕션에서 승격을 위해 승인이 필요하게 됩니다.
- 다음 명령어를 사용하여 카나리아 출시를 프로덕션으로 승격합니다.
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- Google Cloud 콘솔의 샘플 앱 파이프라인으로 이동합니다.
- '대기 중 1건'이라고 표시된 노란색 표시기가 있습니다.
이 메시지는 프로덕션에 배포할 버전이 대기열에 있지만 검토 및 승인이 필요하다는 것을 나타냅니다.
- 노란색 알림 바로 아래에 있는 '검토' 버튼을 클릭합니다.
- 다음 화면에서 '검토'를 다시 클릭하여 제작 승인 화면에 액세스합니다.
- 원하는 경우 매니페스트 차이를 검토하여 변경사항을 확인합니다. 이 경우 완전히 새로운 파일이 생성됩니다.
- '승인' 버튼을 클릭합니다.
- sample-app 파이프라인 페이지로 돌아가면 프로덕션으로 진행 중인 출시가 표시됩니다.
프로덕션 출시 검토
다른 환경과 마찬가지로 배포가 완료되면 아래 단계에 따라 배포를 검토할 수 있습니다.
- 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
- 화면 오른쪽 상단에 있는 웹 미리보기 아이콘을 클릭합니다.
- 포트 8080에서 미리보기 선택
그러면 'Hello World!' 메시지가 표시된 새 페이지로 이동합니다.
- 터미널에서
ctrl+c
를 사용하여 포트 전달을 종료합니다.