JINIers
[PCK] Continuous Delivery Pipelines with Spinnaker and Kubernetes Engine lab 본문
[PCK] Continuous Delivery Pipelines with Spinnaker and Kubernetes Engine lab
JINIers 2022. 2. 7. 17:11Spinnaker 및 Kubernetes Engine을 사용한 지속적 배포 파이프라인
목 표
- Google Cloud Shell 을 시작 하고 Kubernetes Engine 클러스터를 만들고 ID 및 사용자 관리 체계를 구성하여 환경을 설정
- 샘플 애플리케이션을 다운로드하고 Git 저장소를 만든 다음 Google Cloud Source Repository에 업로드
- Helm 을 사용하여 Kubernetes Engine에 Spinnaker 배포
- Docker 이미지를 빌드
- 애플리케이션이 변경될 때 Docker 이미지를 생성하는 트리거 생성
- 애플리케이션을 Kubernetes Engine에 안정적이고 지속적으로 배포하도록 Spinnaker 파이프라인 구성
- 코드 변경을 배포하고 파이프라인을 트리거하고 프로덕션으로 롤아웃
3. 환경설정
gcloud config set compute/zone us-central1-f // 기본 컴퓨팅 영역 설정
gcloud container clusters create spinnaker-tutorial \ // spinnaker 튜토리얼 샘플 이용 클러스터 작성
--machine-type=n1-standard-2
[id 및 액세스 관리 구성]
gcloud iam service-accounts create spinnaker-account \ // 서비스 계정 만들기
--display-name spinnaker-account
[환경변수 저장]
export SA_EMAIL=$(gcloud iam service-accounts list \
--filter="displayName:spinnaker-account" \
--format='value(email)')
export PROJECT=$(gcloud info --format='value(config.project)')
gcloud projects add-iam-policy-binding $PROJECT \ // storage.admin 역할 -> 서비스 계정에 바인딩
--role roles/storage.admin \
--member serviceAccount:$SA_EMAIL
gcloud iam service-accounts keys create spinnaker-sa.json \ // 서비스계정 키 다운로드
--iam-account $SA_EMAIL
4. Spinnaker 파이프라인을 트리거하도록 cloud pub/sub 설정
gcloud pubsub topics create projects/$PROJECT/topics/gcr // container registry의 알림을 위한 cloud pub/sub 주제 만듦
gcloud pubsub subscriptions create gcr-triggers \ // spinnaker가 푸시중인 이미지에 대한 알림을 수신할 수 있는 구독 생성
--topic projects/${PROJECT}/topics/gcr
export SA_EMAIL=$(gcloud iam service-accounts list \ // gcr-triggers 구독에서 읽을 수 있는 권한부여
--filter="displayName:spinnaker-account" \
--format='value(email)')
gcloud beta pubsub subscriptions add-iam-policy-binding gcr-triggers \
--role roles/pubsub.subscriber --member serviceAccount:$SA_EMAIL
5. helm을 사용하여 spinnaker 배포
[투구구성????]
kubectl create clusterrolebinding user-admin-binding \ // helm에 클러스터 관리자 역할 부여
--clusterrole=cluster-admin --user=$(gcloud config get-value account)
kubectl create clusterrolebinding --clusterrole=cluster-admin \ // cluseter-admin 모든 네임스페이스에 리소스를 배포할 수 잇도록 역할 부여
--serviceaccount=default:default spinnaker-admin
helm repo add stable https://charts.helm.sh/stable // 사용가능한 리포지토리에 차트 배포 추가
helm repo update // helm 리포지토리 업데이트
[spinnaker 구성]
[spinnaker가 파이프라인을 구성을 저장할 버킷 생성]
export PROJECT=$(gcloud info --format='value(config.project)') // 프로젝트 환경변수 저장
export BUCKET=$PROJECT-spinnaker-config // 버킷 환경변수 저장
gsutil mb -c regional -l us-central1 gs://$BUCKET // 버킷 생성(gsutil mb = 버킷 생성 명령어)
[spinnaker-config.yaml Helm에서 spinnaker를 설치하는 방법을 설명하는 파일 생성]
export SA_JSON=$(cat spinnaker-sa.json)
export PROJECT=$(gcloud info --format='value(config.project)')
export BUCKET=$PROJECT-spinnaker-config
cat > spinnaker-config.yaml <<EOF
gcs:
enabled: true
bucket: $BUCKET
project: $PROJECT
jsonKey: '$SA_JSON'
dockerRegistries:
- name: gcr
address: https://gcr.io
username: _json_key
password: '$SA_JSON'
email: 1234@5678.com
# Disable minio as the default storage backend
minio:
enabled: false
# Configure Spinnaker to enable GCP services
halyard:
spinnakerVersion: 1.19.4
image:
repository: us-docker.pkg.dev/spinnaker-community/docker/halyard
tag: 1.32.0
pullSecrets: []
additionalScripts:
create: true
data:
enable_gcs_artifacts.sh: |-
\$HAL_COMMAND config artifact gcs account add gcs-$PROJECT --json-path /opt/gcs/key.json
\$HAL_COMMAND config artifact gcs enable
enable_pubsub_triggers.sh: |-
\$HAL_COMMAND config pubsub google enable
\$HAL_COMMAND config pubsub google subscription add gcr-triggers \
--subscription-name gcr-triggers \
--json-path /opt/gcs/key.json \
--project $PROJECT \
--message-format GCR
EOF
[spinnaker 차트 배포]
helm install -n default cd stable/spinnaker -f spinnaker-config.yaml --version 2.0.0-rc9 --timeout 10m0s --wait
// 차트 배포
export DECK_POD=$(kubectl get pods --namespace default -l "cluster=spin-deck" -o jsonpath="{.items[0].metadata.name}") // 포트 전달 환경변수 설정
kubectl port-forward --namespace default $DECK_POD 8080:9000 >> /dev/null &
// spinnaker로의 포트 전달 설정
웹 미리보기 아이콘 > preview on port 8080 클릭
6. 도커 이미지 빌드
[소스코드 저장소 만들기]
gsutil -m cp -r gs://spls/gsp114/sample-app.tar . // 샘플 어플리케이션 소스코드 다운로드
mkdir sample-app
tar xvf sample-app.tar -C ./sample-app // 소스코드 압축 풀기
cd sample-app
git config --global user.email "$(gcloud config get-value core/account)"
// git 커밋에 대한 사용자 이름과 이메일 주소 설정
git config --global user.name "song(여기변경)" // 유저 이름 변경후 컨피그
git init // 초기화
git add . // 추가
git commit -m "Initial commit" // 초기 커밋
gcloud source repos create sample-app // 리포지토리 생성
git config credential.helper gcloud.sh & // git 컨피그
export PROJECT=$(gcloud info --format='value(config.project)') // 리포지토리 원격 추가(변수 저장)
git remote add origin https://source.developers.google.com/p/$PROJECT/r/sample-app // 원격 추가
git push origin master // 리포지토리 마스터분기에 코드 푸시
웹콘솔 > source repositories > sample-app 클릭 >
[빌드 트리거 구성]
cloud build > triggers > create trigger > 구글에서 준 대로 설정
Name: sample-app-tags
Event: Push new tag
Select your newly created sample-app repository.
Tag: v1.*
Configuration: Cloud Build configuration file (yaml or json)
Cloud Build configuration file location: /cloudbuild.yaml
[spinnaker에서 사용할 kubernetes 매니페스트 준비]
export PROJECT=$(gcloud info --format='value(config.project)') // 변수 생성
gsutil mb -l us-central1 gs://$PROJECT-kubernetes-manifests // 버킷 생성
gsutil versioning set on gs://$PROJECT-kubernetes-manifests // 버전관리 활성화
sed -i s/PROJECT/$PROJECT/g k8s/deployments/*
// 쿠버네티스 배포 매니페스트에서 올바른 프로젝트 Id 설정
git commit -a -m "Set project ID" // 변경사항 리포지토리에 커밋
[이미지 구축]
git tag v1.0.0 // sample-app 디렉터리에서 git 태그 생성
git push --tags // 태그 푸시
cloud build > history > 트리거 올바르게 구성 되었는지 확인
* 빌드 실패 시 빌드 id 클릭 > retry
7. 배포 파이프라인 구성
[spinnaker 관리를 위한 spin CLI 설치]
curl -LO https://storage.googleapis.com/spinnaker-artifacts/spin/1.14.0/linux/amd64/spin // spin 다운로드
chmod +x spin // 스핀 실행가능하게 만들기
[배포 파이프라인 만들기]
./spin application save --application-name sample \ // spinnaker에서 앱 소유자 이메일 주소 설정
--owner-email "$(gcloud config get-value core/account)" \
--cloud-providers kubernetes \
--gate-endpoint http://localhost:8080/gate
export PROJECT=$(gcloud info --format='value(config.project)') // 예제 파이프라인 업로드(-> spinnaker 인스턴스)
sed s/PROJECT/$PROJECT/g spinnaker/pipeline-deploy.json > pipeline.json
./spin pipeline save --gate-endpoint http://localhost:8080/gate -f pipeline.json
[파이프라인 실행 : 수동으로 트리거 및 보기]
spinnaker 홈페이지 > applications > sample 확인 > sample 클릭 > 파이프라인 > start manual execution > 파이프라인 트리거
테스트 완료 > deploy to production : continue > infrastructure : load balancers > service sample-frontend-production 클릭 > ingress ip 복사 > 새탭에 붙여넣기 > 확인
8. 코드 변경에서 파이프라인 트리거
sed -i 's/orange/blue/g' cmd/gke-info/common-service.go // sapmple-all 디랙토리에서 앱 색상 변경(주황 -> 블루)
git commit -a -m "Change color to blue" // 변경사항 커밋
git tag v1.0.1 // 변경사항 태그지정
git push --tags // 태그 푸시
콘솔 > cloud build > history > 빌드 시도
* 안되면 재시도
9. 카나리아 배포 관찰
새로고침 5번 시도 -> 새로운 파란 버전의 앱 표시되어야함
* 백앤드 중 4개에서 이전버전 앱 실행, 1개 : 카나리아 실행
버전 필드 : canary 표시 확인
git revert v1.0.1 // 버전 롤백
ctrl+O -> 엔터 -> ctrl+X
git tag v1.0.2 // 버전 태그
git push --tags // 버전태그 푸시
이전버전(노란색) 확인가능
끝
'GCP > Qwiklabs' 카테고리의 다른 글
[PCK] PCA Prep - Google Cloud Essential Skills : Challenge Lab (0) | 2022.02.09 |
---|---|
[PCK] Troubleshooting Workloads on GKE for Site Reliability Engineers (0) | 2022.02.07 |
[PCK] Deploying Apps to Google Cloud lab (0) | 2022.02.04 |
[PCK] Building a DevOps Pipeline lab (0) | 2022.02.03 |
[PCK] Configuring an Internal Load Balancer lab(내부 로드밸런서 구성) (0) | 2022.02.03 |