CS 지식/DevOps

[DevOps] CI / CD 무중단 배포

ghan2 2024. 6. 22. 22:58

CI란 무엇일까? 

  • 지속적 통합이라는 뜻으로, 개발을 진행하면서도 품질을 관리할 수 있도록 여러 명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합 하면서 관리할 수 있음을 의미
  • CI가 있기 전에 개발자들은 머지데이라는 날을 통해 모든 분기 소스 코드를 병합했음
    • 많은 수작업 동반 → 리소스 낭비
    • 에러 발생 시 디버깅 어렵

https://www.google.com/url?sa=i&url=https%3A%2F%2Fsemaphoreci.com%2Fcontinuous-integration&psig=AOvVaw3PPqMXyRbR2bsAlss5E8mA&ust=1719149640437000&source=images&cd=vfe&opi=89978449&ved=0CBMQjhxqFwoTCJjT8c6p74YDFQAAAAAdAAAAABAE

  • 마틴 파울러의 CI의 4가지 규칙
    • 모든 소스 코드가 살아 있고 누구든 현재의 소스에 접근할 수 있는 단일 지점을 유지할 것
    • 빌드 프로세스를 자동화해서 누구든 소스로부터 시스템을 빌드할 수 있게 할 것
    • 테스팅을 자동화해서 언제든지 시스템에 대한 건전한 테스트 수트를 실행할 수 있게 할 것
    • 누구든 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확신을 하게 할 것

 

CD란 무엇일까?

  • CI를 통해 코드의 통합을 이루었다면 배포만 하면 사용자들은 본인들이 원하던 요구사항을 만족할 수 있을 것이다. 그러나 모든 서버에 배포를 수동으로 진행한다면 굉장히 어려운 작업이 될 것이다.
  • CI의 연장선에 있는 개념으로, 빌드의 결과물을 프로덕션으로 지속적으로 배포하는 것을 의미한다.

https://codefresh.io/learn/continuous-delivery/continuous-deployment-only-for-unicorns/

 

CI/CD 자동화가 도입된 프로세스

https://www.geeksforgeeks.org/ci-cd-continuous-integration-and-continuous-delivery

  1. 개발자들이 개발하여 코드를 수정
  2. 각자의 feature 브랜치에 코드를 push
  3. CI서버( Jenkins, Tekton 등)에서 push 명령을 트리거링하여 자동으로 빌드, 테스트 등을 실행
  4. 에러가 발생하였다면 개발자에게 결과를 전송하여 오류를 수정
  5. 빌드, 테스트가 정상적으로 수행되었다면 CD서버가 자동으로 배포를 수행

 

무중단 배포란 무엇일까?

  • 기존 문제점: 새로운 서비스를 배포하기 위해 기존 서비스를 종료하고 새로운 서비스를 시작하는 사이에 “다운 타임”이 발생. 다운 타임 동안 사용자들은 서비스를 이용할 수 없는 문제점을 해결하기 위해 등장함

무중단 배포 구현 방법

  • AWS에서 Blue-Green 무중단 배포
  • 도커를 이용한 무중단 배포
  • L4, L7 스위치를 이용한 무중단 배포
  • Nginx를 이용한 무중단 배포 (쉽고 저렴)

관련 용어

- 리버스 프록시(보안에 용이)

  • 인터넷과 서버 사이에 위치한 중계 서버
  • 클라이언트가 요청한 내용을 캐싱
  • 서버 정보를 클라이언트로부터 숨길 수 있어 보안에 용이

- 로드 밸런싱(부하 분산) - 라운드 로빈 방식 일반적

  • 부하 분산
  • 서버에 가해지는 부하를 분산해주는 역할
  • 하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 계속 유지할 수 있는 무중단 배포가 가능

무중단 배포 방식

1. Rolling 배포 (가장 일반적)

https://llshl.tistory.com/47

  • 가장 기본적인 방식으로 서버를 차례로 업데이트
  • 인스턴스를 추가하지 않아도 돼서 관리가 간편하다.
  • 사용중인 인스턴스에 트래픽이 몰리는 문제가 있다.
  • 버전간 호환성 문제가 생기는 순간이 있다.

2. Blue/Green 배포

배포 전(https://llshl.tistory.com/47)
배포 후(https://llshl.tistory.com/47)

  • 서비스 중인 서버와 대기중인 서버가 있는 상황에서 새로운 서버를 적용시키고 싶다면 대기중인 서버에 적용을 시키고 사용 중인 서버를 바꾸어 라우팅 해준다.
  • 배포 속도가 빠르다
  • 구버전과 같은 환경으로 신버전을 미리 준비
  • 단, 시스템 자원이 두배로 든다.

3. Canary 배포

  • 소수만 사용하는 환경에 신버전을 배포하고 문제를 관찰.
  • 신버전을 소수의 사용자들에게만 배포하고 문제가 없으면 점진적으로 배포하는 방식
  • 블루그린 배포와 유사하지만 블루그린은 한번에 전환하고 카나리는 단계적으로 전환한다.
  • 문제 상황을 빠르게 감지 가능

 


참고

https://codefresh.io/learn/continuous-delivery/continuous-deployment-only-for-unicorns/

https://www.youtube.com/watch?v=sIPU_VkrguI

https://llshl.tistory.com/47