컨테이너 사용의 장점
- 마이크로 서비스 기반의 아키텍처에서 매우 효율적
- 애플리케이션 경량화
- 자원 활용의 효율성
마이크로 서비스의 장점
- PloyGlot
- 각 기능에 대해 알맞은 프로그래밍 언어를 사용할 수 있다.
- UI: node.js
- Catalog: Go
- Order: PHP
- 애자일
- 개발팀은 각 컴포넌트의 개발에만 집중할 수 있다.
- 모노리틱 서비스의 경우 전체 구조를 전부 이해해야 하지만, 마이크로 서비스는 Job을 컴포넌트로 구분지어 CI/CD 측면과 애자일 개발 워크플로에 매우 도움이 된다.
- 스케일링
- 위 사진에서 ORDER 서비스에 bottleneck 현상이 발생하면, 해당 컴포넌트만 개별적으로 스케일 업 할 수 있다.
- 비슷한 예로, ORDER 서비스에 문제가 생겨 다운이 되더라도, CATALOG와 같은 다른 서비스에 영향이 가지 않는다.
마이크로 서비스와 컨테이너
컨테이너는 애플리케이션 코드를 패키징할 수 있는 경량화, 정형화된 유닛이다. 따라서 마이크로 서비스 기반의 아키텍처에서 컨테이너는 그 목적을 잘 달성할 수 있게 해준다.
컨테이너 표준화 방법
컨테이너는 애플리케이션 코드, 라이브러리, configuration 등 OS를 제외한 실행을 위한 모든 것을 포함한다.
// DockerFile
FROM node:16
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["node", "server.js"]
위와 같은 도커 파일은 어떻게 컨테이너를 구성할지를 보여준다.
FROM
: base image
WORKDIR
: 작업 디렉토리를 지정
COPY
: 호스트 머신의 현재 경로의 package.json을 작업 디렉토리에 복사
RUN
: npm install 명령어를 실행하여 package.json에 정의된 모든 Node.js 패키지를 설치
COPY
: 호스트의 현재 디렉토리에 있는 모든 파일을 작업 디렉토리로 복사
CMD
: 컨테이너가 시작될 때 실행할 기본 명령어
이러한 과정을 거쳐 컨테이너(도커) 이미지를 생성한다.
도커는 `OCI(open container initiative)` 규격을 준수한다. 위와 같은 도커파일의 작성은 OCI 이미지 파일 규격을 따라 작성한 것이라고 할 수 있다.
이렇게 빌드된 이미지는 `docker cli` 등을 통해 컨테이너를 실행할 수 있는데, `docker cli`는 OCI를 준수하는 컨테이너 런타임 및 이미지 관리 도구인 `containerd`와 실제 컨테이너의 생성과 실행에 관여하는 `runc`를 거쳐 컨테이너를 시작할 수 있다.
이렇듯 OCI 규격은 이미지 빌드뿐 아니라 실행에 있어서도 다양한 솔루션을 제공한다.
쿠버네티스는 이렇게 생성된 이미지를 `레지스트리`에서 관리하고 pull 한 후, 직접 실행 시킬 수도 있다. 이 과정에서 쿠버네티스는 `CRI(container runtime interface)`를 사용하는데, 이 `CRI`가 쿠버네티스가 다른 컨테이너 런타임과 함께 동작하며 컨테이너를 시작할 수 있게 해준다.OCI 런타임인 `containerd`와 `CRI-O`는 이러한 CRI를 구현하며 OCI를 준수하는 컨테이너 런타임이다. 이렇게 쿠버네티스는 컨테이너 이미지를 `레지스트리`에서 관리하고, 이 이미지를 `CRI`를 사용해 컨테이너를 실행시킨다.
컨테이너의 자원 효율성
컨테이너를 설명할 때 자주 등장하는 그림이다.
실행중인 컨테이너들은 OS 레벨의 커널을 공유한다. 이는 각 컨테이너들이 고유의 OS를 갖출 필요가 없다는 것을 의미하고 각 컨테이너가 실행할 때 필요한 코드와 configuration 등을 가지고 자원을 공유하기 때문에 훨씬 가볍다.
반면 VM 기반에서는 하이퍼바이저 상의 VM이 고유의 OS를 가져야 하는 것을 볼 수 있다. 따라서 VM은 더 무겁고 자원 효율성 측면에서 컨테이너보다 성능이 떨어진다.
출처: https://www.youtube.com/watch?v=q_bQeXhWxZM
'k8s' 카테고리의 다른 글
[EKS] Amazon EKS - Amazon EKS Explained (0) | 2024.07.07 |
---|---|
[EKS] EKS - Kubernetes Pods, ReplicaSets, and Deployments (0) | 2024.07.05 |
[EKS] Amazon EKS - What is Kubernetes? (0) | 2024.07.04 |
[k8s] Kubernetes Overview (0) | 2024.06.14 |