마짱짱의 지식창고

Cloud Code, Cloud Build, Google Cloud Deploy, GKE를 사용한 앱 개발 및 제공 본문

Cloud/GCP

Cloud Code, Cloud Build, Google Cloud Deploy, GKE를 사용한 앱 개발 및 제공

마짱짱 2022. 7. 4. 13:38
반응형

Cloud Code, Cloud Build, Google Cloud Deploy, GKE를 사용한 앱 개발 및 제공

원문: https://cloud.google.com/architecture/app-development-and-delivery-with-cloud-code-gcb-cd-and-gke?hl=ko

GCP 만 이용하여 GKE 통합(CI), 배포(CD) 시스템을 설정하고 개발하는 방법

Architecture 특징

  • 더 빠르게 개발하고 배포
  • 다양한 환경에서 구성을 재사용
    opensource인 Skaffold 이 활용 됨
  • 워크플로의 초기에 거버넌스를 적용
  • 독자적인 도구로 소프트웨어 배포 및 관리

Cloud Shell, Code

Cloud Build

어플리케이션 빌드 및 테스트 하는 곳 - 파이프라인의 CI

Skaffold 이용

Cloud Deploy

https://cloud.google.com/deploy

PaaS 제품

배포하는 곳 - 파이프라인의 CD

해당 비용이외에 추가로 발생하는곳

  • Cloud Build
  • Cloud Storage
  • Cloud Audit Log
  • 그 외 GCP 제품들

Artifact Registry

컨테이너 이미지 및 언어패키지를 한곳에서 관리

Docker , Maven, npm 등등..

해당 아키텍처의 목표

Infra Engineer 할일

  • 권한설정
  • stg,prd 환경 GKE생성
  • Source Repository에 소스코드 저장
  • APP Container 를 Artifact Registry 저장
  • GitHub Repostiry에 Cloud Build 트리거 설정
  • Cloud Deploy로 배포 파이프라인 및 대상 설정(stg,prd)

Developer 할일

  • App 변경
  • 개발자 작업 공간내에서 작업
  • 변경사항 빌드 및 테스트

사용하는 API

필요한 역할(IAM) 만 뽑아서 정리

default-computeEngine 서비스계정이 Cloud Build와 Cloud Deploy에서 Compute Engine 서비스를 사용할 수 있는지에 대한 권한

clouddeploy : https://cloud.google.com/deploy/docs/iam-roles-permissions?hl=ko#predefined_roles

roles/clouddeploy.jobRunner

Cloud Build 서비스 계정에 Cloud Deploy를 사용하여 배포를 호출하고 배포 파이프라인 및 대상 정의를 업데이트 할수 있는 권한

clouddeploy : https://cloud.google.com/deploy/docs/iam-roles-permissions?hl=ko#predefined_roles

roles/clouddeploy.operator

Cloud Build 및 Cloud Deploy 서비스계정이 GKE에 배포 할 수 있는 권한

container.admin : https://cloud.google.com/iam/docs/understanding-roles?hl=ko#kubernetes-engine-roles

roles/container.admin

Cloud Build 서비스 계정에 Cloud Deploy 작업을 호출하는데 있어 필요한 권한

iam.serviceAccountUser : https://cloud.google.com/compute/docs/access/iam?hl=ko#the_serviceaccountuser_role

roles/iam.serviceAccountUser

테스트

1. GKE 준비 및 Sample 파일 Cloud Shell로 복사

GKE (Prod, Staging) 2가지환경 준비

Git에 있는 Sample 파일 Cloud Shell로 오픈

cloudshell_open --repo_url "https://github.com/google/golden-path-for-app-delivery" --page "editor" --open_in_editor "README.md" --git_branch "main" --force_new_clone

2. Cloud Source Repository 준비

생성

gcloud source repos create cicd-sample

Repository ‘cicd-sample’ 로 설정

git remote add google https://source.developers.google.com/p/$(gcloud config get-value project)/r/cicd-sample

Source Repository로 Push

git push --all google

3. Artifact Registry 이미지 저장소 생성

gcloud artifacts repositories create cicd-sample-repo \
    --repository-format=Docker \
    --location us-central1

4. 운영자가 해야할 CI/CD 파이프라인 생성

Application 운영자로서 CI/CD 파이프라인 생성을 목표로 함

CI 에는 Cloud Build 가 사용되며 CD 에 Cloud Deploy 사용할 예정

Cloud Build용 GCS를 만들어 artifacts.json 파일 저장

해당 파일을 이용하여 각 빌드에서 Skaffold로 생성된 아티팩트를 추적

#GCS 생성
gsutil mb gs://$(gcloud config get-value project)-gceme-artifacts/

해당 Sample Dir 에 cloudbuild.yaml 이라고 Cloud Build 트리거를 정의하는 파일이 있음

substitutions:
  _REGION: us-central1
steps:
- name: 'gcr.io/k8s-skaffold/skaffold'
  entrypoint: 'sh'
  args:
  - -xe
  - -c
  - |
    # Build and push images
    skaffold build --file-output=/workspace/artifacts.json \
                   --default-repo=${_REGION}-docker.pkg.dev/$PROJECT_ID/cicd-sample-repo \
                   --push=true

    # Test images
    skaffold test --build-artifacts=/workspace/artifacts.json

