arrow_back

Kubernetes Engine에서 Jenkins로 지속적 배포

로그인 가입
지식을 테스트하고 커뮤니티와 공유하기
done
700개 이상의 실무형 실습, 기술 배지, 과정에 액세스

Kubernetes Engine에서 Jenkins로 지속적 배포

실습 1시간 15분 universal_currency_alt 크레딧 5개 show_chart 중급
info 이 실습에는 학습을 지원하는 AI 도구가 통합되어 있을 수 있습니다.
지식을 테스트하고 커뮤니티와 공유하기
done
700개 이상의 실무형 실습, 기술 배지, 과정에 액세스

GSP051

Google Cloud 사용자 주도형 실습

개요

이 실습에서는 Kubernetes Engine에서 Jenkins를 사용하여 지속적 배포 파이프라인을 설정하는 방법을 배우게 됩니다. Jenkins는 공유 저장소에서 코드를 자주 통합하는 개발자가 즐겨 사용하는 자동화 서버입니다. 이 실습에서 빌드할 솔루션은 다음 다이어그램과 유사합니다.

Jenkins 및 Kubernetes 아키텍처

클라우드 아키텍처 센터의 Kubernetes Engine에서 Jenkins 사용하기 문서를 확인하여 Kubernetes에서 Jenkins를 실행하는 방법을 자세히 알아보세요.

학습할 내용

이 실습에서는 다음 작업을 완료하여 Kubernetes에서 Jenkins를 실행하는 방법을 알아봅니다.

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

기본 요건

이 실습은 고급 레벨 실습으로, 이 실습을 시작하기 전에 적어도 셸 프로그래밍, Kubernetes 및 Jenkins의 기본 사항을 숙지해야 합니다. 실습 진도를 따라잡는 데 도움이 될 만한 몇 가지 실습은 다음과 같습니다.

준비가 되면 아래로 스크롤하여 Kubernetes와 Jenkins, 지속적 배포에 관해 자세히 알아보세요.

Kubernetes Engine이란 무엇인가요?

Kubernetes Engine은 컨테이너를 위한 강력한 클러스터 관리자 및 조정 시스템인 Kubernetes의 Google Cloud 호스팅 버전입니다. Kubernetes는 노트북에서 고가용성 다중 노드 클러스터, 가상 머신에서 베어 메탈까지 다양한 환경에서 실행할 수 있는 오픈소스 프로젝트입니다. 앞서 언급했듯이 Kubernetes 앱은 컨테이너로 빌드되었으며, 컨테이너는 실행을 위해 필요한 모든 종속 항목 및 라이브러리와 함께 번들로 제공되는 경량 애플리케이션입니다. 이러한 기본 구조 덕분에 Kubernetes 애플리케이션은 안전하고 가용성이 높으며 빠른 배포가 가능하여 클라우드 개발자에게 이상적인 프레임워크라고 할 수 있습니다.

Jenkins란 무엇인가요?

Jenkins는 빌드, 테스트, 배포 파이프라인을 유연하게 조정할 수 있는 오픈소스 자동화 서버입니다. Jenkins를 사용하면 개발자는 지속적 배포로 인해 발생할 수 있는 오버헤드 문제에 대한 걱정 없이 프로젝트를 신속하게 변경 및 개선할 수 있습니다.

지속적 배포란 무엇인가요?

지속적 배포(CD) 파이프라인을 설정해야 하는 경우 Jenkins를 Kubernetes Engine으로 배포하면 표준 VM 기반 배포 대비 상당한 이점을 얻을 수 있습니다.

빌드 프로세스에서 컨테이너를 사용하는 경우 하나의 가상 호스트로 여러 운영체제에서 작업이 가능합니다. Kubernetes Engine에서는 일시적 빌드 실행자(ephemeral build executors)를 제공하는데, 이 기능은 빌드가 활발하게 실행될 때만 사용되므로 일괄 처리 작업과 같은 다른 클러스터 작업에 사용할 여유 리소스를 확보할 수 있습니다. 일시적 빌드 실행자의 또 다른 이점은 바로 시작하는 데 몇 초밖에 걸리지 않는 속도입니다.

