🐥 서론
웹 애플리케이션을 배포하는 미니 프로젝트가 끝났습니다.
프로젝트에서 사용한 가상머신, 도커, 이미지, 컨테이너, 쿠버네티스, Nginx의 개념을 정리해보고자 합니다.
📚 목차
- 가상머신 (Virtual Machine, VM)
- 도커 (Docker)
- 이미지 (Image)
- 컨테이너 (Container)
- 쿠버네티스 (Kubernetes)
5-1. 클러스터 (Cluster)
5-2. Pod
5-3. 디플로이먼트 (Deployment)
5-4. 서비스 (Service)
5-5. 인그레스 (Ingress)
- Nginx
1. 가상머신 (Virtual Machine, VM)
- 실제 컴퓨터(호스트) 위에 설치된 소프트웨어
- 하나의 물리적 서버에서 여러 개의 가상 컴퓨터를 실행할 수 있게 한다.
- 각 가상머신은 독립적인 운영체제(OS)를 실행할 수 있어 물리적 컴퓨터처럼 동작한다.
- 대표적인 가상머신 관리 소프트웨어: VirtualBox, VMware 등등
- Virtualbox 안에 Ubuntu 서버를 설치하고 사용할 수 있다. 이 Ubuntu 서버는 호스트 컴퓨터의 OS(e.g. Windows 10)와는 별도로 작동한다.
- 가상머신 설정 및 관리 도구: Vagrant
vagrant up 명령어를 사용하면 Vagranfile에 정의된 VM을 자동으로 생성하고 실행한다.
- e.g. Vagrantfile에 Ubuntu 서버 설정을 작성한 후,
vagrant up을 실행하면 해당 설정에 맞춘 가상머신이 자동으로 실행된다.

2. 도커 (Docker)
- 컨테이너를 쉽게 생성하고 관리할 수 있는 플랫폼
- 도커를 사용하면 애플리케이션을 컨테이너로 패키징할 수 있고, 이를 통해 애플리케이션이 어느 환경에서나 동일하게 동작할 수 있다.
- e.g. 도커를 이용해 React 기반의 프론트엔드 애플리케이션을 컨테이너로 만들고, 이를 Docker Hub라는 저장소에 올릴 수 있다. 이후 다른 개발자가 이 컨테이너를 다운로드하여 애플리케이션을 실행할 수 있다.

3. 이미지 (Image)
- 컨테이너를 실행하기 위한 청사진 (템플릿)
- 도커 이미지는 일반적으로 Dockerfile을 통해 생성된다. Dockerfile에는 베이스 이미지, 필요한 패키지 설치, 환경 변수 설정 등이 정의되어 있다.
- e.g. Node.js 기반 백엔드 애플리케이션을 위한 도커 이미지를 생성하고, 이 이미지를 사용해 여러 개의 컨테이너를 실행할 수 있다.
docker build 명령어로 애플리케이션의 이미지를 만들고, 이 이미지를 Docker Hub에 Push한 후 다른 환경에서 사용할 수 있다.

4. 컨테이너 (Container)
- 애플리케이션과 그 의존성을 패키징하여 일관된 환경에서 실행할 수 있게 하는 가상화 기술
- 가상머신은 전체 OS를 가상화하는 반면, 컨테이너는 호스트 OS의 커널을 공유하고 애플리케이션과 그에 필요한 라이브러리 및 설정을 포함해 훨씬 가볍고 빠르다
- 컨테이너는 마치 작은 박스 안에 애플리케이션을 패키징해서 어디서든 동일한 환경에서 실행할 수 있도록 만드는 도구라고 볼 수 있다.

- 가장 많이 사용되는 컨테이너 플랫폼: 도커 (Docker)
- e.g. 프론트엔드(React)와 백엔드(FastAPI) 애플리케이션을 각각의 컨테이너로 실행해 동일한 환경을 유지하며 개발 및 배포할 수 있.
5. 쿠버네티스 (Kubenetes)
- 컨테이너화된 애플리케이션을 자동으로 배포하고 관리하는 오픈소스 플랫폼
- 컨테이너를 확장하고 복구하는 기능을 제공해 애플리케이션의 가용성과 확장성을 보장한다.

5-1. 클러스터 (Cluster)
- 쿠버네티스가 관리되는 컨테이너화된 애플리케이션을 실행하는 노드(Node) 집합
- 클러스터는 마스터 노드와 워커 노드로 구성되며, 애플리케이션의 컨테이너들을 여러 노드에 분산시켜 실행한다
- e.g. 쿠버네티스 클러스터를 통해 여러 서버(Node)에 프론트엔드와 백엔드 애플리케이션의 컨테이너를 분산하여 실행할 수 있다.

5-2. Pod
- 쿠버네티스에서 컨테이너가 실행되는 최소 단위
- 하나의 Pod는 하나 이상의 컨테이너를 포함할 수 있으며, 동일한 네트워크 환경과 스토리지를 공유한다.
- Pod는 생성되면 각 노드에 배치되고, 필요한 경우 자동으로 복구된다
- e.g. 백엔드 애플리케이션을 실행하는 컨테이너를 하나의 Pod로 정의할 수 있다. 만약 애플리케이션에 문제가 발생하면 쿠버네티스가 새로운 Pod을 생성하여 자동으로 복구한다.

5-3. 디플로이먼트 (Deployment)
- 애플리케이션의 여러 Pod들을 관리하고 업데이트하는 쿠버네티스 리소스
- 애플리케이션을 중단없이 배포할 수 있다
- e.g. 프론트엔드 애플리케이션을 실행하는 컨테이너를 여러 Pod으로 배포하고, 새로운 버전으로 업그레이드할 때 디플로이먼트를 사용하면 자동으로 롤링 업데이트를 수행한다.

5-4. 서비스 (Service)
- 쿠버네티스에서 실행 중인 Pod들을 네트워크 상에 노출하는 방법
- Pod의 IP 주소가 변경되더라도 서비스는 고정된 엔드포인트를 제공해 안정적으로 Pod에 접근할 수 있게 한다.
- e.g. 백엔드 애플리케이션을 여러 Pod으로 배포한 후, 서비스가 이를 묶어 외부에서 일정한 주소로 접근할 수 있게 한다

5-5. 인그레스 (Ingress)
- 클러스터 외부에서 클러스터 내부 서비스로 접근하는 요청들을 어떻게 처리할 지 정의해둔 규칙들의 모음
- 인그레스가 제공하는 기능
- 외부에서 접속 가능한 URL 사용
- 트래픽 로드밸런싱
- SSL 인증서 처리
- 도메인 기반 가상 호스팅 제공
인그레스는 기능들을 정의해둔 리소스이고, 이를 실제로 동작하기 위해서는 인그레스 컨트롤러가 필요한다
인그레스 컨트롤러 (Ingress Controller)
- 클러스터에서 실행되고 수신 리소스에 따라 HTTP 로드 밸런서를 구성하는 응용 프로그램
- 인그레스 리소스가 작동하려면, 클러스터는 실행 중인 인그레스 컨트롤러가 반드시 필요하다.
- 인그레스 컨트롤러는 자동으로 실행되지 않고 상황에 맞게 적합한 컨트롤러를 선택해 설치해야 한다.
- 쿠버네티스에서는 GCE(Google Compute Engine)와 NGINX를 오픈소스로 제공하고 있다.
6. Nginx
- 경량 Web Server (인터넷을 기반으로 클라이언트에게 웹 서비스를 제공하는 컴퓨터 혹은 프로세스)
- 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다.