- name: 'google/cloud-sdk:latest'
  entrypoint: 'sh'
  args:
  - -xe
  - -c
  - |
    gcloud config set deploy/region ${_REGION}
    sed -i s/PROJECT_ID/$PROJECT_ID/g deploy/*
    gcloud deploy apply --file deploy/pipeline.yaml
    gcloud deploy apply --file deploy/staging.yaml
    gcloud deploy apply --file deploy/prod.yaml
    gcloud deploy releases create rel-${SHORT_SHA} \
                        --delivery-pipeline cicd-sample \
                        --description "$(git log -1  --pretty='%s')" \
                        --build-artifacts /workspace/artifacts.json \
                        --annotations "commit_ui=https://source.cloud.google.com/$PROJECT_ID/cicd-sample/+/$COMMIT_SHA"
artifacts:
  objects:
    location: 'gs://$PROJECT_ID-gceme-artifacts/'
    paths:
    - '/workspace/artifacts.json'
options:
  machineType: E2_HIGHCPU_8
timeout: 3600s

설명

  • Cloud Build 에서 Skaffold를 사용하여 App Container 빌드
  • Cloud Build가 빌드의 artifacts.json 파일을 Cloud Storage 에 생성
  • Cloud Build를 통해 Application Container을 Artifact Registry 생성
  • Cloud Build 에서 Applcation Container Test
  • gcloud beta deploy apply 명령어를 통해 Cloud Deploy 서비스 등록
    • 배포 파이프라인
    • # Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: cicd-sample labels: app: cicd-sample description: cicd-sample delivery pipeline serialPipeline: stages: - targetId: staging profiles: - staging - targetId: prod profiles: - prod
    • 대상 파일들
    • # prod.yaml apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod annotations: {} labels: {} description: prod requireApproval: true gke: cluster: projects/msw-cicd-test/locations/us-central1/clusters/prod # staging.yaml apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: staging annotations: {} labels: {} description: staging gke: cluster: projects/msw-cicd-test/locations/us-central1/clusters/staging

Cloud Build 트리거 생성

gcloud beta builds triggers create cloud-source-repositories \
    --name="cicd-sample-main" \
    --repo="cicd-sample" \
    --branch-pattern="main" \
    --build-config="cloudbuild.yaml"

Cloud Build 에 Source Repository를 감시하면서 ‘cloudbuild.yaml’ 파일을 사용해서 저장소 변경사항에 대응하도록 지정, 트리거는 새 푸시가 시행될 떄마다 호출


5. 개발자 작업공간 내에서 Application 변경

지금까지는 운영자 입장에서 CI/CD 구축한 내용이고 개발자 입장에서 Apllcation을 변경하여 어떻게 배포하는지 Test

  • 애플리케이션을 변경합니다.
  • 새 코드를 빌드하고 테스트합니다.
  • minikube 클러스터에 애플리케이션을 배포하고 사용자 대면 변경사항을 확인합니다.
  • 기본 저장소에 변경사항을 제출합니다.

ide.cloud.google.com

Cloud Shell 편집기 접근

Cloud Shell에서 ‘Minikube 실행’

minikube start

좌측하단 Cloud Code 클릭하여 ‘Run On Kubernetes’ 를 하여 Local환경에서 Test 진행

Application 진행상황 및 완료, 그리고 Skaffold의 Output 으로 확인 가능

Cloud Build Trriger 설정으로 Text만 바꿔 저장시 검사하여 바로 재배포 시작함

변경 된 것 Commit하기

git add .
git commit -m "use lowercase for: sample app info"

6.프로덕션에 변경 사항 배포

지금까지는 Local 환경에서 배포하여 테스트를 하였고 이제

기존 만든 GKE(Staging, Prod) 환경으로 테스트

  • Staging 환경에 릴리즈 배포하는 CI/CD 파이프라인을 트리거
  • Prod 환경으로 릴리스를 승격하고 승인

수정된 파일 Source Repository로 Push

git push google

Cloud Build 에서 확인

0단계는 파이프라인의 CI 단계로써

skaffold build 및 test 에 대한 출력을 보여주고

1단계에서 CD단계로 배포가 실행되었습니다.

또한 Cloud Deploy 에서 확인을 해보면

Staging 환경에는 배포가 되었지만 Prod 환경에는 배포가 되지 않았음

Staging 환경에 제대로 배포되었는지 확인

# 포트포워딩
kubectl proxy --port 8001 --context gke_$(gcloud config get-value project)_us-central1_staging

# 카운트 증가하는지확인
curl -s http://localhost:8001/api/v1/namespaces/default/services/cicd-sample:8080/proxy/ | grep -A 1 Counter

정상적으로 배포되었으니 이제 Prod 환경으로 배포

그림에 있는 Promote 클릭 후 실행

Review 클릭

완료

 

 

삭제시 명령어

Cloud Deploy

gcloud deploy delivery-pipelines delete cicd-sample --region=us-central1 --force

Cloud Build 트리거

gcloud beta builds triggers delete cicd-sample-main

GKE

gcloud container clusters delete staging
gcloud container clusters delete prod

Source Repository

gcloud source repos delete cicd-sample

Bucket

gsutil rm -r gs://$(gcloud config get-value project)-gceme-artifacts/

gsutil rm -r gs://$(gcloud config get-value project)_clouddeploy/

Artifact Registry

gcloud artifacts repositories delete cicd-sample-repo \
    --location us-central1
반응형