Kubernetes Engine에는 Google의 전역 부하 분산기도 사전 설치되어 있어 인스턴스로의 웹 트래픽 라우팅을 자동화하는 데 사용할 수 있습니다. 부하 분산기에서는 SSL 종료를 처리하고, 웹 프런트엔드와 함께 Google의 백본 네트워크로 구성되는 전역 IP 주소를 활용하며, 사용자가 항상 애플리케이션 인스턴스에 가장 빠른 경로로 액세스할 수 있도록 설정해 줍니다.

Kubernetes, Jenkins 그리고 이 둘이 CD 파이프라인에서 상호작용하는 방식을 알아보았으므로 이제 하나를 빌드해 보겠습니다.

설정 및 요건

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
참고: 계정에 추가 요금이 발생하지 않도록 하려면 개인용 Google Cloud 계정이나 프로젝트가 이미 있어도 이 실습에서는 사용하지 마세요.

실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법

  1. 실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다. 왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.

    • Google Cloud 콘솔 열기 버튼
    • 남은 시간
    • 이 실습에 사용해야 하는 임시 사용자 인증 정보
    • 필요한 경우 실습 진행을 위한 기타 정보
  2. Google Cloud 콘솔 열기를 클릭합니다(Chrome 브라우저를 실행 중인 경우 마우스 오른쪽 버튼으로 클릭하고 시크릿 창에서 링크 열기를 선택합니다).

    실습에서 리소스가 가동되면 다른 탭이 열리고 로그인 페이지가 표시됩니다.

    팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.

    참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
  3. 필요한 경우 아래의 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다.

    {{{user_0.username | "Username"}}}

    실습 세부정보 패널에서도 사용자 이름을 확인할 수 있습니다.

  4. 다음을 클릭합니다.

  5. 아래의 비밀번호를 복사하여 시작하기 대화상자에 붙여넣습니다.

    {{{user_0.password | "Password"}}}

    실습 세부정보 패널에서도 비밀번호를 확인할 수 있습니다.

  6. 다음을 클릭합니다.

    중요: 실습에서 제공하는 사용자 인증 정보를 사용해야 합니다. Google Cloud 계정 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
  7. 이후에 표시되는 페이지를 클릭하여 넘깁니다.

    • 이용약관에 동의합니다.
    • 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
    • 무료 체험판을 신청하지 않습니다.

잠시 후 Google Cloud 콘솔이 이 탭에서 열립니다.

참고: Google Cloud 제품 및 서비스 목록이 있는 메뉴를 보려면 왼쪽 상단의 탐색 메뉴를 클릭합니다. 탐색 메뉴 아이콘

Cloud Shell 활성화

Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다. Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.

  1. Google Cloud 콘솔 상단에서 Cloud Shell 활성화 Cloud Shell 활성화 아이콘를 클릭합니다.

연결되면 사용자 인증이 이미 처리된 것이며 프로젝트가 PROJECT_ID로 설정됩니다. 출력에 이 세션의 PROJECT_ID를 선언하는 줄이 포함됩니다.

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.

  1. (선택사항) 다음 명령어를 사용하여 활성 계정 이름 목록을 표시할 수 있습니다.
gcloud auth list
  1. 승인을 클릭합니다.

  2. 다음과 비슷한 결과가 출력됩니다.

출력:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (선택사항) 다음 명령어를 사용하여 프로젝트 ID 목록을 표시할 수 있습니다.
gcloud config list project

출력:

[core] project = <project_ID>

출력 예시:

[core] project = qwiklabs-gcp-44776a13dea667a6 참고: gcloud 전체 문서는 Google Cloud에서 gcloud CLI 개요 가이드를 참조하세요.

작업 1. 소스 코드 다운로드하기

  1. 설정하려면 Cloud Shell에서 새 세션을 열고 다음 명령어를 실행하여 영역을 (으)로 설정합니다.
gcloud config set compute/zone {{{project_0.default_zone}}}
  1. 그런 다음 실습의 샘플 코드를 복사합니다.
gsutil cp gs://spls/gsp051/continuous-deployment-on-kubernetes.zip . unzip continuous-deployment-on-kubernetes.zip
  1. 그 다음 올바른 디렉터리로 이동합니다.
cd continuous-deployment-on-kubernetes

작업 2. Jenkins 프로비저닝하기

