728x90

개요

Kubernetes 엔진에서 지속적 전달 파이프라인을 설정하는 방법

  • Kubernetes Engine 클러스터에 Jenkins 애플리케이션 프로비저닝
  • Helm 패키지 관리자를 사용하여 Jenkins 애플리케이션 설정
  • Jenkins 애플리케이션의 기능 살펴보기
  • Jenkins 파이프라인 생성 및 실행

젠킨스란?

Jenkins는 빌드, 테스트 및 배포 파이프라인을 유연하게 오케스트레이션 할 수 있는 오픈 소스 자동화 서버입니다. Jenkins를 사용하면 개발자가 지속적 배포에서 발생할 수 있는 오버헤드 문제에 대해 걱정하지 않고 프로젝트를 빠르게 배포할 수 있습니다.

 

1. Jenkins 프로비저닝

gcloud container clusters create jenkins-cd \
--num-nodes 2 \
--machine-type n1-standard-2 \
--scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform"

Kubernetes 클러스터 만들기위한 명령어입니다.

 

gcloud container clusters list

클러스터가 실행 중인지 확인하는 명령어입니다.

 

gcloud container clusters get-credentials jenkins-cd

클러스터에 대한 자격 증명을 가져옵니다.

 

kubectl cluster-info

Kubernetes Engine은 이러한 자격 증명을 사용하여 새로 프로비저닝 된 클러스터에 액세스 합니다. 위의 명령어를 실행하여 클러스터에 연결할 수 있는지 확인합니다.

 

2. Setup Helm

Helm을 사용하여 Charts 리포지토리에서 Jenkins를 설치합니다. Helm은 Kubernetes 애플리케이션을 쉽게 구성하고 배포할 수 있게 해주는 패키지 관리자입니다. Jenkins가 설치되면 CI/CD 파이프라인을 설정할 수 있습니다.

 

helm repo add jenkins https://charts.jenkins.io
helm repo update

Helm의 차트 저장소 추가하는 명령어입니다.

 

3. Jenkins 구성 및 설치

Jenkins 설치 시 values파일을 템플릿으로 사용하여 설정에 필요한 값을 제공할 수 있습니다.

사용자 지정 values파일을 사용하여 Kubernetes 클라우드를 자동으로 구성하고 다음 필수 플러그인을 추가합니다.

  • Kubernetes:1.29.4
  • Workflow-multibranch:latest
  • Git:4.7.1
  • Configuration-as-code:1.51
  • Google-oauth-plugin:latest
  • Google-source-plugin:latest
  • Google-storage-plugin:latest

이렇게 하면 Jenkins가 클러스터와 GCP 프로젝트에 연결할 수 있습니다.

 

gsutil cp gs://spls/gsp330/values.yaml jenkins/values.yaml
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait

첫 번째 명령어는 values파일을 다운로드 하기 위한 명령어입니다.

두 번째 명령어는 Helm CLI를 사용하여 구성 설정으로 차트를 배포하는 명령어입니다.

 

kubectl get pods
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins

클러스터에 배포할 수 있도록 Jenkins 서비스 계정을 구성합니다.

Jenkins 포드가 Running상태로 전환되고 컨테이너가 READY 상태인지 확인합니다.

export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=cd" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &

위의 명령어를 실행하여 Cloud Shell에서 Jenkins UI로 포트 전달을 설정합니다.

 

kubectl get svc

Jenkins 서비스가 제대로 생성되었는지 확인합니다.

Jenkins 마스터가 요청할 때 빌더 노드가 필요에 따라 자동으로 시작되도록 Kubernetes 플러그인을 사용하고 있습니다. 작업이 완료되면 자동으로 종료되고 리소스가 클러스터 리소스 풀에 다시 추가됩니다.

이 서비스는 셀렉터와 일치하는 모든 포드에 대해 포트 8080 및 50000을 제공합니다. 이렇게 하면 Kubernetes 클러스터 내의 Jenkins 웹 UI 및 Builder/에이전트 등록 포트가 표시됩니다. 또한 jenkins-ui 서비스는 클러스터를 사용하여 노출됩니다.클러스터 외부에서 액세스할 수 없도록 IP를 지정합니다.
 

4. Jenkins에 연결

printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

Jenkins 차트는 자동으로 관리자 암호를 생성합니다. 위의 명령어는 암호를 확인하기 위한 명령어입니다.

 

사용자 이름 admin과 자동 생성된 비밀번호로 로그인할 수 있습니다.

 

성공적으로 로그인이 된걸 확인할 수 있다.

 

