Overview
- Kubernetes Engine은 컨테이너를 위한 강력한 클러스터 관리자 및 조정 시스템으로
고가용성 다중 노드 클러스터에 이르기까지 다양한 환경에서 실행할 수 있는 오픈 소스 프로젝트 - Jenkins는 빌드, 테스트 및 배포 파이프라인을 유연하게 조정할 수 있는 오픈 소스 자동화 서버이므로
개발자가 지속적 배포에서 발생할 수 있는 오버헤드 문제에 대해 걱정하지 않고 프로젝트를 빠르게 반복할 수 있음 - 지속적 전달 파이프라인을 설정해야 하는 경우 Kubernetes Engine에 Jenkins를 배포하며
빌드 프로세스에서 컨테이너를 사용하는 경우 하나의 가상 호스트가 여러 운영 체제에서 작업을 실행할 수 있어
일괄 처리 작업과 같은 다른 클러스터 작업을 위한 리소스를 남겨두어 빠른 속도로 몇 초만에 실행됨 - 또한 Kubernetes Engine에는 구글의 글로벌 로드 밸런서가 사전 장착되어 있어 인스턴스로의 웹 트래픽 라우팅을 자동화 가능
그러면 로드 밸런서는 항상 사용자에게 애플리케이션 인스턴스에 대한 가능한 가장 빠른 경로를 설정하게 됨
Download the source code
- 기본 컴퓨팅 영역 설정
- 실습의 샘플 코드 복사 후 압축 풀기
- 디렉토리 변경
Provisioning Jenkins
- jenkins-cd 클러스터 프로비저닝
- 클러스터 실행 확인
- 클러스터에 대한 자격 증명 가져오기
- 자격 증명을 이용해 새로 프로비저닝된 클러스터에 액세스할 수 있는지 확인
Setup Helm
- Helm은 Kubernetes 애플리케이션을 쉽게 구성하고 배포할 수 있게 해주는 패키지 관리자이며
Helm을 사용해 Charts 리포지토리에서 Jenkins를 설치하고, Jenkins가 설치되면 CI/CD 파이프라인 설정 가능 - Helm에 charts 리포지토리 추가
- 리포지토리가 최신 상태인지 확인
Configure and Install Jenkins
- 사용자 지정 values 파일 다운로드
Jenkins 설치 시 values 파일을 템플릿으로 사용해 설정에 필요한 값을 제공할 수 있음
그러면 values 파일로 인해 Kuberntes 클라우드를 자동으로 구성하고
필수 플러그인인 kubernetes, Workflow-multibranch, Git,
Configuration-as-code, Google-oauth-plugin, Google-source-plugin, Google-storage-plugin를 추가하게 됨
- Helm CLI를 사용해 구성 설정으로 charts를 배포
- 포드를 확인해 Jenkins 포드가 Running 상태이고 컨테이너가 Ready 상태인지 확인
- 클러스터에 배포할 수 있도록 Jenkins 서비스 계정을 구성
- 클라우드쉘에서 Jenkins UI로 포트 전달 설정
- Jenkins 서비스가 제대로 생성되었는지 확인
Jenkins 마스터가 요청할 때 빌더 노드가 필요에 따라 자동으로 시작되도록 Kubernetes 플러그인을 사용하고 있으며
작업이 완료되면 자동으로 종료되고 리소스가 클러스터 리소스 풀에 다시 추가됨
이 서비스는 포트 8080과 Kubernetes 클러스터 내에서 Jenkins 웹 UI 및 빌더/에이전트 등록 포트 50000가 노출됨
또한 서비스는 ClusterIP를 사용하여 노출되어 클러스터 외부에서는 액세스할 수 없음
Connect to Jenkins
- Jenkins charts는 자동으로 관리자 암호를 생성하므로 이를 검색
- Jenkins 사용자 인터페이스로 이동하려면 클라우드 쉘에서 웹 미리보기 버튼을 클릭한 다음 포트 8080에서 미리보기를 클릭
- 사용자 이름 admin과 자동 생성된 비밀번호로 로그인
Kuberntes 클러스터에 Jenkins가 설정됨
Understanding the Application
- 배포되는 애플리케이션 gceme 이해
지속적 배포 파이프라인에 샘플 애플리케이션인 gceme를 배포
이 애플리케이션은 Go 언어로 작성되었으며 레포지토리의 sample-app 디렉토리에 있음
Compute Engine 인스턴스에서 gceme 바이너를 실행하면 앱이 정보 카드에 인스턴스의 메타데이터를 표시함
애플리케이션은 두 가지 작동 모드를 지원하며 마이크로서비스를 모방함
- 백엔드 모드 : gceme는 포트 8080에서 수신 대기하고 Compute Engine 인스턴스 메타데이터를 JSON 형식으로 반환
- 프론트엔드 모드 : gceme는 백엔드 gceme 서비스를 쿼리하고 사용자 인터페이스에서 결과 JSON을 렌더링
Deploying the Application
- 애플리케이션을 두 가지 다른 환경에서 배포함
- 프로덕션 : 사용자가 액세스하는 라이브 사이트
- 카나리아 : 사용자 트래픽의 일정 비율만 수신하는 소규모 사이트
카나리아를 이용해 모든 사용자에게 릴리즈되기 전에 라이브 트래픽으로 소프트웨어를 검증
- 샘플 애플리케이션 디렉토리로 이동
- 배포를 논리적으로 격리하기 위해 Kubernetes 네임스페이스 생성
- 프로덕션 및 카나리아 배포와 서비스 생성
- 프로덕션 환경에서는 프론트엔드 복제본은 4개로 확장
- 프론트엔드용으로 5개의 포드, 프로덕션 트래픽용으로 4개의 포드, 카나리아 릴리즈용으로 1개의 포트가 실행 중인지 확인
카나리아 릴리즈에 대한 변경은 사용자 5명 중 1명(20%)에게만 영향을 미침
- 백엔드용 포드 2개(프로덕션용 1개, 카나리아용 1개)가 있는지 확인
- 프로덕션 서비스에 대한 외부 IP 검색
이때 외부 IP를 브라우저에 붙여 넣으면 정보 카드를 볼 수 있음
- 프론트엔드 서비스 로드 밸런서 IP를 나중에 사용할 수 있도록 환경 변수에 저장
- 브라우저에서 프론트엔드 외부 IP주소를 열어 두 서비스가 모두 작동하는지 확인
Creating the Jenkins Pipeline
- 샘플 앱 소스 코드를 호스팅할 리포지토리 만들기
샘플 gceme 앱의 사본을 만들어 Cloud Source Repository에 푸시
- 샘플 앱 디렉토리를 자체 Git 리포지토리로 초기화 및 구성
- Git 커밋에 대한 사용자 이름과 이메일 주소를 설정
- 파일을 추가, 커밋 및 푸시
- Jenkins가 코드 리포지토리인 Cloud Source Repository에 액세스할 수 있도록 자격 증명 구성
Jenkins 사용자 인터페이스의 탐색에서 Jenkins 관리를 클릭한 다음 자격 증명 관리를 클릭하고
Jenkins를 클릭한 후 전역 자격 증명을 클릭하여 Google 서비스 계정에 대한 글로벌 자격 증명을 추가
- Jenkins 파이프라인 작업 만들기
탐색 메뉴에서 새 항목을 클릭하고 프로젝트 이름을 sample-app으로 지정한 다음 Multibranch Pipeline 옵션을 선택
다음 페이지의 분기 소스 섹션에서 소스 추가를 클릭하고 git을 선택
그 후 Cloud Source Repository에 있는 sample-app 저장소의 HTTPS 복제 URL을 프로젝트 저장소 필드에 붙이고
자격 증명에서 이전에 생성한 자격 증명의 이름을 선택하고 Scan Multibranch Pipeline Triggers를 1분 간격으로 설정
그리고 저장하게 되면 Branch indexing이라는 작업이 실행되게 되며
이 메타 작업은 저장소의 분기를 식별하고 기존 분기에서 변경 사항이 발생하지 않았는지 확인하게 됨
생성된 sample-app을 클릭하면 master 작업이 표시되게 됨
Creating the Development Environment
- 개발 분기는 개발자가 라이브 사이트에 통합하기 위해 제출하기 전에 코드 변경 사항을 테스트하는데 사용하는 환경 세트
- 개발 분기 생성 후 Git 서버에 푸시
개발 분기에서 개발 환경을 생성하려면 분기를 Git 서버에 푸시하고 Jenkins가 환경을 배포하도록 할 수 있음
- 파이프라인을 정의하는 Jenkinsfile 수정
Jenkinsfile을 사용하면 전체 빌드 파이프라인을 소스 코드와 함께 있는 단일 파일로 표현할 수 있음
vi를 사용해 편집기를 열고 PROJECT_ID 값을 추가하고 ESC를 누르고 :wq를 입력해 저장
- 애플리케이션 변경을 시연하기 위해 사이트의 gceme 카드를 파란색에서 주황색으로 변경
http.go를 vi를 사용해 편집기를 열고 card blue를 card orange로 변경하고 ESC를 누르고 :wq를 입력해 저장
main.go를 vi를 사용해 편집기를 열고 1.0.0을 2.0.0으로 변경하고 ESC를 누르고 :wq를 입력해 저장
Kick off Deployment
- 변경 사항을 커밋하고 푸시
개발 환경 빌드가 시작되며
변경 사항을 Git 리포지토리에 푸시한 후 Jenkins 사용자 인터페이스로 이동하여 new-feature 분기에 대한 빌드가 시작됨
이후 새 기능 분기인 new-feature가 클러스터 배포됨
- 백그라운드에서 프록시를 시작
요청을 보내고 프록시가 이를 서비스로 전달하도록 하여 애플리케이션에 액세스할 수 있는지 확인
Deploying a Canary Release
- 카나리아 분기를 만들고 Git 서버에 푸시
앱이 개발 환경에서 최신 코드를 실행하고 있음을 확인했으므로 해당 코드를 카나리아 환경에 배포하기 위해 분기 생성
- Jenkins에서 카나리아 파이프라인이 시작된 것을 확인
파이프라인이 완료되면 서비스 URL을 확인하여 일부 트래픽이 새 버전인 2.0.0에서 제공되고 있는지 확인할 수 있음
Deploying to production
- 카나리아 분기를 만들고 Git 서버에 푸시
카나리아 릴리즈가 성공적으로 완료되었고 고객 불만이 접수되지 않았으므로 나머지 프로덕션 플릿에 배포하기 위해 병합
- Jenkins에서 카나리아 파이프라인이 시작된 것을 확인
파이프라인이 완료되면 서비스 URL을 확인하여 모든 트래픽이 새 버전인 2.0.0에서 제공되고 있는지 확인할 수 있음
- gceme 애플리케이션 정보 카드 확인
카드 색상이 파란색에서 주황색으로 변경된 것을 볼 수 있음
'Cloud > GCP' 카테고리의 다른 글
[Cloud OnBoard] Google Cloud Fundamentals - 목차 (0) | 2023.07.03 |
---|---|
[Cloud Skills Boost] Kubernetes in Google Cloud - 목차 (0) | 2022.07.08 |
[Cloud Skills Boost] Kubernetes Engine으로 배포 관리 (0) | 2022.07.06 |
[Cloud Skills Boost] Kubernetes를 통한 클라우드 조정 (0) | 2022.07.05 |
[Cloud Skills Boost] Kubernetes Engine (0) | 2022.07.02 |