Kubernetes 클러스터 만들기

  1. 이제 다음 명령어를 실행하여 Kubernetes 클러스터를 프로비저닝합니다.
gcloud container clusters create jenkins-cd \ --num-nodes 2 \ --machine-type e2-standard-2 \ --scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform"

이 단계는 완료하는 데 최대 몇 분이 걸릴 수 있습니다. 추가된 scopes 매개변수는 Jenkins가 Cloud Source Repositories 및 Google Container Registry에 액세스할 수 있도록 합니다.

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 실행한 작업을 확인합니다. Kubernetes 클러스터가 생성되면 평가 점수가 표시됩니다.

Kubernetes 클러스터 만들기(영역: )
  1. 계속하기 전에 다음 명령어를 실행하여 클러스터가 실행 중인지 확인합니다.
gcloud container clusters list
  1. 이제 클러스터의 사용자 인증 정보를 가져옵니다.
gcloud container clusters get-credentials jenkins-cd
  1. Kubernetes Engine은 이 사용자 인증 정보를 사용하여 새로 프로비저닝된 클러스터에 액세스합니다. 다음 명령어를 실행하여 연결할 수 있는지 확인합니다.
kubectl cluster-info

작업 3. Helm 설정하기

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

  1. Helm의 안정적인 차트 저장소 추가:
helm repo add jenkins https://charts.jenkins.io
  1. 저장소가 최신 상태인지 확인:
helm repo update

작업 4. Jenkins 구성 및 설치하기

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

커스텀 values 파일을 사용하면 Kubernetes 클라우드를 자동으로 구성하고 다음 필수 플러그인을 추가할 수 있습니다.

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

그러면 Jenkins가 클러스터 및 GCP 프로젝트에 연결할 수 있게 됩니다.

  1. Helm CLI를 사용하여 해당 구성 설정으로 차트를 배포합니다.
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait

이 명령을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 실행한 작업을 확인합니다. Jenkins 차트가 구성되면 평가 점수가 표시됩니다.

Jenkins 구성 및 설치하기
  1. 명령어가 완료되면 Jenkins 포드가 Running 상태이고 컨테이너가 READY 상태인지 확인합니다.
kubectl get pods

출력 예시:

NAME READY STATUS RESTARTS AGE cd-jenkins-7c786475dd-vbhg4 2/2 Running 0 1m
  1. 클러스터에 배포할 수 있도록 Jenkins 서비스 계정을 구성합니다.
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins

다음과 같은 출력이 표시됩니다.

clusterrolebinding.rbac.authorization.k8s.io/jenkins-deploy created
  1. 다음 명령어를 실행하여 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 &
  1. 이제 Jenkins 서비스가 제대로 만들어졌는지 확인합니다.
kubectl get svc

출력 예시:

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE cd-jenkins 10.35.249.67 8080/TCP 3h cd-jenkins-agent 10.35.248.1 50000/TCP 3h kubernetes 10.35.240.1 443/TCP 9h

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

이 서비스에서는 selector와 일치하는 모든 포드가 액세스할 수 있도록 포트 808050000을 노출합니다. 그러면 Kubernetes 클러스터 내의 Jenkins 웹 UI 및 빌더/에이전트 등록 포트가 노출됩니다. 또한 jenkins-ui 서비스는 클러스터 외부에서 액세스할 수 없도록 ClusterIP를 통해 노출됩니다.

작업 5. Jenkins에 연결하기

  1. Jenkins 차트에서는 자동으로 관리자 비밀번호를 만들어 줍니다. 이를 확인하려면 다음을 실행합니다.
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
  1. Jenkins 사용자 인터페이스로 이동하려면 Cloud Shell에서 웹 미리보기 버튼을 클릭한 다음, 포트 8080에서 미리보기를 클릭합니다.

포트 8080에서 미리보기 옵션

  1. 메시지가 표시되면 사용자 이름 admin과 자동 생성된 비밀번호로 로그인합니다.

이제 Kubernetes 클러스터에 Jenkins가 설정되었습니다. 다음 섹션에서는 Jenkins를 활용하여 자동화된 CI/CD 파이프라인을 운용합니다.

작업 6. 애플리케이션 이해하기

