본문 바로가기

Kubernetes(k8s)/컨테이너란?

컨테이너

1.        Container

 

         1.1.        정의

 

정확하게 말하면 운영체제에서 실행되는 프로세스를 격리(Isolation)하여 별도의

실행 환경을 제공해주며, 해당 프로세스는 운영체제 상에서 실행되는 유일한

프로세스인 것처럼 작동하는 기술이다.

즉, 운영체제에서 실행되는 여러 프로세스는 컨테이너라는 개념으로 격리되어 별도의 운영 환경을 제공해주는 기술이다.

 

소프트웨어는 OS와 라이브러리에 의존성을 띤다. 그러므로 하나의 컴퓨터에서

성격이 다른(OS,라이브러리 버전이 다른) 소프트웨어를 한번에 실행할 때

어려움을 가질 수 있고, 관련된 구성을 관리하기가 어렵다. 컨테이너(Container)는

개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경

또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의

격리 기술을 말합니다. 컨테이너는 애플리케이션을 실제 구동 환경으로부터

추상화할 수 있는 논리 패키징 메커니즘을 제공한다.

 

         1.2.        컨테이너 vs 가상 머신

     가상 머신

HyperVisor. 이는 컴퓨터가 가지고 있는 인프라 리소스들에 대해 VM별로 배분 하는 역할들을 한다. 또한 각 VM에서는 독립적인 Guest OS를 가지고 있다.

따라서 독립적인 플랫폼을 하나씩 증가시킬 때마다 불필요한 OS를 만드는 작업에 대해서 계속해서 해야한다. 즉, 확장성이 떨어진다. 또한 메모리나 자원에 관해서 유동적으로 관리 되는게 아니라 처음부터 정해놓고 실행하기에 비효율적이다.

 

     컨테이너

컨테이너의 경우 하나의 host OS위에서 마치 각각의 독립적인 프로그램처럼

관리되고 실행된다. 불필요한 OS 만드는 작업 및 Infra를 독립적으로 나눌 필요가 없어서 확장이 좋고 빠르다

 

         1.3.        장점

 

가상 머신은 하드웨어 스택을 가상화한다. 컨테이너는 이와 달리 OS를 가상화하여

여러 개의 컨테이너를 OS커널에서 직접 실행한다. 컨테이너는 기존의 가상화

기술보다 훨씬 가볍게 동작하며, OS 커널을 공유하고, 시작 시간이나 종료 시간이

빠르고, 메모리를 훨씬 적게 차지한다.

 

     가벼운 가상화 기술

가상화와 비교하면 컨테이너는 OS 없이 프로세스와 파일 시스템을 분리하는

형태이기 때문에 크기가 작고 가볍다. 또한 가상화를 위한 하드웨어

에뮬레이트(emulate) 단계 없이, 분리된 공간을 만들기 때문에 오버 헤드가

줄어든다.

 

     높은 집적도

여러 개의 컨테이너를 만들어서 실행 중이라고 해도 OS는 하나이므로, 가상머신에

비해 고밀도화가 가능하다. 또한 컨테이너에서는 실행되는 프로세스를 위한

메모리만 필요하기 때문에 낮은 사양의 환경에서 더욱 활용도가 높아진다.

 

     작은 이미지 크기

가상화 기술은 가상머신마다 OS(게스트 OS)가 필요하다. 따라서 VM의 실행에 필요한 이미지 파일(vm 이미지)은 애플리케이션과 실행에 필요한 라이브러리 그리고 게스트 OS가 포함되어 있다. 반면 컨테이너는 호스트 OS를 사용하여 시작한다. 가상머신과는 달리 게스트 OS는 포함하지 않기 때문에 VM 이미지와 보다 파일 크기가 작아 이동성이 우수하다.

 

     이동성 (PORTABILITY)

컨테이너는 이동성이 높기 때문에 개발자가 자신의 PC에서 만든 컨테이너를

그대로 퍼블릭 클라우드에 가져가 실행할 수 있다. 이로 인해 대량의 마이크로

