[파이널 프로젝트] 프로젝트 착수 보고서

신현식·2023년 3월 21일
1

구름_Kubernetes

목록 보기
14/25
post-thumbnail

프로젝트 착수 보고서

주제 / 아이디어

💡 서비스 명 : 구름 대학교 수강신청 서비스

  • 주제 : 학생들이 수강신청 기간에 각 학기마다 수강할 강의를 선택 하고 등록할 수 있는 온라인 서비스. 학생들은 이를 이용하여 강의 검색, 수강 신청, 강의 일정 확인 등을 한다.
  • 주제 목표 : 안정적인 인프라를 구축하고, 대규모 트래픽을 처리할 수 있는 서비스를 구현

주제 선정 배경

  • 대학교 수강신청 과정에서 발생하는 여러 문제점들을 개선하여 학생들의 편의성을 높이기 위함
  • 수강 신청이 학생들의 한 학기 동안의 학습 환경에 막대한 영향을 주는 만큼 수강신청 서비스는 모든 학생이 강의를 안정적으로 신청할 수 있도록 서비스를 제공하는 안정적인 인프라가 필요
  • 기존의 대학교 수강신청 서비스에서는 학생들이 동시에 수강 신청을 하거나, 수업 정보를 조회하는 등의 작업으로 인해 서버 부하가 증가하게 되면 시스템이 다운되거나 느려지는 등의 문제가 발생할 가능성이 있다.
  • 시스템에 문제가 발생하면 학생들은 수강신청에 실패하거나, 수업 정보를 제대로 파악하지 못하게 될 가능성이 있다.
  • 따라서, 이번 프로젝트에서는 안정적인 인프라를 구축하고, 대규모 트래픽을 처리할 수 있는 시스템을 구현하는 것을 목표로 한다. 이를 위해 클라우드 컴퓨팅, 분산 시스템, 데이터베이스 성능 최적화 등의 기술을 활용하여 시스템의 안정성과 확장성을 높인다
  • 또한, 보안 측면에서도 사용자 정보를 안전하게 보호하고, 시 스템이 해킹이나 악성 공격 등의 공격으로부터 안전하게 보호 될 수 있도록 인프라를 설계하는 것을 목표로 한다.

역할 분배

  • 프론트 엔드 & 백 엔드 서비스 개발
  • CI/CD : 나는 이 프로젝트에서 CI/CD 파이프라인 구축을 맡았다.
  • Monitoring

협업 툴

개발 스택

  • 구축환경 : AWS를 이용하여 클라우드 환경에서 작업을 할것이고 최종적으로 EKS클러스터로 배포하는 것

사용기술

  • 개발 및 웹 서버

    • vue.js: 오픈 소스 프로그레시브 자바스크립트 프레임워크
      프론트 엔드 구성 코드로 사용
    • nginx: 가벼우면서도 강력한 프로그램을 목표로 한 오픈 소스 웹 서버 프로그램, 프론트 엔드 웹서버로 사용
    • spring boot: 자바 기반의 오픈소스 프레임워크인 스프링(Spring)을 기반으로 한 마이크로서비스 아키텍처를 지원하는 웹 애플리케이션 프레임워크, 백엔드 api서버로 사용
  • 클라우드 컨테이너 관련

    • EKS: 자체 Kubernetes 컨트롤 플레인 또는 노드를 설치, 운영 및 유지 관리할 필요 없이 AWS의 Kubernetes 실행에 사용할 수 있는 관리형 서비스
    • RDS: 클라우드에서 간편하게 데이터베이스를 설치, 운영 및 확장할 수 있는 관리형 서비스 모음, MySQL 사용
  • CI/CD

    • 젠킨스: Java로 제작된 오픈 소스 CI 툴
      CI/CD pipeline 을 구성하여 깃허브에 올라온 커밋을 발견하면 도커 허브에 이미지를 Build & Push 자동화
    • argo CD: Kubernetes를 위한 GitOps 지속적 배포 도구
      Manifest 파일의 변경사항을 감시하며, 현재 배포된 환경의 상태와 Github Manifest 파일에 정의된 상태를 동일하게 유지 시켜줌
  • Monitoring

    • 프로메테우스: 이벤트 모니터링 및 경고에 사용되는 무료 소프트웨어 응용 프로그램, k8s 환경에 구축하여 시스템 모니터링 실시
    • 그라파나: 멀티플랫폼 오픈 소스 애널리틱스 및 인터랙티브 시각화 웹 애플리케이션, 구현한 프로메테우스 데이터를 가지고 모니터링 보기 쉽게 함
    • AWS CloudWatch: 리소스 및 AWS에서 실행되는 애플리케이션을 실시간으로 모니터링, 시스템 전체의 리소스 사용률, 애플리케이션 성능, 운영 상태를 파악

프로젝트 일정(GANT Chart)

