PROGRAMING/BACKEND DEV

MSA와 DevOps

o_deok 2021. 4. 7. 20:14

 

후배에게서 오랜만에 연락이 왔다. 취업 준비를 하고 있는데 자격 요건 Better 항목의 시스템 운영과 관련된 여러 용어들이 무엇을 의미하는 건지 감이 잘 안잡힌다고. 시스템 운영에 대한 작은 경험만 있으면 충분히 그 의미가 와닿을 수 있겠지만, 인턴 경험이 없는 경우라면 충분히 겉돌게 느껴질 수 있다. 그래서 지난 1년간 회사에서 담당한 서비스를 운영하면서 알게 되었던 운영 기본 개념을 정리해서 포스팅하고자 한다. 1년전의 나처럼 갓 입사해 모든 용어들이 낯설 수 있는 분들을 위해서. 물론 나는 DevOps엔지니어가 아니기에 깊은 수준의 지식까진 모르고 "개념" 정도만 설명한다.

 

1. MSA란?

Software를 구축하기 위한 아키텍쳐로, 어플리케이션을 최소 구성 요소인 "서비스" 단위로 분할하여 운영하는 방법이다. 하나의 거대한 어플리케이션을 핵심 기능별로 굳이 세분화한 것이다.

 

그렇다면 간단하게 하나의 어플리케이션에 모든 기능들을 포함시키지 않고, 왜 "굳이" 서비스별로 쪼개어 관리하려고 하는 것일까?

 

회사마다 프로젝트 팀마다 개발 환경 혹은 추구하고자 하는 목표 등이 다르기마련이지만 MSA를 채택하게 될 경우 얻을 수 있는 이점이 꽤나 많다.

 

1. 장애가 발생할 경우 각 서비스마다 독립적으로 발생하기에 시스템 전체가 마비되지 않는다.
→ 개발을 하면서 시스템의 몸집이 커질 수록 장애에 대한 리스크가 더욱 커지기 마련인데, MSA를 채택하게 될 경우 중요 서비스 별로 별도로 관리할 수 있어 특정 서비스의 장애가 타 서비스에 영향을 주지 않는다.

2. 각 서비스 별로 개발자가 편한 언어로 개발할 수 있다.
→ 이 또한 서비스 별로 "독립적"으로 운영할 수 있게 얻을 수 있는 이점이다. 

3. 서비스 확장성이 용이하다.
→ 새로운 서비스를 추가하게 될 경우 독립적으로 개발하여 배포하면 되기 때문에 확장성이 좋다.

 


2. Kubernetes란?

하나의 어플리케이션을 뒤늦게 서비스 별로 여러 개의 어플리케이션으로 나누는 것은 쉽지 않다. 나누는 것도 문제이거니와 배포, 운영, 모니터링 등 여러 관리 포인트가 늘어나기 때문이다. 쿠버네티스는 MSA환경에서도 관리 포인트를 줄여주는 역할을 한다. 독립적인 서비스를 Docker컨테이너를 활용하여 배포하고, Kubernetes를 활용하여 비교적 쉽게 운영할 수 있다. 

1. 여러 개의 컨테이너(MSA에선 독립적인 서비스 별 컨테이너)를 한번에 관리해준다.


2. 특정 컨테이너에 장애 발생 시 자동으로 복구해주며, 쉽게 롤백할 수 있다.


3. 동일한 컨테이너를 여러 개 띄우면 로드밸런싱 해준다.

필자의 회사에선 Kubernetes를 AWS EKS cluster를 통해 활용하고 있다.

 


3. DevOps란?

어플리케이션을 관리할 때 크게 개발과 운영으로 나눌 수 있다. 개발자가 새로운 기능을 개발하고 빌드된 파일을 관리자가 운영에 적용하는 방식이다. 하지만 근래에 들어서 이들을 따로 구분짓지 않는 듯한 모습을 볼 수 있다. 최소한 내가 입사했을 땐 이미 DevOps를 적용한 이후였다. 그렇다면 DevOps를 적용하게 될 경우 얻는 이점은 무엇일까?

1. 배포주기가 줄어들어 빠른 신규 서비스 적용과 장애 대응을 할 수 있다.
→ 개발자와 운영자의 역할을 분리하지 않아(혹은 더욱 밀접하게 협업할 수 있어) 서비스 개발자가 테스트, 배포, 운영 모니터링까지 빠르게 진행할 수 있으므로 시장에 빠르게 대응할 수 있다.

2. CI, CD, 모니터링을 통해 안정적인 서비스 품질을 보장할 수 있다.
→ DevOps환경을 구축하기 위해 CI, CD툴을 활용하여 보다 불필요한 장애 발생 가능성을 낮춰 안정적인 서비스 품질을 보장해준다.

 

A. CI (Continuous Integration) - Jenkins

Jenkins를 통해 새로운 코드를 테스트, 빌드하여 빌드파일을 생성한다.

 

B. CD (Continous Delivery) - Argo

Jenkins를 통해 빌드파일을 생성하면 이를 여러 인스턴스에 배포를 해야하는데 이때 Argo를 통해 작업한다. Argo는 Kubernetes에 친화적인데,  원격 repository에 존재하는 manifest(운영에 관련된 파일)를 조회하고 Kubernetes의 manifest를 비교하여 변경된 흔적이 있으면 Kubernetes에 반영하여 Sync를 맞춰준다.