서비스의 빠르고 효율적인 배치 및 서비스 단위로 유연한 확장이 가능하며,

마이크로 서비스를 통해 얻는 효과를 극대화 할 수 있다.

 

     빠른 시작과 종료 시간

컨테이너는 실행 된 OS에서 응용 프로그램 본체와 미들웨어를 실행하기만 하면 되기 때문에 응용 프로그램의 시작 시간은 VM보다 크게 단축한다.

컨테이너를 실행하는 것은 OS 입장에서 보면 단순하게 프로세스를 시작하는 것이기 때문에 일반적인 프로세스가 시작하는 것과 별반 차이가 없다. 즉 매우 빠르게 시작 할 수 있다.

 

     일관성 있는 환경

개발자는 컨테이너를 이용해, 다른 애플리케이션과 분리된 애플리케이션에 최적화된 환경을 생성할 수 있다. 컨테이너는 애플리케이션에 필요한 소프트웨어 종속 항목(프로그래밍 언어 런타임 및 기타 소프트웨어 라이브러리의 특정 버전 등)도 포함할 수 있다. 그 결과 자연히 생산성이 향상될 수 밖에 없다. 개발자와 IT 운영팀이 버그를 잡고 환경 차이를 진단하던 시간을 줄이고 사용자에게 신규 기능을 제공하는 데 집중할 수 있기 때문이다.

 

     다양한 운영 환경 지원

컨테이너는 Linux, Windows, Mac OS, 가상 머신, 베어메탈, 개발자 PC,

데이터센터, 온프레미스 환경, 퍼블릭 클라우드 등 사실상 어느 환경에서나

구동되므로 개발 및 배포가 크게 쉬워진다. 계층화된 이미지 형식으로 사용되기

때문에 이동성도 매우 뛰어나다. 소프트웨어 구동 환경이 무엇이든 컨테이너를

사용할 수 있다.

 

     가상 OS 형태로 독립 환경 제공

컨테이너는 CPU, 메모리, 스토리지, 네트워크 리소스를 OS 수준에서 가상화하여 개발자에게 기타 애플리케이션으로부터 논리적으로 분리된 OS 샌드박스 환경을 제공한다.

 

     배포 편의성

컨테이너를 사용하면 애플리케이션과 종속 항목을 버전 제어가 쉬운 하나의 패키지로 묶어 팀 내의 여러 개발자가 쉽게 복제하고 클러스터 내의 머신으로도 간편하게 복사할 수 있다. 이를 서비스 기반 아키텍처와 결합하면 개발자들이 논리성을 판단해야 하는 단위 자체가 훨씬 작아지므로 민첩성과 생산성이 크게 향상된다. 그 결과 애플리케이션의 개발 및 테스트, 배포, 전반적인 관리가 훨씬 쉬워진다.

 

 

         1.4.        Lxc vs Docker

Docker는 전통적인 Linux 컨테이너와는 다르다. Docker 기술은 처음에는 LXC 기술을 기반으로 개발되었지만 이후에는 이러한 종속 관계를 벗어났다. 하지만 대부분의 사람들은 전통적인 Linux 컨테이너와 연결 지어 생각한다. LXC는 경량의 가상화 방법으로 유용했지만 뛰어난 개발자 또는 사용자 환경을 제공하지는 못했다. Docker 기술은 컨테이너를 실행하는 기능 이상의 다양한 기능을 제공한다. 특히 컨테이너 생성과 구축, 컨테이너 이미지, 이미지 버전 관리 등의 프로세스를 용이하게 해준다. 전통적인 Linux 컨테이너는 여러 프로세스를 관리할 수 있는 init 시스템을 사용한다. 즉, 전체 애플리케이션을 하나로 실행할 수 있다. Docker 기술은 애플리케이션을 개별 프로세스로 세분화하도록 권장하고 이를 위한 툴을 제공한다. 이러한 세분화된 접근 방식에는 장점이 있다.