들어가기 앞서..
해당 포스트는 "쿠버네티스 인 액션"을 공부하며 중요하다고 생각되는 내용을 정리한 것입니다.
학습 목표
쿠버네티스는 애플리케이션을 격리하는 기능을 제공하기 위해 리눅스 컨테이너 기술을 사용한다. 쿠버네티스를 공부하기 전 컨테이너 기본 개념과 가상머신과의 차이를 이해한다.
컨테이너
구글 클라우드의 설명을 빌려 컨테이너를 정의하자면 아래와 같다.
컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지입니다.
- 컨테이너에서 실행되는 프로세스는 다른 모든 프로세스와 마찬가지로 호스트 운영체제 내에서 실행된다. (프로세스가 별도의 운영체제에서 실행되는 가상머신과 다르다.)
- 그러나 컨테이너의 프로세스는 여전히 다른 프로세스와 격리되어 있다.
- 프로세스 입장에서 보면 시스템과 운영체제에서 실행되는 유일한 프로세스인 것처럼 보인다.
- 시스템 프로세스를 실행하여 추가 컴퓨팅 리소스가 필요한 가상머신과는 다르게 컨테이너는 호스트 OS에서 실행되는 하나의 격리된 프로세스에 지나지 않으며, 애플리케이션이 소비하는 리소스 외 추가 프로세스의 오버헤드는 없다.
가상머신과 컨테이너 차이
가상머신은 완전히 분리된 운영체제가 실행되고 동일한 베어메탈 하드웨어[1]를 공유하게 된다. 이런 가상머신 아래에는 물리적 하드웨어 리소스를 각 가상머신 내부의 운영체제에서 사용할 수 있는 더 작은 리소스를 나누는 호스트 OS와 하이퍼바이저가 있다.
가상머신 내에서 실행되는 애플리케이션이 가상머신의 게스트 OS 커널에 대한 시스템 콜을 수행하면, 커널은 하이퍼 바이저로 호스트의 물리적 CPU에서 x86 명령을 수행한다.
참고 : 호스트 OS가 필요하지 않은 Type 1 하이퍼바이저와 필요한 Type 2 하이퍼바이저가 있다.
컨테이너는 호스트 OS에서 실행되는 동일한 커널에서 시스템 콜을 수행한다. 커널은 유일하며, 호스트 CPU에 x86 명령을 수행하는 유일한 커널이다. 중요한 점은 가상머신과 다르게 모두 동일한 커널을 호출한다는 것이다.
컨테이너 격리 메커니즘
리눅스의 컨테이너 격리는 두 가지 메커니즘으로 가능하다.
첫 번째는 리눅스 네임스페이스(namespace)로 각 프로세스가 시스템에 대한 독립된 뷰만 볼 수 있도록 한다. 두 번째는 리눅스 컨트롤 그룹으로 프로세스가 사용할 수 있는 리소스의 양을 제한한다.
- 리눅스 네임스페이스로 프로세스 격리
리눅스 시스템은 초기 구동 시 하나의 네임스페이스가 있다. 파일시스템, 프로세스 ID, 사용자 ID, 네트워크 인터페이스 등과 같은 모든 시스템 리소스는 하나의 네임스페이스에 속한다. 추가로 네임스페이스를 생성하고 리소스를 구성하는 것도 가능하다.
프로세스를 실행할 때 해당 네임스페이스 중 하나에서 프로세스를 실행한다. 프로세스는 동일한 네임스페이스 내에 있는 리소스만 볼 수 있다. (프로세스는 여러 네임스페이스에 속할 수 있다.)
네임스페이스 종류
- 마운트(mnt)
- 프로세스 ID(pid)
- 네트워크(net)
- 프로세스 간 통신(ipc)
- 호스트와 도메인 이름(uts)
- 사용자 ID(user) - 리눅스 컨트롤 그룹(cgroups)로 리소스 제한
나머지 부분은 컨테이너가 사용할 수 있는 시스템 리소스 양을 제한하는 것이다. 프로세스 혹은 프로세스 그룹의 리소스 사용을 제한하는 리눅스 커널기능인 cgroups로 이뤄진다.
프로세스는 설정된 양 이상의 CPU, 메모리, 네트워크 대역폭 등을 사용할 수 없다. 이런 방식으로 프로세스는 다른 프로세스용으로 예약된 리소스를 사용할 수 없으며, 이는 각 프로세스가 별도의 시스템에서 실행될 때와 비슷하다.
용어정리
1. 베어메탈 머신
어떤 소프트웨어도 설치되어 있지 않은 하드웨어 자체를 의미하지만, 클라우드가 보편화되면서 가상화되지 않은 머신을 의미하기도 한다.
Reference
- 쿠버네티스 인 액션 (도서)
- 구글 클라우드
'인프라 | CICD > Kubernetes' 카테고리의 다른 글
쿠버네티스 - 도커와 쿠버네티스 (1) | 2024.02.13 |
---|