지속적 배포 파이프라인에 샘플 애플리케이션 gceme를 배포합니다. 이 애플리케이션은 Go 언어로 작성되었으며 저장소의 sample-app 디렉터리에 있습니다. Compute Engine 인스턴스에서 gceme 바이너리를 실행하면, 앱이 정보 카드에 인스턴스의 메타데이터를 표시합니다.

이 요청 페이지를 처리한 백엔드

이 애플리케이션은 마이크로서비스를 모방하여 두 가지 작동 모드를 지원합니다.

  • 백엔드 모드에서 gceme는 포트 8080을 수신 대기하고 Compute Engine 인스턴스 메타데이터를 JSON 형식으로 반환합니다.
  • 프런트엔드 모드에서 gceme는 백엔드 gceme 서비스를 쿼리하고 결과 JSON을 사용자 인터페이스에서 렌더링합니다.

gceme 아키텍처 다이어그램

작업 7. 애플리케이션 배포하기

애플리케이션을 2개의 다른 환경에 배포합니다.

  • 프로덕션: 사용자가 액세스하는 라이브 사이트입니다.
  • 카나리아: 사용자 트래픽 중 일부만 수용하는 소규모 사이트입니다. 이 환경을 사용하여 실제 트래픽으로 소프트웨어의 이상 유무를 확인한 후 모든 사용자에게 배포합니다.
  1. Google Cloud Shell에서 샘플 애플리케이션 디렉터리로 이동합니다.
cd sample-app
  1. Kubernetes 네임스페이스를 만들어 배포를 논리적으로 격리합니다.
kubectl create ns production
  1. 프로덕션 및 카나리아 배포를 생성하고 kubectl apply 명령어를 사용하여 서비스를 생성합니다.
kubectl apply -f k8s/production -n production kubectl apply -f k8s/canary -n production kubectl apply -f k8s/services -n production

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 실행한 작업을 확인합니다. 배포가 생성되면 평가 점수가 표시됩니다.

프로덕션 및 카나리아 배포 생성하기

기본적으로 하나의 프런트엔드 복제본만 배포됩니다. kubectl scale 명령어를 사용하여 최소 4개의 복제본이 항상 실행되도록 합니다.

  1. 다음 명령어를 실행하여 프로덕션 환경 프런트엔드를 확장합니다.
kubectl scale deployment gceme-frontend-production -n production --replicas 4
  1. 이제 프런트엔드에 5개의 포드, 프로덕션 트래픽에 4개의 포드, 카나리아 릴리스에 1개의 포드가 실행 중인지 확인합니다(카나리아 릴리스에 변경이 생기면 사용자 5명 중 1명(20%)에만 영향을 줍니다).
kubectl get pods -n production -l app=gceme -l role=frontend
  1. 또한 백엔드에 2개의 포드, 프로덕션에 1개의 포드, 카나리아에 1개의 포드가 있는지 확인합니다.
kubectl get pods -n production -l app=gceme -l role=backend
  1. 프로덕션 서비스의 외부 IP를 검색합니다.
kubectl get service gceme-frontend -n production 참고: 부하 분산기 외부 IP 주소가 표시될 때까지 몇 분 정도 걸릴 수 있습니다.

출력 예시:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gceme-frontend LoadBalancer 10.79.241.131 104.196.110.46 80/TCP 5h

외부 IP를 브라우저에 붙여넣어 카드에 표시된 정보 카드를 확인합니다. 다음과 유사한 페이지가 나타납니다.

이 요청을 처리한 백엔드

  1. 이제 나중에 사용할 수 있도록 프런트엔드 서비스 부하 분산기 IP를 환경 변수에 저장합니다.
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
  1. 브라우저에서 프런트엔드 외부 IP 주소를 열어 두 서비스가 정상 작동하는지 확인합니다.

  2. 다음 명령어를 실행하여 서비스의 버전을 확인합니다(1.0.0으로 표시되어야 함).

curl http://$FRONTEND_SERVICE_IP/version

샘플 애플리케이션을 배포했습니다. 이제 지속적이고 안정적으로 변경사항을 배포할 수 있도록 파이프라인을 설정하겠습니다.

작업 8. Jenkins 파이프라인 만들기

