CS 지식/DevOps
[DevOps] CI / CD 무중단 배포
ghan2
2024. 6. 22. 22:58
CI란 무엇일까?
- 지속적 통합이라는 뜻으로, 개발을 진행하면서도 품질을 관리할 수 있도록 여러 명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합 하면서 관리할 수 있음을 의미
- CI가 있기 전에 개발자들은 머지데이라는 날을 통해 모든 분기 소스 코드를 병합했음
- 많은 수작업 동반 → 리소스 낭비
- 에러 발생 시 디버깅 어렵
- 마틴 파울러의 CI의 4가지 규칙
- 모든 소스 코드가 살아 있고 누구든 현재의 소스에 접근할 수 있는 단일 지점을 유지할 것
- 빌드 프로세스를 자동화해서 누구든 소스로부터 시스템을 빌드할 수 있게 할 것
- 테스팅을 자동화해서 언제든지 시스템에 대한 건전한 테스트 수트를 실행할 수 있게 할 것
- 누구든 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확신을 하게 할 것
CD란 무엇일까?
- CI를 통해 코드의 통합을 이루었다면 배포만 하면 사용자들은 본인들이 원하던 요구사항을 만족할 수 있을 것이다. 그러나 모든 서버에 배포를 수동으로 진행한다면 굉장히 어려운 작업이 될 것이다.
- CI의 연장선에 있는 개념으로, 빌드의 결과물을 프로덕션으로 지속적으로 배포하는 것을 의미한다.
CI/CD 자동화가 도입된 프로세스
- 개발자들이 개발하여 코드를 수정
- 각자의 feature 브랜치에 코드를 push
- CI서버( Jenkins, Tekton 등)에서 push 명령을 트리거링하여 자동으로 빌드, 테스트 등을 실행
- 에러가 발생하였다면 개발자에게 결과를 전송하여 오류를 수정
- 빌드, 테스트가 정상적으로 수행되었다면 CD서버가 자동으로 배포를 수행
무중단 배포란 무엇일까?
- 기존 문제점: 새로운 서비스를 배포하기 위해 기존 서비스를 종료하고 새로운 서비스를 시작하는 사이에 “다운 타임”이 발생. 다운 타임 동안 사용자들은 서비스를 이용할 수 없는 문제점을 해결하기 위해 등장함
무중단 배포 구현 방법
- AWS에서 Blue-Green 무중단 배포
- 도커를 이용한 무중단 배포
- L4, L7 스위치를 이용한 무중단 배포
- Nginx를 이용한 무중단 배포 (쉽고 저렴)
관련 용어
- 리버스 프록시(보안에 용이)
- 인터넷과 서버 사이에 위치한 중계 서버
- 클라이언트가 요청한 내용을 캐싱
- 서버 정보를 클라이언트로부터 숨길 수 있어 보안에 용이
- 로드 밸런싱(부하 분산) - 라운드 로빈 방식 일반적
- 부하 분산
- 서버에 가해지는 부하를 분산해주는 역할
- 하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 계속 유지할 수 있는 무중단 배포가 가능
무중단 배포 방식
1. Rolling 배포 (가장 일반적)
- 가장 기본적인 방식으로 서버를 차례로 업데이트
- 인스턴스를 추가하지 않아도 돼서 관리가 간편하다.
- 사용중인 인스턴스에 트래픽이 몰리는 문제가 있다.
- 버전간 호환성 문제가 생기는 순간이 있다.
2. Blue/Green 배포
- 서비스 중인 서버와 대기중인 서버가 있는 상황에서 새로운 서버를 적용시키고 싶다면 대기중인 서버에 적용을 시키고 사용 중인 서버를 바꾸어 라우팅 해준다.
- 배포 속도가 빠르다
- 구버전과 같은 환경으로 신버전을 미리 준비
- 단, 시스템 자원이 두배로 든다.
3. Canary 배포
- 소수만 사용하는 환경에 신버전을 배포하고 문제를 관찰.
- 신버전을 소수의 사용자들에게만 배포하고 문제가 없으면 점진적으로 배포하는 방식
- 블루그린 배포와 유사하지만 블루그린은 한번에 전환하고 카나리는 단계적으로 전환한다.
- 문제 상황을 빠르게 감지 가능
참고
https://codefresh.io/learn/continuous-delivery/continuous-deployment-only-for-unicorns/