네트워크란, 두 대 이상의 컴퓨터가 상호 연결되어 있다는 의미이다. 오늘날 우리가 사용하는 인터넷이 대표적인 네트워크로, 방대한 양의 데이터를 공유할 수 있다. 네트워크를 구성하는 컴퓨터는 크게 두가지로 나누어지는데, 바로 서버와 클라이언트이다.
서버는 다수의 클라이언트에게 서비스를 제공하는 컴퓨터로, 서비스 제공을 위한 소프트웨어가 실행되는 컴퓨터를 칭한다. 당연히 클라이언트는 이러한 서비스를 사용하는 컴퓨터로 서버에 요청을 보내고 그에 대한 응답을 받는다. 즉, 클라이언트는 서비스를 request하고 서버는 그에 대한 response를 제공한다.
서버는 네트워크를 통해 클라이언트에게 정보나 서비스를 제공하는 컴퓨터 시스템이다. 단 서버는 단독으로 움직이지 않으며 불특정 다수에게 일방적으로 서비스를 제공하지는 않는다. 서버는 항상 클라이언트의 요청을 받아 작업을 수행한다. 처리 과정은 아래와 같다.
클라이언트가 서버에게 서비스를 요청한다.
서버는 요청에 필요한 처리를 수행한다.
처리결과를 클라이언트에 반환한다.
클라이언트에서 처리결과를 받는다.
컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하게 이용할 수 있는 환경을 제공해주는 프로그램들의 모임이다. 다시 말해 운영체제는 사용자와 하드웨어 간의 인터페이스로, 일종의 시스템 소프트웨어에 해당된다. 사용자와 컴퓨터를 이어주는 역할을 수행한다고 생각하면 쉽다.
① Windows
② Unix
③ Linux
웹 브라우저 등의 클라이언트로부터 HTTP요청을 받아 HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램이다. 이 때 반환되는 웹 페이지의 HTML문서는 사용자에 무관한 정적 컨텐츠여야 한다. 웹 서버는 클라이언트로부터 전달받은 웹 리소스를 저장하거나 저장된 웹 리소스를 클라이언트로 전달하는 역할을 수행한다. Apache HTTP 서버와 Nginx 서버가 대표적이다.
웹 서버(WS)가 클라이언트로부터 어떤 요청을 받았는데, 애플리케이션에 대한 로직(동적인 내용 즉, JSP, PHP 등)을 실행해야 하는 경우 그것을 실행하여 웹 서버로 다시 반환해주는 소프트웨어이다. 주로 DB조회 및 로직 실행을 위해 사용된다.
웹서버에서는 정적인 데이터를 처리하고, WAS는 동적인 데이터를 위주로 처리한다고는 하지만 사실상 WAS는 WS의 대부분의 기능을 포함하고 있기 때문에 WAS만 사용해도 큰 문제가 있지는 않다. 다만 정적인 컨텐츠와 동적인 컨텐츠를 처리하는 방법을 구분함으로써 WAS만 단독으로 이용할 때보다 빠르고 안정적인 처리가 가능해진다.
ex) Tomcat 등
Micro Service Architecture의 줄임말로 쉽게 이야기해서 하나의 큰 어플리케이션을 여러 개의 작은 어플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처이다.
MSA의 핵심은 스스로 구동될 수 있는 작은 서비스라는 점과 독립적 배포가 가능하다는 점이다. 이 말대로 MSA의 서비스는 독립적으로 배포가 가능해야 하며, 각각의 서비스는 다른 서비스에 대한 의존성이 최소화되어야 한다. 또한 각 서비스는 개별 프로세스로 구동되며, 가벼운 방식으로 통신한다.
MSA와 비견되는 개념으로 Monolithic Architecture가 있다. 여기서 Monolithic Architecture란, 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어있는 형태이다. 소규모 프로젝트에는 Monolithic이 유리하지만, 일정 규모 이상의 서비스나 수백명의 개발자가 투입되는 프로젝트에서는 한계점이 명확하다. 모놀리딕 아키텍쳐에서는 전체 시스템 구조를 파악하기 어렵고, 빌드 시간, 테스트 시간, 배포 시간이 크게 늘어나며, 부분적인 장애를 처리하기 어렵기 때문이다.
바로 이러한 문제들을 해결하기 위해 MSA 개념이 대두되었다. 서비스별 개별 배포가 가능하여 빠른 배포가 가능하고, 확장성이 용이하여 클라우드 사용에도 적합하며, 부분적 장애에 대한 격리 및 처리도 수월해진다.
컨테이너는 가상화 기술 중 하나로, OS 전체를 가상화 시키는 VM 가상화 방법이 아닌, OS 레벨의 가상화로 프로세스를 격리시켜 동작하는 방법이다. 쉽게 말해 앱이 구동되는 환경(어떤 환경에서도 애플리케이션을 실행할 수 있도록 필요한 모든 요소)까지 감싸서 한번에 실행할 수 있도록 하는 격리 기술인 것이다.
※ VM 가상화
가상 머신(VM)을 사용할 때, 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는데, 이를 VM 가상화라 한다. 즉, 윈도우 OS를 사용하는 컴퓨터에서 Ubuntu OS를 사용하고 싶을 때, 가상화 머신을 이용해 Ubuntu 전체를 가상화하여 사용한 것이다. 이 방법은 컨테이너 가상화에 비해 상대적으로 무겁고 느릴 수 밖에 없다.
컨테이너 가상화는 이러한 VM 가상화의 성능적 단점을 개선한 시스템이다. 컨테이너 기반 가상화는 도커 엔진 위에 OS 전체가 아닌, 애플리케이션 실행에 필요한 바이너리만을 적재한다. 또한 Host 커널을 공유하므로 성능이 높아진다.
아래의 그림에서 왼쪽이 VM 가상화, 오른쪽이 컨테이너 가상화이다. 왼쪽은 애플리케이션 마다 도커, OS를 가상화하여 적재하기 때문에 구조가 복잡하다. 하지만 오른쪽의 경우 도커와 Host OS가 공유되기 때문에 애플리케이션만 적재하면 된다. 결과적으로 구조가 더욱 간단해지게 된다.
컨테이너를 사용할 때 필요한 도구로 컨테이너를 쉽게 다운로드 받거나 공유 및 구동할 수 있게 도와주는 소프트웨어를 컨테이너 런타임이라 하는데, 그 중 가장 유명한 것이 바로 도커이다. 도커는 리눅스 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 도커를 사용하면 아래와 같은 이점이 있다.
이외에도 코드를 더 빨리 전달하고, 애플리케이션 운영을 표준화하고, 코드를 원활하게 이동하고, 리소스 사용률을 높여 비용을 절감할 수도 있다. Docker를 사용하면 어디서나 안정적으로 실행할 수 있는 단일 객체를 확보할 수 있다.
쿠버네티스는 컨테이너 런타임(도커 등)을 통해 컨테이너를 오케스트레이션 하는 도구이다. 여기서 오케스트레이션은 다수의 컨테이너 및 사용하는 환경 설정을 관리하는 일을 의미한다.
수 많은 연주자들이 지휘에 맞춰 연주하는 것을 “오케스트라” 라고 하듯, 수 많은 컨테이너를 지휘하는 것을 오케스트레이션이라고 하는 것이다. 이렇듯 도커가 한 개의 컨테이너를 관리하는 반면 쿠버네티스는 여러 개의 컨테이너를 서비스 단위로 관리한다. 쿠버네티스의 역할은 아래와 같다.
컨테이너의 수가 적다면 직접 재실행을 하는 것이 크게 부담스럽지 않겠지만, 아래와 같이 관리해야 하는 컨테이너의 수가 많은 경우에는 컨테이너 관리를 위한 쿠버네티스 사용이 필수적이다. 메인 컨트롤러를 이용하여 컨테이너의 배포, 관리, 확장, 네트워킹이 자동화된다.