샘플 앱 소스 코드를 호스팅하는 저장소 만들기

  1. 다음과 같이 gceme 샘플 앱의 복사본을 만들고 Cloud Source Repository로 푸시합니다.
gcloud source repos create default

경고를 무시할 수 있으며 이 저장소에 관한 비용은 청구되지 않습니다.

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 실행한 작업을 확인합니다. 소스 저장소가 생성되면 평가 점수가 표시됩니다.

저장소 만들기 git init
  1. 자체 Git 저장소로 sample-app 디렉터리를 초기화합니다.
git config credential.helper gcloud.sh
  1. 다음 명령어를 실행합니다.
git remote add origin https://source.developers.google.com/p/$DEVSHELL_PROJECT_ID/r/default
  1. Git 커밋을 위한 사용자 이름 및 이메일 주소를 설정합니다. 아래에서 [EMAIL_ADDRESS]를 Git 이메일 주소로, [USERNAME]을 Git 사용자 이름으로 바꾸어 입력합니다.
git config --global user.email "[EMAIL_ADDRESS]" git config --global user.name "[USERNAME]"
  1. 파일을 추가, 커밋, 푸시합니다.
git add . git commit -m "Initial commit" git push origin master

서비스 계정 사용자 인증 정보 추가

사용자 인증 정보를 구성하여 Jenkins에서 코드 저장소에 액세스할 수 있도록 허용합니다. Jenkins는 Cloud Source Repositories에서 코드를 다운로드하기 위해 클러스터의 서비스 계정 사용자 인증 정보를 사용합니다.

  1. Jenkins 사용자 인터페이스의 왼쪽 탐색 메뉴에서 Manage Jenkins(Jenkins 관리)를 클릭하고 Security(보안) > Credentials(사용자 인증 정보)를 클릭합니다.

  2. System(시스템)을 클릭합니다.

사용자 인증 정보 페이지

  1. Global credentials (unrestricted)(전역 사용자 인증 정보(무제한))를 클릭합니다.

  2. 오른쪽 상단에서 Add Credentials(사용자 인증 정보 추가)를 클릭합니다.

  3. Kind(종류) 드롭다운에서 Google Service Account from metadata(메타데이터의 Google 서비스 계정)를 선택하고 Create(만들기)를 클릭합니다.

전역 사용자 인증 정보가 추가되었습니다. 사용자 인증 정보의 이름은 Project ID이며 실습의 CONNECTION DETAILS 섹션에 있습니다.

전역 사용자 인증 정보(무제한) 페이지

Kubernetes용 Jenkins Cloud 구성

  1. Jenkins 사용자 인터페이스에서 Manage Jenkins(Jenkins 관리) > Nodes(노드)를 선택합니다.
  2. 왼쪽 탐색창에서 Clouds(클라우드)를 클릭합니다.
  3. New cloud(새 클라우드)를 클릭합니다.
  4. Cloud name(클라우드 이름)에 이름을 입력한 후 Type(유형)에서 Kubernetes를 선택합니다.
  5. Create(만들기)를 클릭합니다.
  6. Kubernetes Cloud Details(Kubernetes 클라우드 세부정보)를 클릭합니다.
  7. Jenkins URL 필드에 http://cd-jenkins:8080을 입력합니다.
  8. Jenkins tunnel(Jenkins 터널) 필드에 cd-jenkins-agent:50000을 입력합니다.
  9. Save(저장)를 클릭합니다.

Jenkins 작업 만들기

Jenkins 사용자 인터페이스로 이동하고 다음 단계에 따라 파이프라인 작업을 구성합니다.

  1. 왼쪽 패널에서 Dashboard(대시보드) > New Item(새 항목)을 클릭합니다.

  2. 프로젝트 이름을 sample-app으로 지정하고 Multibranch Pipeline(다중 브랜치 파이프라인) 옵션을 선택하고 OK(확인)를 클릭합니다.

  3. 다음 페이지의 Branch Sources(브랜치 소스) 섹션에 있는 Add Source(소스 추가) 드롭다운에서 Git을 선택합니다.

  4. Cloud Source Repositories에 있는 sample-app 저장소의 HTTPS clone URL(HTTPS 클론 URL)Project Repository(프로젝트 저장소) 필드에 붙여넣습니다. [PROJECT_ID]프로젝트 ID로 바꿉니다.

