✔️ 실습에 앞서
이번 실습에서는 Jenkins와 함께 kubernetes 엔진에 지속적인 전달 파이프라인을 설정하는 방법을 배울 것이다.
Jenkins는 공유 저장소에 코드를 자주 통합하는 개발자들이 사용하는 자동 서버이다.
실습을 통해 구축하는 솔루션은 다음과 같다.
✔️ 실습 목표
- Kubernetes 엔진 클러스터에 Jenkins 어플리케이션 프로비저닝
- Helm Package Manager를 통해 Jenkins 어플리케이션 설정하기
- Jenkins 어플리케이션의 기능 학습
- Jenkins 파이프라인 생성 및 연습
✔️ Jenkins란 ? (간단하게)
Jenkins는 빌드, 테스트 및 배포 파이프라인을 유연하게 조정할 수 있는 오픈소스 자동화 서버이다.
Jenkins는 개발자들이 지속적인 제공으로 인해 발생할 수 있는 오버헤드 문제를 걱정하지 않고 프로젝트를 빠르게 반복할 수 있도록 지원한다.
📌 CI/CD란 ?
CD(Continuous Delivery) 파이프라인을 설정해야 하는 경우 Kubernetes Engine에 Jenkins를 구축하면 표준 VM 기반 구축에 비해 중요한 이점을 얻을 수 있다.
빌드 프로세스가 컨테이너를 사용하는 경우 가상 호스트 하나가 여러 운영 체제에서 작업을 실행할 수 있다.
Kubernetes Engine은 ephemeral build executors를 제공한다.
이러한 빌드 실행자는 빌드가 활성화되어 있을 때만 사용되므로 배치 처리 작업과 같은 다른 클러스터 태스크에 리소스가 남는다. ephemeral build executors의 또 다른 이점은 속도이다. 몇 초 만에 실행이 가능하다.
또한 Kubernetes Engine에는 Google의 글로벌 로드 밸런서가 미리 장착되어 있으며, 이를 사용하여 인스턴스에 대한 웹 트래픽 라우팅을 자동화할 수 있다.
로드 밸런서는 SSL 종료를 처리하고 Google의 백본 네트워크로 구성된 글로벌 IP 주소를 사용한다.(웹 프런트와의 조합).
이 로드 밸런서는 항상 사용자를 애플리케이션 인스턴스로의 가능한 가장 빠른 경로로 설정한다.
✔️ Provisioning Jenkins
✔️Creating a Kubernetes cluster
k8s 클러스터를 준비하기 위해 다음 명령을 실행한다.
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"
클러스터가 작동 중인지 확인해보자
gcloud container clusters list
클러스터에 대한 자격 증명을 가져오자
gcloud container clusters get-credentials jenkins-cd
k8s engine은 이러한 credential을 사용해 새로 프로비저닝된 클러스터에 액세스한다.
클러스터에 연결할 수 있는지 확인한다.
kubectl cluster-info
✔️ Setup Helm
이번 실습에서 Helm을 사용해 차트 저장소에서 젠킨스를 설치한다.
Helm은 k8s 응용 프로그램을 쉽게 구성하고 전개할 수 있는 패키지 매니저이다.
Jenkins를 설치하면 CI/CD 파이프라인을 설정할 수 있다.
1. Helm의 안전한 차트 레포지토리를 추가한다.
helm repo add jenkins https://charts.jenkins.io
2. repo가 최신인지 확인한다.
helm repo update
✔️ Configure and Install Jenkins
Jenkins를 설치할 때 value 파일을 템플릿으로 사용하여 설정에 필요한 값을 제공할 수 있다.
custom value 파일을 사용하여 Kubernetes Cloud를 자동으로 구성하고 다음과 같은 필요한 플러그인을 추가한다.
Kubernetes: 1.29.4
Workflow-multibranch: 최신
Git: 4.7.1
코드로서의 설정: 1.51
Google-oauth-plugin: 최신
Google 소스 플러그인: 최신
Google 스토리지 플러그인: 최신
그러면 Jenkins가 클러스터 및 GCP 프로젝트에 연결할 수 있다.
1. custom value 파일을 다운로드한다.
gsutil cp gs://spls/gsp330/values.yaml jenkins/values.yaml
2. Helm CLI를 사용해 차트를 구성 설정과 함께 배포한다.
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait
3. 명령이 완료되면 Jenkins 포드가 Running 상태가 되고 컨테이너가 READY 상태가 되는지 확인한다.
kubectl get pods
4. 클러스터에 배포할 수 있는 Jenkins 서비스 계정을 구성한다.
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins
5. Cloud Shell에서 Jenkins UI로 포트 포워딩을 설정한다.
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 &
6. 이제 Jenkins 서비스가 제대로 생성되었는지 확인한다.
kubectl get svc
Jenkins 마스터가 요청할 때 필요에 따라 빌드 노드가 자동으로 실행되도록 Kubernetes 플러그인을 사용하고 있다.
작업이 완료되면 자동으로 종료되고 리소스가 클러스터 리소스 풀에 추가된다.
이 서비스는 셀렉터와 일치하는 모든 포드에 대해 포트 8080 및 50000을 제공한다.
그러면 Kubernetes 클러스터 내의 Jenkins 웹 UI 및 빌더/에이전트 등록 포트가 노출된다.
또한 jenkins-ui 서비스는 클러스터 IP를 사용하여 공개된다. 클러스터 외부에서 액세스할 수 없도록 하기위함이다.
✔️ Connect to Jenkins
1. Jenkins 차트는 자동으로 사용자를 위한 관리자 암호를 생성한다. 검색하려면 다음을 수행한다.
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
2. Jenkins 사용자 인터페이스에 접속하려면 클라우드 셸에서 Web Preview 버튼을 클릭한 다음 Preview on Port 8080:을 클릭한다.
3. 이제 사용자 이름 admin과 자동 생성된 비밀번호를 사용하여 로그인할 수 있다.
이제 Jenkins가 Kubernetes 클러스터에 설정되었다. Jenkins가 다음 섹션에서 자동 CI/CD 파이프라인을 구동할 것이다.
✔️ Understanding the Application
샘플 어플리케이션 gceme를 지속적인 배포 파이프라인에 배포한다.
응용 프로그램은 Go 언어로 작성되며 repo의 샘플 앱 디렉토리에 있다.
컴퓨팅 엔진 인스턴스에서 gceme 바이너리를 실행하면 앱은 인스턴스의 메타데이터를 정보 카드에 표시한다.
이 애플리케이션은 두 가지 동작 모드를 지원함으로써 마이크로 서비스를 모방한다.
- 백엔드 모드에서는 gceme는 포트 8080을 리슨하고 JSON 형식으로 Compute Engine 인스턴스 메타데이터를 반환한다.
- 프런트 엔드 모드에서: gceme는 백엔드 gceme 서비스를 쿼리하고 생성된 JSON을 사용자 인터페이스에 렌더링한다.
✔️ Deploying the Application
애플리케이션을 다음의 2개의 다른 환경에 배포한다.
- Production : 사용자가 액세스하는 라이브 사이트이다.
- Canary : 사용자 트래픽의 일부만 수신하는 더 작은 용량의 사이트이다. 이 환경을 사용하여 소프트웨어가 모든 사용자에게 릴리스되기 전에 라이브 트래픽으로 소프트웨어를 검증한다.
Google Cloud Shell에서 샘플 응용프로그램 디렉토리로 이동한다.
cd sample-app
deployment와 논리적으로 분리된 k8s namespace를 생성한다.
kubectl create ns production
kubectl apply 명령을 사용하여 production, 카나리 디플로이먼트 및 서비스를 만든다.
kubectl apply -f k8s/production -n production
kubectl apply -f k8s/canary -n production
kubectl apply -f k8s/services -n production
기본적으로 frontend의 복제본은 하나만 배포된다. 항상 최소 4개의 replicas가 실행 중인지 확인하기 위해 kubectl scale 명령을 사용한다.
다음 명령을 실행하여 운영 환경의 프런트엔드를 확장한다.
kubectl scale deployment gceme-frontend-production -n production --replicas 4
frontend에 대한 5개의 포드, 프로덕션 트래픽용 4개 및 카나리 릴리스용 1개가 실행되고 있는지 확인한다.(카나리 릴리스 변경은 사용자 5명 중 1명(20%)만 해당).
kubectl get pods -n production -l app=gceme -l role=frontend
또한 백엔드에 2개의 파드가 있는지 확인한다. 하나는 실가동용, 1개는 카나리용이다.
kubectl get pods -n production -l app=gceme -l role=backend
운영 서비스의 외부 IP를 검색한다.
kubectl get service gceme-frontend -n production
브라우저에 외부 IP를 붙여넣어 카드에 표시되는 정보 카드를 확인한다.
이제 프런트 엔드 서비스 로드 밸런서 IP를 나중에 사용할 수 있도록 환경 변수에 저장한다.
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
브라우저에서 프런트엔드의 외부 IP 주소를 열어 두 서비스가 모두 동작하고 있는지 확인한다.
다음 명령어를 실행하여 서비스의 버전 출력을 확인한다. (1.0.0으로 표시될 것이다.)
curl http://$FRONTEND_SERVICE_IP/version
샘플 어플리케이션을 성공적으로 배포했다!
다음으로 변경을 지속적이고 안정적으로 전개하기 위한 파이프라인을 설정해볼 것이다.
'Study > Study Jam' 카테고리의 다른 글
[Study Jam] Terraform Fundamentals (0) | 2022.03.27 |
---|---|
[Study Jam] Continuous Delivery with Jenkins in Kubernetes Engine - 2 (0) | 2022.03.25 |
[Study Jam] Managing Deployments Using Kubernetes Engine - 2 (0) | 2022.03.24 |
[Study Jam] Managing Deployments Using Kubernetes Engine - 1 (0) | 2022.03.24 |
[Study Jam] Introduce to Docker (도커 입문) - 2. Debug, Publish (0) | 2022.03.24 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!