코드 통합이나 환경문제를 해결하는데 도움을 줍니다. 예로 기존 팀에 새로운 개발자가 들어왔을때 source code에 경우는 git hub같은 저장소를 활용하여 가져올 순 있겠지만 개발 환경을 통일하지 않으면 버전에 따른 문제가 발생할 확률이 높기 때문에 주의해야 하지만 컨테이너에 경우 서비스가 돌아가는데 필요한 Library 들을 전부 포함해, Container Image 라는 형식으로 사용할 수 있다.
it 업계에서 유명한 짤 : 내 컴퓨터에는 문제 없는데?
개별 서비스 확장에 유리하다. VM서버에 경우에도 확장이 가능하지만 어떤 특정 모듈만 확장하는게 힘들다. 모듈A에 부하가 생길경우 부하 해결을 위해 VM서버가 하나 더 생성하게 된다. 쿠버네티스의 경우 서비스별 컨테이너를 pod 형태로 관리 할 수 있기 때문에 서비스를 모듈별로 관리 하여 개발할 때 특정 모듈만 늘리고 줄이고가 가능하다.
기존의 소프트웨어 출시는 버그 발견 위험이나 막상 로컬 환경에서 문제 없이 돌아가다배포 버전 출시를 앞두고 사람이 실수를 하거나 환경차이, 버전문제로 인한 버그가 발생해 원점으로 돌아 가는 상황이 발생이 가능하다.
그러한 위험성을 배제 하기 위해서 (코드 -> 빌드 -> 테스트) 과정을 자동화하여 자주 배포 하고 테스트를 통해 실제로 문제가 있으면 알려주는 방식을 통해 코드 변경을 수월하게 끔 하는게 CI(Continuous Integration)
소프트웨어 출시 이후에도 시장에 지속적인 개선 제공을 위한 모델이 지속적인 배포와 릴리스 간격단축을 통해 버전관리를 담당하는 부분이 지속적 통합(Continuous Deployment) 또는 지속적 전달(Continuous delivery)이라고 하며 합쳐 CI/CD 파이프 모델이라고 할 수 있습니다.
CI/CD 파이프 라인에 장점
이 시스템 아키텍처 장점
비용이 청구될 수 있는 리소스.
Cloud Build - 매일 빌드 시간 120분이 무료로 제공
Google Cloud Deploy - pipeline 하나는 무료
Artifact Registry - 100GB =14,300
Google Kubernetes Engine - e2-midum bookdisk100GB *2 = 280,000
Cloud Source Repositories - 100GB = 7200
Cloud Storage - 1TB =28,000
1month 329,500, 1year 3,954,000
GCP 요금 계산기
https://cloud.google.com/products/calculator?hl=ko
프로젝트 연결
gcloud config set project chchoi-project
필요한 API 설정 (Artifact Registry, Cloud Build, Google Cloud Deploy,
Cloud Source Repositories, Google Kubernetes Engine, Resource Manager, Service Networking API)
gcloud services enable artifactregistry.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable clouddeploy.googleapis.com
gcloud services enable sourcerepo.googleapis.com
gcloud services enable container.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable servicenetworking.googleapis.com
service account 필요한 권한 부여 (CI/CD 파이프라인에 필요한 권한)
gcloud projects add-iam-policy-binding chchoi-project \
--member=serviceAccount:$(gcloud projects describe chchoi-project \
--format="value(projectNumber)")-compute@developer.gserviceaccount.com \
--role="roles/clouddeploy.jobRunner"
gcloud projects add-iam-policy-binding chchoi-project\
--member=serviceAccount:$(gcloud projects describe chchoi-project\
--format="value(projectNumber)")@cloudbuild.gserviceaccount.com \
--role="roles/clouddeploy.operator"
gcloud projects add-iam-policy-binding chchoi-project \
--member=serviceAccount:$(gcloud projects describe chchoi-project \
--format="value(projectNumber)")-compute@developer.gserviceaccount.com \
--role="roles/container.admin"
엣지 컨테이너?
대기 시간을 줄이고 대역폭을 절약하며 전반적인 디지털 경험을 향상시키기 위해 최종 사용자와 최대한 가까운 곳에 위치한 분산 컴퓨팅 리소스
gcloud projects add-iam-policy-binding chchoi-project \
--member=serviceAccount:$(gcloud projects describe chchoi-project\
--format="value(projectNumber)")@cloudbuild.gserviceaccount.com \
--role="roles/iam.serviceAccountUser"
gcloud container clusters create-auto staging \
--region us-central1 \
--project=$(gcloud config get-value project) \
--async
gcloud container clusters create-auto prod \
--region us-central1 \
--project=$(gcloud config get-value project) \
--async
staging -> product 환경을 구분하는 이유?
staging과 product는 모든 조건을 동일하게 만들어 staging에 문제 없이 배포 가능하면 product 환경에서 동일하게 실행 가능하게끔 구성하게 됨. 버전이 바뀔 때마다 먼저 staging 환경에서 테스트해보고 안정성이 높은 버전을 출시하기 위함. 또 버전 기록이 남기 때문에 혹시나 문제가 생겨도 롤백이 간편함.
git clone https://github.com/google/golden-path-for-app-delivery.git
CSR 생성
gcloud source repos create cicd-sample
CSR이란?
Google Cloud Platform에서 Github또는 Bitbucketd을 호스팅하여 관리 할 수 있는 Google에 클라우드 코드 플랫폼
레포지토리 연결
sed -i s/project-id-placeholder/$(gcloud config get-value project)/g deploy/*
git config --global credential.https://source.developers.google.com.helper gcloud.sh
git remote add google https://source.developers.google.com/p/$(gcloud config get-value project)/r/cicd-sample
code push
git push --all google
gcloud artifacts repositories create cicd-sample-repo \
--repository-format=Docker \
--location us-central1
artifact repo에 보관되는 것?
어떤 버전을 배포 할건지 docker image를 보관
gcloud beta builds triggers create cloud-source-repositories \
--name="cicd-sample-main" \
--repo="cicd-sample" \
--branch-pattern="main" \
--build-config="cloudbuild.yaml"
Bulid Trigger란?
정해진 레포지토리에서 소스코드를 감시하고 조건에 맞춰 (ex.branch에 소스코드가 변경되면, 수동 업데이트) cloud bulid.yaml을 기준으로 순서대로 실행
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란?
특정 트리거에 맞춰 정해진 코드를 순서대로 실행시켜주는 서비스
Artifact?
IT에서 Artifact는 빌드 결과로 나오는 개발 산출물을 Artifact라고 함
배포 패키지, WAR 파일, 로그 및 보고서 등 빌드 프로세스에서 생성된 파일
Skaffold?
Kubenetes용 CD툴
- 어플리케이션 수정으로 반영된 내용이 K8S에 올려서 바로 테스트하고 싶을때 사용
- Helm chart 와 비슷하게 실제 테스팅 또는 프로덕션 환경에 배포 할 수 있음
로컬 환경에서 테스트를 위한 minikube 설치
minikube start
코드 수정 후 디버깅을 돌리면 실제로 코드가 변경된 환경으로 들어가서 확인이 가능.
git repo 설정
git config --global user.email "cks8483@naver.com"
git config --global user.name "cks8483"
git commit
git add .
git commit -m "use lowercase for: sample app info"
Cloud Source Repositories에 git push
git push google
Code build에서 우선 staging 클러스터에 먼저 배포를 진행하여 테스트 이후 이상이 없으면 승격 요청을하고 관리 조직원이 승낙하면 product로 배포.
staging이 문제 없으면 승격 버튼을 눌러서 production에 정식 배포
리소스 삭제
gcloud deploy delivery-pipelines delete cicd-sample --region=us-central1 --force
gcloud beta builds triggers delete cicd-sample-main
gcloud container clusters delete staging --region=us-central1
gcloud container clusters delete prod --region=us-central1
gcloud source repos delete cicd-sample
gsutil rm -r gs://$(gcloud config get-value project)-gceme-artifacts/
gsutil rm -r gs://$(gcloud config get-value project)_clouddeploy/
gcloud artifacts repositories delete cicd-sample-repo \
--location us-central1