https://source.developers.google.com/p/[PROJECT_ID]/r/default
  1. 이전 단계에서 서비스 계정을 추가할 때 만든 사용자 인증 정보의 이름을 Credentials(사용자 인증 정보) 드롭다운에서 선택합니다.

  2. Scan Multibranch Pipeline Triggers(다중 브랜치 파이프라인 트리거 검색) 섹션에서 Periodically if not otherwise run(별도로 실행하지 않는 경우 주기적으로 실행) 상자를 선택하고 Interval(간격) 값을 1 minute(1분)으로 설정합니다.

  3. 작업 구성이 다음과 같이 표시됩니다.

브랜치 소스 섹션

  1. 다른 모든 옵션은 기본값으로 두고 Save(저장)를 클릭합니다.

이러한 단계를 완료하고 나면 Branch indexing이라는 작업이 실행됩니다. 이 메타 작업에서는 저장소에서 브랜치를 식별하고 기존 브랜치에 변경된 사항이 없는지 확인합니다. 왼쪽 상단에서 sample-app을 클릭하면 master 작업이 표시됩니다.

참고: 다음 단계에서 몇 가지 코드를 변경하기 전에는 마스터 작업의 첫 번째 실행이 실패할 수 있습니다.

Jenkins 파이프라인을 만들었습니다. 이제 지속적 통합을 위한 개발 환경을 만들겠습니다.

작업 9. 개발 환경 만들기

개발 브랜치는 개발자가 코드 변경사항을 제출하여 라이브 사이트에 통합하기 전에 테스트하는 데 사용하는 일련의 환경입니다. 이러한 환경은 애플리케이션의 축소 버전이지만 실제 환경과 동일한 메커니즘으로 배포되어야 합니다.

개발 브랜치 만들기

기능 브랜치로부터 개발 환경을 만들려면 브랜치를 Git 서버에 푸시하고 Jenkins를 통해 환경을 배포합니다.

  • 개발 브랜치를 만들고 Git 서버에 푸시합니다.
git checkout -b new-feature

파이프라인 정의 수정하기

해당 파이프라인을 정의하는 JenkinsfileJenkins 파이프라인 Groovy 구문을 사용하여 작성됩니다. Jenkinsfile을 사용하면 전체 빌드 파이프라인을 소스 코드가 포함된 단일 파일로 표현할 수 있습니다. 파이프라인에서는 동시 로드와 같은 강력한 기능을 지원하며 사용자의 수동 승인이 필요합니다.

파이프라인이 정상적으로 작동하도록 하려면 Jenkinsfile을 수정하여 프로젝트 ID를 설정해야 합니다.

  1. 터미널 편집기(예: vi)에서 Jenkinsfile을 엽니다.
vi Jenkinsfile
  1. 편집기를 시작합니다.
i
  1. REPLACE_WITH_YOUR_PROJECT_ID 값에 PROJECT_ID를 추가합니다. PROJECT_ID는 프로젝트 ID로 실습의 CONNECTION DETAILS 섹션에 있습니다. gcloud config get-value project를 실행해서 찾을 수도 있습니다.

  2. CLUSTER_ZONE의 값을 (으)로 변경합니다. gcloud config get compute/zone을 실행하면 이 값을 가져올 수 있습니다.

PROJECT = "REPLACE_WITH_YOUR_PROJECT_ID" APP_NAME = "gceme" FE_SVC_NAME = "${APP_NAME}-frontend" CLUSTER = "jenkins-cd" CLUSTER_ZONE = "{{{project_0.default_zone}}}" IMAGE_TAG = "gcr.io/${PROJECT}/${APP_NAME}:${env.BRANCH_NAME}.${env.BUILD_NUMBER}" JENKINS_CRED = "${PROJECT}"
  1. Jenkinsfile 파일을 저장합니다. vi 사용자의 경우 Esc 키를 누르고 다음 명령어를 입력합니다.
:wq

사이트 수정하기

애플리케이션이 변경되었음을 보여주기 위해 gceme 카드를 파란색에서 주황색으로 변경합니다.

  1. html.go를 엽니다.