6. 애플리케이션 배포

  • 프로덕션 : 사용자가 액세스하는 라이브 사이트입니다.
  • 카나리아 : 사용자 트래픽의 일정 비율만 수신하는 소규모 사이트입니다. 이 환경을 사용하여 모든 사용자에게 릴리스 되기 전에 라이브 트래픽으로 소프트웨어를 검증하십시오.

cd sample-app
kubectl create ns production
kubectl apply -f k8s/production -n production
kubectl apply -f k8s/canary -n production
kubectl apply -f k8s/services -n production

두 번째 명렁어로 배포를 논리적으로 격리하기 위해 Kubernetes 네임스페이스를 만듭니다.

kubectl apply 명령어를 사용하여 프로덕션 및 카나리아 배포와 서비스를 만듭니다.

 

기본적으로 프런트엔드의 복제본은 하나만 배포됩니다. 명령을 사용하여 kubectl scale항상 실행 중인 복제본이 4개 이상 있는지 확인합니다.

kubectl scale deployment gceme-frontend-production -n production --replicas 4
kubectl get pods -n production -l app=gceme -l role=frontend
kubectl get pods -n production -l app=gceme -l role=backend
kubectl get service gceme-frontend -n production

첫 번째 명령어를 실행하여 프로덕션 환경의 프런트엔드를 확장합니다.

이제 두 번째 명령어를 실행하여 프런트엔드용으로 5개의 포드, 프로덕션 트래픽용으로 4개, 카나리아 릴리스용으로 1개가 실행 중인지 확인합니다(카나리아 릴리스에 대한 변경 사항은 사용자 5명 중 1명(20%)에게만 영향을 미침).

세 번째 명령어를 실행하여 백엔드용 포드 2개(프로덕션용 1개, 카나리아용 1개)가 있는지 확인합니다.

네 번째 명령어는 프로덕션 서비스에 대한 외부 IP 검색하는 명령어입니다.

 

외부 IP 를 브라우저에 붙여 넣으면 카드에 표시된 정보 카드를 볼 수 있습니다.

 

export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
curl http://$FRONTEND_SERVICE_IP/version

첫 번째 명령어로 프런트엔드 서비스 로드 밸런서 IP를 나중에 사용할 수 있도록 환경 변수에 저장합니다.

브라우저에서 프런트엔드 외부 IP 주소를 열어 두 서비스가 모두 작동하는지 확인합니다.

curl 명령을 실행하여 서비스의 버전 출력을 확인합니다.

1.0.0 이 정상 출력되는 것을 확인하실 수 있습니다.

 

7. Jenkins 파이프라인 생성

git init
git config credential.helper gcloud.sh
git remote add origin https://source.developers.google.com/p/$DEVSHELL_PROJECT_ID/r/default
git config --global user.email "[EMAIL_ADDRESS]"
git config --global user.name "[USERNAME]"
git add .
git commit -m "Initial commit"
git push origin master

 

Multibranch Pipeline 옵션을 선택하고 확인을 클릭 합니다.

 

Branch Sources에서 소스 추가 를 클릭하고 git 을 선택합니다.

https://source.developers.google.com/p/[PROJECT_ID]/r/default

Project Repository에 위에 URL을 복사해 붙여 넣습니다. 

Credentials에서 이전 단계에서 서비스 계정을 추가할 때 생성한 자격 증명의 이름을 선택합니다.

 

Scan Multibranch Pipeline Triggers 섹션에서,  Periodically if not otherwise run을 선택하고 Interval 값을 1분으로 설정합니다. 이 단계를 완료하면 이라는 작업이 Branch indexing 실행됩니다.이 메타 작업은 저장소의 분기를 식별하고 기존 분기에서 변경 사항이 발생하지 않았는지 확인합니다. 왼쪽 상단의 sample-app을 클릭하면 master작업이 표시됩니다. Jenkins 파이프라인을 성공적으로 생성했습니다.

 

vi Jenkinsfile

REPLACE_WITH_YOUR_PROJECT_ID를 자기 자신의 PROJECT_ID값으로 바꾸고 저장을 해준다.

 

vi html.go

<div class="card blue">의 값을 <div class="card oragne"> 값으로 변경합니다.

 

vi main.go

const version string = "1.0.0"을 const version string = "2.0.0"의 값으로 변경합니다.

밑에 카나리아 릴리스 배포, 프로덕션에 배포는 생략하였습니다. 

 

마지막 과정까지 완료하여서 쿠버네티스 구글 클라우드 과정을 수료하였습니다! 이 후에 쿠버네티스 구글 클라우드 과정의 후기와 느낀 점의 글을 작성하겠습니다!

728x90

+ Recent posts