마짱짱의 지식창고
Cloud Code, Cloud Build, Google Cloud Deploy, GKE를 사용한 앱 개발 및 제공 본문
Cloud Code, Cloud Build, Google Cloud Deploy, GKE를 사용한 앱 개발 및 제공
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 클러스터에 애플리케이션을 배포하고 사용자 대면 변경사항을 확인합니다.
- 기본 저장소에 변경사항을 제출합니다.
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
'Cloud > GCP' 카테고리의 다른 글
[GCP] Apigee X Environment 및 Group 추가 설정 (0) | 2023.01.17 |
---|---|
[GCP] Apigee X 기본개념 및 환경구성 (0) | 2023.01.17 |
[GCP] 리전별 현재 사용 가능한 서비스 목록 및 에러 상황 확인 (0) | 2022.06.28 |
[GCP] HealthCheck를 위한 방화벽 설정 (0) | 2022.06.23 |
[GCP] Local Linux - Source Repositories 연동하여 git 사용 (0) | 2022.01.24 |