2024. 11. 23. 18:34ㆍ개발공부/IT 잡다한 지식
기존에는 서버 하나당 하나의 물리적인 컴퓨터 자원이 필요했습니다. 하지만 이러한 1대1 대응은 효율적인 프로세스가 아니기 때문에 '하이퍼바이저' 시스템이 등장하게 됩니다. 하이퍼바이저의 등장으로 Host OS 위에 가상화 층이 올려지면서, 이 가상화층 위에 Guest OS들을 여러개로 분할하여 각각의 OS들에다 어플리 케이션을 운영하는 형태로 자리잡게 됩니다.
바로 위 사진과 같이 하이퍼바이저는 VMware, VirtualBox와 같은 가상화 전문 업체들이 제공하는 프로그램입니다. 일부 기업에서 VMware를 통해 Guest OS로 접속하여 보안 속에서 재택근무를 진행하기도 합니다.
하지만 이러한 하이퍼바이저 형식은 Host OS위에 여러개의 OS를 추가 설치하게 되면서 무겁고 속도가 느려진다는 단점을 가지게 됩니다. 또한 기존의 환경에서 새로운 테스트 환경으로 다시 프로그램을 배포할 때마다 알수없는 에러가 발생하곤 했습니다. 이러한 운영체제 환경 문제, 보안정책의 문제, 스토리지도 다 제각각이라 발생하는 문제들로 환경을 옮겨다녀도 에러없이 안정된 이주의 필요에 의해 발생한 개념이 컨테이너화(container)입니다.
독립된 컨테이너에 애플리케이션을 작동하기 위한 모든 것을 담아 사용할 수 있게 만든 것입니다.
코드, 라이브러리, CPU, 리소스 등 애플리케이션 실행에 필요한 모든 요소를 하나의 컨테이너에 모아 실행 환경(로컬, 테스트 환경 등)이 바뀌어도 안정적으로 실행할 수 있습니다.
이러한 생각을 사업화시킨회사중 하나가 도커입니다.
Container 란 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 구동파일, 라이브러리, OS 등 과 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지이며 모듈화되고 격리된 컴퓨팅 공간 또는 환경을 말합니다.
기존 Hypervisor와 Guest OS를 필요로 했던 가상머신 방식과는 달리 프로세스를 격리하며 모듈화된 프로그램 패키지로써 수행합니다.
게스트 OS가 없기때문에 동일한 운영체제 위에서 구동은 되는데 마치 격리되어 있는 환경처럼 동작하는 것을 의미합니다.
독립된 컨테이너에 애플리케이션을 작동하기 위한 모든 것을 담아 사용할 수 있게 만든 것입니다.
코드, 라이브러리, CPU, 리소스 등 애플리케이션 실행에 필요한 모든 요소를 하나의 컨테이너에 모아 실행 환경(로컬, 테스트 환경 등)이 바뀌어도 안정적으로 실행할 수 있습니다.
기존의 가상머신에 비해 가볍고 빠르게 동작할 수 있다.
여기서 가상머신과 컨테이너 중에 더 격리 수준이 높은쪽은 어디일까요? --> 가상머신
가상머신의 경우 기존의 서버에 하이퍼바이즈를 설치하고, 그 위에 가상 OS와 패키징한 VM을 만들어 실행하는 방식
--> 하드웨어 레벨의 가상화를 지원합니다.
--> 개벌 VM은 독립돤 OS를 사용하여 도커에 비해 고립성은 더 좋지만, 오버헤드가 크고 무겁고 느리다는 단점을 가집니다.
반면 컨테이너는 운영체제를 제외한 나머지 애플리케이션 실행에 필요한 모든 파일을 패키징한다는 점에서 OS레벨 가상화를 지원합니다.
-->컨테이너는 호스트의 커널을 공유하지만, 개별적인 "사용자 공간"를 가집니다.
-->가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, 네임스페이스,cgroup 를 사용함으로써 프로세스 단위의 격리 환경을 만듭니다.
컨테이너 특징
컨테이너를 사용하면 개발자는 업무를 수행하는 데 있어 다음과 같은 이점을 얻을 수 있습니다.
- 배포 및 관리
- 여러 개발자가 쉽게 복제하여 테스트, 개발 및 배포 간편화
- 다양한 운영 환경
- Linux, Windows, Mac 등 어느 환경에서나 구동
- 리소스 사용량 적음
- VM에 비해 사용하는 리소스가 적음
컨테
이너 내부 구조
컨테이너는 1개 이상의 프로세스를 격리시켜 호스트 OS 환경에 대해 알 수 없게 만들어졌습니다.
예를 들어 컨테이너는 전용의 root directory를 부여받으며, 이 안에서는 root 계정 행세를 하지만 host의 파일에는 접근할 수 없습니다. 프로세스 ID도 자신만의 것을 가지고 있어 host에서 부여한 PID는 알 수 없습니다.
격리된 루트 디렉토리에는 런타임 환경(Runtime environment)을 넣는데요. 런타임 환경이란 프로그램이 정상적으로 실행되기 위한 환경을 말하며 넓은 의미에서는 운영체제나 하드웨어도 포함됩니다.
C언어의 libc 공유 라이브러리가 대표적인 런타임 환경입니다. 다른 예로는 자바 프로그램을 실행할 때 필요한 JRE가 있으며 보통 런타임 환경은 /bin, /usr/local 등 모든 계정이 공유하는 공간에 설치됩니다.chroot를 사용하면 이런 Directory에 접근이 불가능하기 때문에 호스트의 런타임 환경을 사용할 수 없고 새로 만들어야 합니다.
Java 소프트웨어 개발 환경 비교
호스트와 구분된 런타임 환경이 있으면 개발이나 배포가 쉬워지는데요.
OpenJDK Java 1.17로 개발한 프로그램과 Oracle Java 1.8 버전으로 개발된 프로그램을 동시에 실행한다고 가정하겠습니다.
컨테이너 없이 같은 호스트에서 실행하려면, 두 가지 자바를 모두 설치해야 하고 알맞은 버전으로 빌드 해야 합니다. 그러나 컨테이너로 격리해두면 하나의 자바만 설치되어 있으므로 정확한 자바 버전을 선택하느라 신경 쓸 필요가 없어집니다.
호스트 환경은 다른 용도로 사용하다 변해버리는 경우가 있지만 컨테이너는 특정 상태를 스냅샷 해서 이용하므로 설정 환경이 바뀔 걱정이 없습니다.
컨테이너는 격리되었다는 점을 제외하면 호스트의 다른 프로세스와 크게 다를 점이 없는데요. 중간에 OS 하나가 더 낀 것이 아니라 ps로 조회할 수도 있고 kill로 종료할 수도 있습니다. 중간에 게스트 OS가 끼지 않고 호스트의 커널을 그대로 사용하므로, 가상 머신보다 실행 속도가 빠르고 관리하기도 편합니다. 하지만 커널을 공유하는 만큼 Mac이나 Windows 전용 프로그램을 Linux에서 실행하는 등의 유연성은 없습니다.
쿠버네티스란(Kubernetes) 클라우드화된 애플리케이션을 빠르게 자동적으로 배포하고, 컨테이너들의 오케스트레이션(orchestration), 스케일링 등을 제공하는 컨테이너 관리 시스템입니다.
* 오케스트레이션(orchestration)은 컴퓨터 시스템과 서비스, 애플리케이션 설정을 자동화하여 컴퓨팅 자원을 관리하고 조정하는 것으로 ‘컨테이너 오케스트레이션’은 컨테이너의 배포, 관리, 확장을 자동화하는 것을 의미합니다.
쿠버네티스는 하드웨어(HW) 등 네트워크 인프라를 내부에 자체 보유한 온프레미스(on-premise) 환경뿐만 아니라 하이브리드(hybrid), 외부 클라우드 환경에서도 운영할 수 있다. 마이크로 서비스 아키텍처(MSA: MicroService Architecture) 방식에 최적화되어 대규모 클라우드 서비스를 운영하는 데 유리하고 마이크로 서비스별로 독립적으로 실행되고 운영•관리할 수 있습니다.
쿠버네티스는 2015년부터 클라우드 네이티브 컴퓨팅 재단(CNCF)의 산하 프로젝트로 포함되어 구글, 마이크로소프트, 아마존 등 글로벌 기업들과 개인 개발자들이 공개 소프트웨어 방식으로 업데이트하고 관리한다. 또한 상업적 서비스가 중단되지 않도록 지속적으로 클라우드 플랫폼에 배포합니다.
도커란 가상실행 환경을 제공해주는 오픈소스 플랫폼 / 도커에서의 가상샐행환경을 "컨테이너" 라고 부릅니다.
즉, 도커가 하나의 큰 플랫폼이고 해당 플랫폼안에서 컨테이너들이 실행된다. 즉, 컨테이너화된 프로세스입니다.

[참고] [Cloud] # 3. 컨테이너와 도커 (Do.. : 네이버블로그 (naver.com)
[참고] [DKOS] Kubernetes 파헤치기 (1.. : 네이버블로그 (naver.com)
[참고] [네이버 지식백과] 쿠버네티스 [Kubernetes] (IT용어사전, 한국정보통신기술협회)
[참고] 쿠버네티스 입문하기 (techcourse.co.kr)