vi html.go
  1. 편집기를 시작합니다.
i
  1. 다음을 사용하여 <div class="card blue">의 두 인스턴스를 변경합니다.
<div class="card orange">
  1. html.go 파일을 저장합니다. 이를 위해 Esc 키를 누르고 다음 명령어를 입력합니다.
:wq
  1. main.go를 엽니다.
vi main.go
  1. 편집기를 시작합니다.
i
  1. 버전은 이 줄에서 정의됩니다.
const version string = "1.0.0"

다음으로 업데이트합니다.

const version string = "2.0.0"
  1. main.go 파일을 한 번 더 저장합니다. 이를 위해 Esc 키를 누르고 다음 명령어를 입력합니다.
:wq

작업 10. 배포 시작하기

  1. 변경사항을 커밋하고 푸시합니다.
git add Jenkinsfile html.go main.go git commit -m "Version 2.0.0" git push origin new-feature

이렇게 하면 개발 환경 빌드가 시작됩니다.

변경사항이 Git 저장소에 푸시되고 나면 Jenkins 사용자 인터페이스로 이동하여 new-feature 브랜치의 빌드가 시작되었는지 확인합니다. 변경사항이 적용되기까지는 최대 1분이 소요될 수 있습니다.

  1. 빌드가 실행되면 왼쪽 탐색 메뉴에서 build(빌드) 옆의 아래쪽 화살표를 클릭하고 Console output(콘솔 출력)을 선택합니다.

탐색창

  1. 몇 분 동안 빌드 출력을 추적하면서 kubectl --namespace=new-feature apply... 메시지가 시작되는지 확인합니다. 이제 new-feature 브랜치가 클러스터에 배포됩니다.
참고: 개발 시나리오에서는 공개용 부하 분산기를 사용하지 않습니다. 애플리케이션의 보안을 강화하려는 경우 kubectl 프록시를 사용할 수 있습니다. 이 프록시는 Kubernetes API에 자신을 인증하며, 내 서비스를 인터넷에 노출하지 않고도 로컬 머신의 요청을 클러스터의 서비스로 프록시합니다.

Build Executor(빌드 실행자)에 아무것도 보이지 않아도 걱정하지 마세요. Jenkins 홈페이지에서 샘플 앱으로 이동하여 new-feature 파이프라인이 만들어졌는지 확인하면 됩니다.

  1. 모두 처리되었다면 다음 명령어를 실행하여 백그라운드에서 프록시를 시작합니다.
kubectl proxy &
  1. 정지되는 경우 Ctrl + C를 눌러 종료합니다. localhost에 요청을 보내고 kubectl 프록시에서 이를 서비스에 전달하도록 하여 애플리케이션에 액세스할 수 있는지 확인합니다.
curl \ http://localhost:8001/api/v1/namespaces/new-feature/services/gceme-frontend:80/proxy/version

현재 실행 중인 버전인 2.0.0으로 응답해야 합니다.

다음과 비슷한 오류가 표시될 수 있습니다.