프로젝트 관리 방안

  • 깃허브를 통해 코드의 형상관리를 한다.
  • 젠킨스를 통해 코드의 지속적인 통합을 자동화한다.
  • 아르고cd를 통해 코드의 지속적인 배포를 자동화 한다.
  • 프로메테우스를 통해 컨테이너들및 시스템의 상태를 지속적으로 감시함으로서 안정적인 서비스를 돕는다.

AS IS - TO BE

AS IS

  • 동시에 수강신청을 하거나, 수업 정보를 조회하는 등의 작업으로 인해 서버 부하증가 및 서버 지연
  • 2개 이상의 클라이언트로 중복 접속을 하여 수강신청을 해서 서버 문제 가중화
  • 수업 정보 조회에 많은 시간이 걸림

TO BE

  • 대규모 트래픽을 처리할 수 있는 분산 시스템을 구축하여 수강신청 시스템의 확장성을 높임
  • 1계정 다중 클라이언트를 이용한 수강신청을 제한하여 서버의 부담을 낮춤
  • 데이터베이스 성능 최적화와 캐시 서버를 도입하여 빠른 데이터 접근을 지원함

인프라 아키텍처 설계

ArgoCD가 배포할 EKS클러스터의 인프라 아키텍처를 설계하였다.

  • 클러스터를 배포할때 노드그룹에 Capacity를 2로 설정하여 EC2인스턴스가 각 AZ에 하나씩 생기게 하였다.

  • 각 노드에는 백엔드와 프론트엔드 파드가 Deployment에 의해 배포된다.

  • 고가용성을 위해 RDS데이터베이스는 멀티AZ배포로 이중화 배치를 하였다.

  • HPA를 사용하여 백엔드 서버의 파드에 연결한다. 이후 HPA는 파드의 request값으로 100%를 측정한다. 그리고 cpu평균 사용률을 측정해서 지정한 값보다 높아지면 파드를 늘린다.

  • 오토스케일링 그룹으로 두개의 EC2인스턴스를 묶는다. 만약 파드가 HPA에 의해 계속 늘어나고 늘어난 파드의 request값을 해당 노드가 가진 한정된 자원으로는 늘어난 파드의 request값을 보장해주지 못한다면 오토스케일링 그룹에 의해 EC2인스턴스( =노드)가 늘어나 새로운 노드에 이전에 배치하지 못하고 Pending상태였던 파드가 배치된다.

  • 백엔드 서버 파드에 PVC를 부착하여 스토리지 클래스에 의해 동적으로 PV를 생성해 NFS스토리지에 연결시킨다. 이때 EFS를 사용하여 EFS Provisionor에 PV를 연결시켜서 EFS에 마운트시킨다.
    따라서 여러 인스턴스가 동시적으로 스토리지에 접근해 읽기/쓰기가 가능해진다. 즉, 여러 인스턴스를 동기화 시킬수 있다.

  • 인스턴스와 RDS는 보안을 위해 프라이빗 서브넷에 배치하고 Ingress(ALB)와 NodePort Service(NLB)를 이용하여 외부의 클라이언트에 노출시킨다.

  • Route53을 이용하여 외부 사용자가 도메인을 입력하여 서비스를 이용할 수 있게 한다.

  • 추후에 계속 작업을 하면서 변경사항이 생기게 된다면 조금씩 수정해나갈 예정이다.

파이프라인 아키텍쳐 설계

CI/CD 파이프라인의 대략적인 흐름도이자 설계도이다. 또한 간단하게 모니터링하는 서비스까지 추가해보았다.

  • 개발자가 Jenkins가 Scm Poll하고 있는 git에 개발한 코드를 Push하면 Jenkins는 Scm Poll을 통해 해당 코드를 가져와서 Test와 Build를 하게 된다.

  • 성공적으로 Build가 되었다면 결과물로 war파일이 생성되게 된다. 이 war파일을 배포하기 위해 Java기반의 web application인 Tomcat서버를 생성하고 Tomcat서버의 특정 디렉터리에 옮기는 작업을 하는 Dockerfile을 Git에 같이 넣어놓는다.
    이후 Kaniko를 이용해 이 Dockerfile을 Build하여 이미지로 만든다.

  • 생성된 이미지를 Docker Hub에 Push한다.


  • 그림에서는 하나의 git으로 되어있지만 실제로는 배포용 git 저장소와 코드용 git 저장소가 분리되어있다.

  • Docker Hub는 배포용 Git에 연동되어 있고, 새로운 이미지가 Push가 되면 배포용 Git의 Deployment에서 기존의 이미지에 Sed명령을 통해 새로운 Image로 바꾼다.

  • 새로운 Image로 바뀐 Deployment를 ArgoCD가 감지하여 새로운 Image가 적용된, 즉 새로운 버전의 웹으로 Rolling Update를 통해 배포한다.

profile
전공 소개

0개의 댓글