💡 서비스 명 : 구름 대학교 수강신청 서비스
- 주제 : 학생들이 수강신청 기간에 각 학기마다 수강할 강의를 선택 하고 등록할 수 있는 온라인 서비스. 학생들은 이를 이용하여 강의 검색, 수강 신청, 강의 일정 확인 등을 한다.
- 주제 목표 : 안정적인 인프라를 구축하고, 대규모 트래픽을 처리할 수 있는 서비스를 구현
- 대학교 수강신청 과정에서 발생하는 여러 문제점들을 개선하여 학생들의 편의성을 높이기 위함
- 수강 신청이 학생들의 한 학기 동안의 학습 환경에 막대한 영향을 주는 만큼 수강신청 서비스는 모든 학생이 강의를 안정적으로 신청할 수 있도록 서비스를 제공하는 안정적인 인프라가 필요
- 기존의 대학교 수강신청 서비스에서는 학생들이 동시에 수강 신청을 하거나, 수업 정보를 조회하는 등의 작업으로 인해 서버 부하가 증가하게 되면 시스템이 다운되거나 느려지는 등의 문제가 발생할 가능성이 있다.
- 시스템에 문제가 발생하면 학생들은 수강신청에 실패하거나, 수업 정보를 제대로 파악하지 못하게 될 가능성이 있다.
- 따라서, 이번 프로젝트에서는 안정적인 인프라를 구축하고, 대규모 트래픽을 처리할 수 있는 시스템을 구현하는 것을 목표로 한다. 이를 위해 클라우드 컴퓨팅, 분산 시스템, 데이터베이스 성능 최적화 등의 기술을 활용하여 시스템의 안정성과 확장성을 높인다
- 또한, 보안 측면에서도 사용자 정보를 안전하게 보호하고, 시 스템이 해킹이나 악성 공격 등의 공격으로부터 안전하게 보호 될 수 있도록 인프라를 설계하는 것을 목표로 한다.
개발 및 웹 서버
클라우드 컨테이너 관련
CI/CD
Monitoring
- 동시에 수강신청을 하거나, 수업 정보를 조회하는 등의 작업으로 인해 서버 부하증가 및 서버 지연
- 2개 이상의 클라이언트로 중복 접속을 하여 수강신청을 해서 서버 문제 가중화
- 수업 정보 조회에 많은 시간이 걸림
- 대규모 트래픽을 처리할 수 있는 분산 시스템을 구축하여 수강신청 시스템의 확장성을 높임
- 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를 통해 배포한다.