안녕하세요. 스마일서브 KoreaV 공공클라우드 사업부 김병학 입니다.
MSA 와 Kubernetes 의 대한 개념과 각종 기능에대해서 작성및 배포까지 진행해보겠습니다.
목차
- 개요
- 기존 서버의 발전사
- 온프레미스 서버의 등장과 발전
- 가상화의 등장
- 클라우드 컴퓨팅의 도입
- 마이크로서비스 아키텍처(MSA)의 등장
- 기존 모놀리식 아키텍처의 한계
- MSA의 도입
- 쿠버네티스의( Kubernetes 또는 K8s) 의 등장 배경
- MSA 도입 후 발생한 문제점
- 컨테이너의 등장
- 쿠버네티스의 등장
- 쿠버네티스의 주요 역할과 기능
- 주요 리소스와 기능
- 쿠버네티스의 단점
- 복잡성
- 복잡한 디버깅과 트러블슈팅
- 버전 관리
1. 개요
해당 시리즈에서는 Kubernetes 의 모든것에 대해서 중점적으로 서술할 예정입니다. 제가 공부했던 내용, 그리고 Kubernetes Document 내용을 중점으로 설명할 예정입니다. 하지만 마치 교과서처럼 A~Z 까지 연속적으로 작성하기는 어렵습니다. 이유는 저도 공부하고있는 중이기 때문에 한가지 개념에서 또다른 내용이 파생될 수 있는점, 그리고 Kubernetes 는 아직 발전중인 프로그램이기에 한가지 리소스1 안에서도 여러 기능이 추가되거나 제거됩니다. 따라서 큰 틀을 만든 뒤에 부가적인 내용을 추가하는 방식으로 내용을 정리할 예정입니다.
2. 기존 서버의 발전사
Kubernetes 가 등장한 배경을 이해하기 위해서는 기존 서버의 발전사 부터 간략히 알아야 할 필요가 있습니다.
2-1. 온프레미스 서버의 등장과 발전
약 10~15년 전만 하더라도 대부분의 소프트웨어는 기업이 직접 소유하고 관리하는 물리적 서버에 설치되어 운영되었습니다. 이러한 온프레미스 서버 방식은 기업이 자체 데이터센터를 구축하고, 서버 하드웨어와 네트워크 인프라를 직접 관리해야 하는 구조였습니다. 기업은 데이터 보안, 성능, 유지보수 등을 자체적으로 책임지면서 애플리케이션을 운영하였습니다.
2-2. 가상화의 등장
온프레미스 서버 환경에서 서버 자원의 효율적 사용을 위해 가상화 기술이 등장했습니다. 가상화는 하나의 물리적 서버에서 여러 개의 가상 머신(VM)을 생성하여 자원을 분할 사용하는 기술로, 하드웨어 활용도를 높이는데 기여했습니다. 그러나 초기 가상화 기술은 대중화되지 않았고, 운영의 복잡성으로 인해 모든 기업이 채택하지는 않았습니다.
2-3. 클라우드 컴퓨팅의 도입
클라우드 컴퓨팅은 2010년대부터 본격적으로 구체화 되기 시작했습니다. 각종 기업들은 클라우드 서비스 제공업체(이하 CSP : Cloud Service Provider)가 되어 IT 인프라를 서비스로 제공하면서, 기업 또는 개인이 물리서버를 소유하지 않고도 다양한 컴퓨팅 자원을 유연하게 사용할 수 있도록하였죠. 저희 회사의 대표 서비스인 Iwinv 도 이에 포함됩니다. 클라우드 컴퓨팅은 정말 장점이 많습니다.
클라우드 컴퓨팅의 장점
- 비용 효율성 : 초기 하드웨어 투자 비용 없이 필요에 따라 자원을 사용할 수 있어 비용 측면에서 매우 효율적입니다.
- 유연성 및 확장성 : 사용량에 따라 자원을 동적으로 조정할 수 있어, 갑작스러운 트래픽 증가에도 유연하게 대응할 수 있습니다.
- 관리 부담 감소 : 인프라의 유지보수와 관리 부담을 클라우드 서비스 제공업체가 담당합니다.
클라우드의 등장은 매우 혁신적이었습니다. 기존 온프레미스로 대규모 인프라를 구축할때는 전문적인 인프라, 네트워크 엔지니어가 필요했지만 클라우드의 등장으로 상대적으로 진입장벽이 낮아지게 되었습니다. 따라서 많은 기업 및 개인은 클라우드 컴퓨팅 서비스를 많이 사용하였죠. 하지만 장점만이 있었던것은 아니었습니다.
3. 마이크로서비스 아키텍처(MSA)의 등장
3-1. 기존 모놀리식 아키텍처의 한계
전통적인 모놀리식2 아키텍처에서는 애플리케이션의 모든 기능이 하나의 큰 코드베이스 안에 포함되어 있었습니다. 이러한 구조는 초기 개발과 배포가 상대적으로 단순하지만, 아래와 같은 한계점이 존재합니다.
- 확장성 제한: 특정 기능만 확장하는 것이 어려워 전체 시스템을 확장해야 합니다.
- 유지보수 복잡성: 코드베이스가 커지면서 수정 및 유지보수가 어려워집니다.
- 신속한 배포 어려움: 작은 변경이라도 전체 애플리케이션을 재배포해야 합니다.
- 장애 격리 불가: 하나의 서비스에 장애가 발생하면 전체 시스템에 영향을 미칠 수 있습니다.
3-2. MSA의 도입
이러한 문제를 해결하기 위해 마이크로서비스 아키텍처(MSA)가 도입되었습니다. MSA는 애플리케이션을 독립적으로 배포되고 운영될 수 있는 작은 서비스들로 나누는 아키텍처 스타일입니다. 각 서비스는 특정 기능을 담당하며, 독립적으로 개발, 배포, 확장, 유지보수할 수 있습니다. 이는 클라우드 환경과 매우 잘 맞아떨어지며, 아래와 같은 장점을 제공합니다.
- 유연한 확장성: 개별 서비스 단위로 확장할 수 있어 자원을 효율적으로 사용할 수 있습니다.
- 독립적 배포: 서비스별로 독립적인 배포가 가능하여 신속한 변경과 배포가 가능합니다.
- 기술 선택의 자유: 각 서비스가 독립적으로 개발되므로, 서비스별로 최적의 기술 스택을 선택할 수 있습니다.
- 장애 격리: 하나의 서비스에 장애가 발생해도 전체 시스템에 영향을 미치지 않도록 설계할 수 있습니다.
쿨라우드 컴퓨팅의 도입은 IT 인프라의 혁신을 가져온것과 같이, 이에 따라 어플리케이션 아키텍쳐도 발전하였습니다. 자연스럽게 MSA와 같은 유연하고 확장성이 강한 아키텍처가 주목받게 되었죠. MSA는 클라우드 환경에서 장점이 극대화 되어, 현재 엔지니어 및 개발자 시장에서 매우 중요한 패러다임으로 자리 잡고있습니다.
4. 쿠버네티스의( Kubernetes 또는 K8s) 의 등장 배경
모놀리식 아케텍처의 문제를 해결하기 위해 많은 기업들이 MSA 를 도입하기 시작했습니다. MSA는 어플리케이션을 독립적으로 배포되고 운영될 수 있도록 작은 서비스를 나누는 구조입니다. 하지만 MSA 를 도입하게 되면서 또 다른 과제가 발생하게 되었습니다.
4-1. MSA 도입 후 발생한 문제점
- 서비스 관리 복잡성 : 여러 개의 마이크로서비스를 개별적으로 배포하고 관리해야 하므로, 관리자의 부담이 크게 늘었습니다.
- 서비스 간 통신 : 마이크로서비스간의 안정적이고 효율적인 통신을 보장하는 것이 어려웠습니다.
- 스케일링 및 배포 : 마이크로서비스를 독립적으로 스케일링하고 배포하는 과정이 복잡했습니다.
- 장애 복구 및 로드 밸런싱 : 마이크로서비스에 장애가 발생했을때 이를 신속히 복구하고, 트래픽을 균형 있게 분산하는 것이 어려웠습니다.
4-2. 컨테이너의 등장
이러한 문제들을 해결하기 위해 컨테이너 기술이 도입되었습니다. 컨테이너는 실행에 필요한 모든 파일을 런타임 환경에서 애플리케이션을 패키징하고 격리할 수 있는 기술입니다. 컨테이너를 활용하게 된다면 어플리케이션과 종속성 프로그램을 하나의 패키지로 묶어서 어디서나 일관되게 배포하고 실행할 수 있습니다. 지금은 많이 유명한 Docker 가 대표적인 컨테이너 도구 입니다. 하지만… 참 IT 를 하는 사람들은 똑똑하고 욕심이 많은듯 합니다. (그래서 지금과 같은 눈부신 발전을 이루어 냈겠죠?) 컨테이너 만으로는 모든것을 해결하지 못했습니다.
4-3. 쿠버네티스의 등장
한가지 비유로 컨테이너의 문제점을 설명해 보겠습니다. 만일 여러분의 오너가 여러분에게 무작위 10개의 동전을 금액별로 분류해서 바구니에 담으라한다면 수초내에 완료할겁니다. 동전이 30개가 된다면? 이것도 힘들겠지만 금방 끝내겠죠. 일을 너무 잘하는 여러분에게 오너는 100개의 동전을 주고 분류하라고 합니다. 이때부터 멘붕이 오기시작합니다. 직접 하나하나 분류하다보면 실수를 하기 마련이죠. 그래서 똑똑한 누군가가 자동 동전 분류기를 개발하기 시작하고 일을 처리합니다.
기능별로 나눈 컨테이너는 컴퓨팅 리소스를 효율적으로 활용하였지만, 그 갯수가 늘어나면서 서버관리자는 모든 컨테이너를 한 번에 관리하기 힘들어지기 시작했습니다. 마치 동전의 수가 많아질수록 분류하기 힘들어지는 것처럼요. 관리자는 한가지 시스템에서 관리할 수 있는 프로그램이 필요했습니다. 여기서 등장한 것이 바로 쿠버네티스(Kubernetes)입니다. 쿠버네티스는 자동 동전 분류기처럼, 많은 컨테이너를 효율적으로 관리하고, 배포하고, 스케일링하는 자동화된 시스템을 제공합니다.
흔히 쿠버네티스를 오케스트레이션 프로그램이라고 합니다. 오케스트레이션에는 여러 종류가 있지만, 현재 MSA 시장의 de facto standard(사실상 표준)가 된 쿠버네티스에 대해서만 설명하도록 하겠습니다.
5. 쿠버네티스의 주요 역할과 기능
쿠버네티스는 “4. 쿠버네티스의(Kubernetes 또는 K8s)의 등장 배경”에서 설명했듯이 애플리케이션의 배포, 스케일링, 운영, 장애 복구, 리소스 분배, 클러스터링을 자동화하는 오픈소스 플랫폼입니다. 쿠버네티스는 여러 리소스로 나뉘어 있습니다. 쿠버네티스에서 지원하는 각종 리소스, CNCF(Cloud Native Computing Foundation)3 에 의해 개발된 클라우드 네이티브 애플리케이션을 통하여 관리자는 보다 효율적인 인프라를 구축할 수 있습니다.
오늘은 글이 길어지게되니, 주요 리소스와 기능을 간단하게 소개하고 리소스별 자세한 기능은 다음 게시글에서 설명하도록 하겠습니다.
5-1. 주요 리소스와 기능
- Pod: 쿠버네티스의 기본 실행 단위로, 하나 이상의 컨테이너를 포함합니다.
- Service: 네트워크 서비스로, 여러 Pod를 하나의 엔드포인트로 노출합니다.
- ReplicaSet: 특정 수의 Pod를 항상 실행하도록 보장합니다.
- Deployment: 애플리케이션의 배포와 업데이트를 관리합니다.
- StatefulSet: 상태를 유지해야 하는 애플리케이션의 배포를 관리합니다.
- DaemonSet: 각 노드에서 하나의 Pod를 실행하도록 보장합니다.
- ConfigMap 및 Secret: 애플리케이션 설정과 민감한 정보를 관리합니다.
- PersistentVolume (PV) 및 PersistentVolumeClaim (PVC): 스토리지를 관리합니다.
설명한 리소스외에도 수많은 기능들이 여러분을 기다리고 있습니다. 간단한 설명인데도 강력한 기능을 제공하는것으로 보이지않나요?
6. 쿠버네티스의 단점
지금까지 설명한듯이 쿠버네티스에는 많은 장점이 있지만, 기존의 가상화기반 클라우드를 대체할 정도로 완벽한 솔루션은 아닙니다. 인프라를 관리하는 엔지니어라면 장점보다 단점을 더 중요하게 알아야 하기에 어떠한 단점이 있는지 세미나에서 들었던 내용, 커뮤니티등을 통해서 공유되는 내용을 기반으로 작성합니다.
6-1. 복잡성
쿠버네티스는 매우 강력한 기능을 제공하지만, 그만큼 복잡합니다. 설치, 구성, 운영, 유지보수 과정이 복잡하고 많은 학습량 요구합니다. 특히, 처음 접하는 사용자나 작은 팀에게는 이 복잡성이 큰 부담이 될 수 있습니다.
6-2. 복잡한 디버깅과 트러블슈팅
분산 시스템의 특성상 문제 발생 시 디버깅과 트러블슈팅이 복잡합니다. 쿠버네티스 환경에서 발생하는 문제는 여러 컴포넌트와 관련될 수 있어, 이를 추적하고 해결하는 데 많은 시간과 노력이 필요합니다.
6-3. 버전 관리
쿠버네티스는 빠르게 발전하는 기술이기 때문에, 빈번한 버전 업그레이드가 필요합니다. 새로운 기능과 보안 패치를 제공하지만, 다른 프로그램과 마찬가지로 버전을 업그레이드하는 과정에서 다양한 문제들을 발생시킬 수 있기에 관리자입장에서는 까다롭습니다.
외에도 보안 문제, 기존 어플리케이션의 마이그레이션 문제 등 수많은 단점들이 있습니다. 따라서 Kubernetes 를 사용하기전에 많은 학습과 테스트를 통하여 적절한 계획을 수립한뒤 사용해야합니다.
오늘글은 여기서 마무리 하도록 하겠습니다. 모쪼록 처음 Kubernetes 를 보시는 분들에게 도움이 되었으면 좋겠습니다.
다음 글에서 클러스터 배포와, 각 리소스를 하나하나 파해쳐 기능을 구현하는 글로 찾아뵙겠습니다.
감사합니다.
각주
|
다른글 .. |