컨테이너 인프라 환경이란
리눅스 운영 체제의 커널 하나에서 여러 개의 컨테이너가 격리된 상태로 실행되는 인프라 환경을 말한다.
컨테이너
하나 이상의 목적을 위해 독립적으로 작동하는 프로세스이다.
개인 환경(개인 PC)에서는 1명의 관리자(사용자)가 다양한 프로그램을 사용하므로 각각의 프로그램을 컨테이너로 구현할 필요가 없다. 하지만 기업 환경에서는 다수의 관리자가 수백, 수천대의 서버를 함께 관리하기 때문에 일관성을 유지하는 것이 매우 중요하다.
여러 사람이 만져서 설정의 일관성이 떨어진 서버를 SnowFlake Server(눈송이 서버)라고 한다.
이런 경우에 컨테이너 인프라 환경을 구성하면 효과적이다.
또한 가상화 환경에서는 각각의 가상 머신이 모두 독립적인 운영체제 커널을 가지고 있어야 하기 때문에 그만큼 자원을 더 소모해야 하고 성능이 떨어질 수밖에 없다.
하지만 컨테이너 인프라 환경은 운영체제 커널 하나에 컨테이너 여러 개가 격리된 형태로 실행되기 때문에 자원을 효율적으로 사용할 수 있고 동작이 거치는 단계가 적어서 속도도 훨씬 빠르다.
아래 그림은 VM을 사용한 애플리케이션의 구조와 컨테이너를 사용한 애플리케이션의 구조 차이를 나타낸 것이다.
전통적인 배포: 초기에는 애플리케이션을 물리 서버에서 직접 실행했었다. 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기에, 리소스 할당의 문제가 발생했다. 예를 들어 물리 서버 하나에서 여러 애플리케이션을 실행하면, 리소스 전부를 차지하는 애플리케이션 인스턴스가 있을 수 있고, 결과적으로는 다른 애플리케이션의 성능이 저하될 수 있었다. 이에 대한 해결책은 서로 다른 여러 물리 서버에서 각 애플리케이션을 실행하는 것이 있다. 그러나 이는 리소스가 충분히 활용되지 않는다는 점에서 확장에 어려움이 있었고, 물리 서버를 많이 유지하기 위해서 기업은 많은 비용이 들이게되었다.
가상화 배포: 그 해결책으로 가상화가 도입되었다. 이는 단일 물리 서버의 CPU에서 여러 가상 시스템 (VM)을 실행할 수 있게 한다. 가상화를 사용하면 VM간에 애플리케이션을 격리하고 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스 할 수 없으므로, 일정 수준의 보안성을 제공할 수 있다.
가상화를 사용하면 물리 서버에서 리소스를 보다 효율적으로 활용할 수 있으며, 쉽게 애플리케이션을 추가하거나 업데이트할 수 있고 하드웨어 비용을 절감할 수 있어 더 나은 확장성을 제공한다. 가상화를 통해 일련의 물리 리소스를 폐기 가능한(disposable) 가상 머신으로 구성된 클러스터로 만들 수 있다.
각 VM은 가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성 요소를 실행하는 하나의 완전한 머신이다.
컨테이너 인프라: 컨테이너는 VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제(OS)를 공유한다. 그러므로 컨테이너는 가볍다고 여겨진다. VM과 마찬가지로 컨테이너에는 자체 파일 시스템, CPU 점유율, 메모리, 프로세스 공간 등이 있다. 기본 인프라와의 종속성을 끊었기 때문에, 클라우드나 OS 배포본에 모두 이식할 수 있다.
다음은 컨테이너만의 이점들이다.
- 융통성있는 애플리케이션 생성과 배포: VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적임.
- 지속적인 개발, 통합 및 배포(CI/CD): 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 (이미지의 불변성 덕에) 빠르고 효율적으로 롤백할 수 있다.
- 개발과 운영의 관심사 분리: 배포 시점이 아닌 빌드/릴리스 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에, 애플리케이션이 인프라스트럭처에서 분리된다.
- 가시성(observability): OS 수준의 정보와 메트릭에 머무르지 않고, 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있다.
- 개발, 테스팅 및 운영 환경에 걸친 일관성: 랩탑에서도 클라우드에서와 동일하게 구동된다.
- 클라우드 및 OS 배포판 간 이식성: Ubuntu, RHEL, CoreOS, 온-프레미스, 주요 퍼블릭 클라우드와 어디에서든 구동된다.
- 애플리케이션 중심 관리: 가상 하드웨어 상에서 OS를 실행하는 수준에서 -> 논리적인 리소스를 사용하는 OS 상에서 애플리케이션을 실행하는 수준으로 추상화 수준이 높아진다.
- 느슨하게 묶이고, 분산되고, 유연하며, 자유로운 마이크로서비스: 애플리케이션은 단일 목적의 머신에서 모놀리식 스택으로 구동되지 않고 보다 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있다.
- 리소스 격리: 리소스를 격리함으로써 애플리케이션 성능을 예측할 수 있다.
- 리소스 사용량: 고효율, 고집적(필요할 떄 최대한 끌어다 사용)
하이퍼 바이저란?
하이퍼바이저는 가상 머신(Virtual Machine, VM)을 생성하고 구동하는 소프트웨어이다.
가상 머신 모니터(Virtual Machine Monitor, VMM)라고도 불리는 하이퍼바이저는 하이퍼바이저 운영 체제와 가상 머신의 리소스를 분리해 VM의 생성과 관리를 지원한다.
하이퍼바이저로 사용되는 물리 하드웨어를 호스트라고 하며 리소스를 사용하는 여러 VM을 게스트라고 한다.
하이퍼바이저는 CPU, 메모리, 스토리지 등의 리소스를 처리하는 pool로 생각할 수 있다.
따라서 기존 게스트 또는 새로운 가상 머신에 리소스들을 쉽게 재배치할 수 있다.
모든 하이퍼바이저에서 VM을 실행하려면 메모리 관리 프로그램, 프로세스 스케줄러, I/O(입력/출력) 스택, 기기 드라이버, 보안 관리 프로그램, 네트워크 스택과 같은 운영 체제 수준의 구성 요소가 필요하다.
하이퍼바이저는 할당되었던 리소스를 각 가상 머신에 제공하고, 물리 리소스에 대해 VM 리소스의 일정을 관리한다.
물리적 하드웨어는 하이퍼바이저가 일정을 관리하는 동안 CPU가 VM에서 요청한 대로 CPU 명령을 계속 실행한다.
가상화 덕분에 서로 다른 여러 개의 운영 체제를 나란히 구동할 수 있으며, 하이퍼바이저를 사용해 동일한 가상화 하드웨어 리소스를 공유한다. 바로 이러한 부분이 가상화의 핵심적인 이점이다. 가상화가 없다면 하드웨어에서 운영 체제를 1개만 구동할 수 있다.
'DevOps > Kubernetes' 카테고리의 다른 글
[kubernetes] #3 쿠버네티스 아키텍처 (0) | 2022.02.27 |
---|---|
[Kubernetes] #2 핵심 쿠버네티스 컴포넌트 (0) | 2022.02.27 |
[Kubernetes] #1 쿠버네티스란? (0) | 2022.02.26 |
[K8S] 쿠버네티스 파드의 생명주기 (0) | 2022.01.18 |
[K8S] 쿠버네티스 구성요소 (0) | 2022.01.18 |