Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

JINIers

[PCK] Continuous Delivery Pipelines with Spinnaker and Kubernetes Engine lab 본문

GCP/Qwiklabs

[PCK] Continuous Delivery Pipelines with Spinnaker and Kubernetes Engine lab

JINIers 2022. 2. 7. 17:11

Spinnaker 및 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 클릭

5. spinnaker UI 액세스


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 복사 > 새탭에 붙여넣기 > 확인

 

7. 배포 파이프라인 구성 : 파이프라인 수동으로 트리거 및 보기

 

 

7. 파이프라인 배포 구성

 

 

 

 


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                                    // 버전태그 푸시

이전버전(노란색) 확인가능

 

Comments