{ "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "no endpoints available for service \"gceme-frontend:80\"", "reason": "ServiceUnavailable", "code": 503
  1. 이는 프런트엔드 엔드포인트가 아직 전파되지 않았음을 의미하며, 이 경우 잠시 기다렸다 curl 명령어를 다시 시도합니다. 다음과 같은 출력이 표시되면 계속 진행합니다.
2.0.0

개발 환경을 설정했습니다. 이제 이전 모듈에서 학습한 내용을 바탕으로 카나리아 릴리스를 배포하여 새로운 기능을 테스트하겠습니다.

작업 11. 카나리아 릴리스 배포하기

앱이 개발 환경에서 최신 코드를 실행 중임을 확인했으므로 이제 해당 코드를 카나리아 환경에 배포해 보겠습니다.

  1. 카나리아 브랜치를 만들고 Git 서버에 푸시합니다.
git checkout -b canary git push origin canary
  1. Jenkins에서 카나리아 파이프라인이 시작되었음을 알 수 있습니다. 작업이 완료되면 서비스 URL을 확인하여 일부 트래픽에 새 버전을 제공하고 있는지 파악할 수 있습니다. 5개의 요청마다 약 1개의 요청(정해진 순서 없음)이 버전 2.0.0을 반환해야 합니다.
export FRONTEND_SERVICE_IP=$(kubectl get -o \ jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend) while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
  1. 계속 1.0.0이 표시되면 위의 명령어를 다시 실행해보세요. 위의 동작이 확인되면 Ctrl + C 키를 사용하여 명령어를 종료합니다.

작업이 끝났습니다. 카나리아 릴리스를 배포했습니다. 이제 새 버전을 프로덕션에 배포하겠습니다.

작업 12. 프로덕션에 배포하기

카나리아 릴리스가 성공적이었으며 어떤 고객의 불만도 없었으므로 이를 이제 나머지 프로덕션 Fleet에 배포해 보겠습니다.

  1. 카나리아 브랜치를 만들고 Git 서버에 푸시합니다.
git checkout master git merge canary git push origin master

Jenkins에서 마스터 파이프라인이 시작되었음을 알 수 있습니다.

  1. 완료되면(몇 분 소요될 수 있음) 서비스 URL을 확인하여 모든 트래픽에 새 버전인 2.0.0이 제공되고 있는지 파악할 수 있습니다.
export FRONTEND_SERVICE_IP=$(kubectl get -o \ jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend) while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
  1. 역시 1.0.0 버전의 인스턴스가 표시되면 위의 명령어를 다시 실행해보세요. Ctrl + C 키를 눌러 이 명령어를 중단할 수 있습니다.

출력 예시:

gcpstaging9854_student@qwiklabs-gcp-df93aba9e6ea114a:~/continuous-deployment-on-kubernetes/sample-app$ while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done 2.0.0 2.0.0 2.0.0 2.0.0 2.0.0 2.0.0 ^C

gceme 애플리케이션이 정보 카드를 표시하는 사이트로 이동할 수도 있습니다. 카드 색상이 파란색에서 주황색으로 변경되었습니다.

  1. 외부 IP 주소를 가져오는 명령어는 다음과 같습니다. 외부 IP를 새 탭에 붙여넣고 표시되는 정보 카드를 확인합니다.
kubectl get service gceme-frontend -n production

출력 예시:

이 요청 페이지를 처리한 백엔드

작업 13. 배운 내용 테스트하기

아래는 이 실습에서 배운 내용을 복습하기 위한 객관식 테스트입니다. 최선을 다해 풀어보세요.

완료

잘하셨습니다. 애플리케이션을 프로덕션에 배포했습니다.

수고하셨습니다.

이것으로 Kubernetes Engine에서 Jenkins를 배포하고 활용하여 지속적 배포 파이프라인을 사용 설정하는 실습을 마칩니다. Kubernetes Engine에서 중요한 DevOps 도구를 배포하고 프로덕션 적용을 위해 구성해볼 수 있는 기회였습니다. kubectl 명령줄 도구와 YAML 파일 내의 배포 구성을 사용해 작업하였으며, 개발/배포 프로세스를 위한 Jenkins 파이프라인 설정에 관해서도 어느 정도 배웠습니다. 이 실습 경험을 기반으로 이제 DevOps 숍에서 이러한 도구를 편안하게 활용할 수 있을 것입니다.

퀘스트 완료

이 사용자 주도형 실습은 Kubernetes in the Google Cloud, Cloud Architecture, DevOps Essentials 퀘스트의 일부입니다. 퀘스트는 연관성이 있는 여러 실습을 하나의 학습 과정으로 구성한 것입니다. 퀘스트를 완료하면 배지를 얻고 수료를 인증할 수 있습니다. 배지를 공개하고 온라인 이력서 또는 소셜 미디어 계정에 연결할 수 있습니다. 이 실습을 포함한 퀘스트에 등록하여 즉시 수료 크레딧을 받으세요. Google Cloud Skills Boost 카탈로그에서 참여할 수 있는 모든 퀘스트를 확인하세요.

다음 실습 참여하기

Hello Node Kubernetes에 참여하여 퀘스트를 계속하거나 다음 Google Cloud Skills Boost 실습을 확인해 보세요.

다음 단계/더 학습하기

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2023년 9월 20일

실습 최종 테스트: 2023년 9월 20일

Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.

현재 이 콘텐츠를 이용할 수 없습니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

감사합니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.