<aside>

방세준 | Sejun Noah Bang
Phone | +82 10-6366-5783
Mail | [email protected]
Github | yuuki08noah
LinkedIn | yuuki08noah
Certifications |
한성 손재한 장학생 12기 https://www.sonjaehan.com/?module=Html&action=SiteComp&sSubNo=13
TOPCIT Level 3 | TOEIC 820 | JLPT N2
</aside>
Google Cloud의 Autopilot(Auto Scaling) GKE 서비스를 사용해 MSA 서비스를 배포하였고, Service Mesh를 사용한 네트워크를 구성하였습니다. 그러나 Autopilot 모드는 여러 가지 커스터마이징이 불가능한 점, Service Mesh 또한 Config를 수정하지 못하는 점 등 단점이 많았습니다. 또한 비용 면에서 예상보다 높은 비용이 나와 On-premise가 비용 및 학습 측면에서 이익이 크다고 생각해 On-premise로 전환하게 되었습니다.
Raspberry Pi 5(8GB) 4대를 클러스터링하여 노드 망을 구성하였습니다. 이는 학교 네트워크 내부망에서 구현되었는데 학교 특성상 보안상 제약 조건이 많아 라우터를 설치하지 못하여 하나의 노드를 Ingress 전용 노드로 구성해 외부와 연결되게 하고, DHCP 서버를 설치하였습니다. 스위치 허브를 사용해 다른 노드들과의 LAN을 구성하고, iptables를 수정해 모든 외부를 향하는 요청이 Ingress 노드를 거치도록 하였습니다. LAN 내부에 Kubernetes Master 노드를 구성하고, CNI로는 Flannel을 VXLAN을 사용했습니다. 그러나 VNI가 이전 설정한 iptables와 충돌을 일으켜(마스커레이드) mode를 host-gw로 변경하였습니다.
MSA 환경을 효과적으로 구축하기 위해 Kubernetes를 사용했습니다. Kubernetes를 사용했을 때의 장점은 인프라 수준에서 고려해야 할 문제를 애플리케이션 레벨에서 고려할 수 있다는 것입니다. 예를 들어, Network Routing의 경우, 스위치와 라우터를 이용해 물리적으로 라우팅을 할 수도 있지만, Scaling이 자유로운 상황에서는 어렵습니다. 그러나 Kubernetes를 사용하면 CNI와 Service를 사용해서 간단히 구현할 수 있었습니다. 자원 할당 또한 Linux의 Cgroup을 통해 자동으로 구성해 주기 때문에 사용했습니다.
Kubernetes에도 NetworkPolicy와 Ingress Resource가 있지만, Auth, mTLS 적용 등의 횡단 관심사를 해결하지는 못합니다. 그렇기 때문에 Service Mesh를 사용해 횡단 관심사를 처리했습니다. RequestAuthentication을 통해 Auth를 앞단에서 처리하고 JWT 관련 로직을 각 서버에서 배제하였고, Routing과 Monitoring을 일원화했습니다.
Monitoring과 Visualization을 위해 Prometheus와 Grafana를 Prometheus community operator helm chart를 사용해 구성하였고, 로그 수집을 위해 Loki를 구성하여 Grafana와 통합하였습니다. 이를 통해 Kubernetes Cluster의 각종 메트릭을 수집할 수 있었습니다. 그러나 Istio와의 통합 과정에서 Istio가 Prometheus Metric을 공개하지 않는 문제가 있었습니다. 이는 helm 버전으로 설치한 Istio의 문제였기에, Loki를 통해 로그를 분석, 시각화를 진행하였습니다.



MSA 환경에서 비동기 처리를 위한 Event-driven Architecture와 서버 간 트랜잭션을 처리를 위해 보상 트랜잭션과 SAGA를 구성하였습니다. 이를 위해 처음에 Service별로 Domain(Aggregate)을 구성하였고, SAGA Flow Chart를 작성하였습니다. 비동기 통신은 주로 서비스 간의 결합도가 낮은 경우와 CUD 기능에서 사용하였고, Read는 gRPC 동기 통신을 주로 사용하였습니다.
MSA 환경에서 레포지토리가 다 나뉘어져 있는 상황이었기에 통합적인 CI를 구축하기 위해 Github Actions Templates를 구성하였습니다. CI는 Docker Build와 그 이미지 태그로 manifest 레포지토리를 수정하는 과정으로 이루어졌습니다. manifest 레포지토리는 GitOps의 Single Source of Truth로, ArgoCD를 통해 쿠버네티스 환경에 통합되었습니다.
인프라와 데브옵스를 중점적으로 개발하였지만, 백엔드 개발도 일부분 맡았습니다. Memorial 서버를 Spring Boot로 개발하였고, DB Schema를 효율적으로 개선하는데 이바지했습니다.