1. CI/CD 개요 및 파이프라인
어플리케이션 개발 및 배포 과정
문제 선정
제공하려는 서비스에 대한 결정
문제 정의
제공하려는 서비스에 따른 기능 명세
설계
알고리즘 및 데이터베이스 설계, 화면 설계 (UI, User Interface)
구현
프로그래밍 언어를 이용하여 구현 (coding)
- build : 구현된 프로그램을 바이너리 형태로 변경하는 과정
- build tool : compiler, interpreter, linker, debugger
테스트
- 단위 테스트 : 기능 (함수, function) 단위 테스트
- 통합 테스트 : 전체 기능에 대한 테스트 (이때 문제 많이 발생)
- 인수 테스트 : 문제 정의에 기반하여 최종 테스트
운영
유지보수 수행
- 어플리케이션 버그 수정
- 사용자 요구 사항 변화에 대한 반영
소프트웨어 개발 생명 주기
SDLC : Software Development LifeCycle
문제정의 -> 설계 -> 구현 -> 테스트 -> 유지보수
현재 어플리케이션 개발 과정은 협업에 의해 진행
여러 개발자에 의해 기능을 나누어서 개발
역할별 구분
- PM : Project Manager
- 분석가 : 문제 정의
- 설계가 : 시스템 / 어플리케이션 설계
- 프로그래머 (개발자) : 구현, 단위 테스트
- 테스터 : 어플리케이션 테스트 및 통합 테스트
- 유지 보수 담당자 : 유지 보수
협업시 문제
- 공유 문제 : 결과물에 대한 공유
- 프로그램 코드 통합시 많은 문제 발생
협업시 문제 해결 위한 공유 도구 사용
형상 관리 도구 (버전 관리 도구) : Git
개발자와 운영자간의 문제 - 시각차
- 개발자 : 어플리케이션 개발에 대한 책임
- 운영자 : 어플리케이션 배포 및 운영에 대한 책임
- 개발자와 운영자 사이의 시각차에 따른 문제
시스템 구성
- 개발 서버 (빌드 build 서버) : 개발자 사용, build 환경 구성
- 배포 서버 (타겟 target 서버) : 어플리케이션 배포 및 배포 환경 구성
- 운영 서버 : 운영 목적, 운영 환경 구성
CI
지속적 통합 (Continuous Integration)
- 개발자를 위한 자동화 프로세스
- 어플리케이션 코드 변경 사항이 정기적으로 빌드/테스트되어 공유 저장소 (Git)에 병합
- 빌드 도구 : 프로그래밍 언어에 따라 결정
- 테스트 도구 : 테스트 전용 도구
- 여러 개발자가 동시에 어플리케이션 개발시 서로 충돌 가능한 문제 해결
- 개발 서버 (빌드 서드) 환경에 구성
CD
타겟 서버에서 운영 서버로 어플리케이션 배포 자동화
지속적 서비스 제공 (Continuous Delivery)
- 수동 배포
- 개발자는 어플리케이션에 적용한 변경사항을 버그 테스트를 거쳐 공유 저장소에 자동 업로드
- 운영자는 어플리케이션을 공유 저장소에서 운영 환경으로 배포
병목현상 가능성 있음
지속적인 배포 (Continuous Deployment)
- 자동 배포
- 개발자는 변경사항을 공유 저장소에 저장하면 자동으로 운영환경까지 자동으로 릴리즈되는 형태
=> CI/CD는 마이크로 서비스 아키텍처가 활성화되면서 강조/적용
CI/CD pipeline
CI/CD의 각 과정이 연계되는 구조
CI/CD 사용 도구
2. 쿠버네티스 CI/CD
GitOps 기반 지속적 배포
GitOps : Git (공유) + Operation (운영); 쿠버네티스를 활용하여 어플리케이션 관리를 수행하는 환경의 CI/CD 방법론
쿠버네티스 클러스터를 관리하고, 클러스터에 어플리케이션을 배포하는 방법론
GitOps 핵심
- 어플리케이션 소스 (프로그램) 뿐만 아니라 배포 설정까지 Git 저장소를 통해 관리
- Git 저장소에 선언적으로 기술된 Kubernetes manifest (YAML 형식)와 같은 파일 저장 및 이를 사용한 배포 진행 방식
GitOps를 적용한 쿠버네티스 CI/CD pipeline
개발자 Pipeline
- 어플리케이션 코드를 Git 저장소에 저장
- Git 저장소에 저장된 어플리케이션 코드를 배포 서버를 통해 배포 -> Jenkins (CI 도구)
- 시스템 운영자 Pipeline의 Git 저장소에 정보 등록
- 어플리케이션 코드는 컨테이너 이미지로 생성해서 레포지토리에 저장
시스템 운영자 Pipeline
- Helm을 이용하여 패키지 구성 결과를 Git 저장소에 저장
- Git 저장소의 내용을 실제 쿠버네티스 클러스터에 배포 -> Argo (CD 도구)