수 많은 우문은 현답을 만든다

컨테이너와 쿠버네티스 쉽게 이해하기 본문

개발지식/Openshift (k8s)

컨테이너와 쿠버네티스 쉽게 이해하기

aiden.jo 2020. 7. 10. 17:51

안녕하세요 조영호입니다.

오늘은 요즘 클라우드의 시장에서 떠오르고 있는 기술인 컨테이너와 쿠버네티스를 소개하고자 합니다. 컨테이너와 쿠버네티스를 처음 접하시는 분들의 이해를 돕기 위해 작성된 글입니다. 먼저 각 기술의 개념을 살펴보고 해당 기술들의 장점을 알아보겠습니다. 마지막에는 몇 가지 예상되는 질문들과 답변을 준비했습니다.

컨테이너란 무엇인가?

사전적 의미로 컨테이너는 어떤 물체를 격리하는 공간을 뜻합니다. 그렇다면 클라우드 분야에서 컨테이너는 어떤 의미를 가질까요? 컨테이너는 애플리케이션과 애플리케이션을 구동하는 환경을 격리한 공간을 뜻합니다. 사실 컨테이너 기술은 새로운 개념이 아닌, 약 10여 년 전에 리눅스에 내장된 기술로 소개되었습니다. 현재 컨테이너는 차세대 트렌드 기술로 주목받으며 다양한 클라우드 서비스 환경에서 연구되고 있습니다.

그럼 왜 컨테이너를 써야 하는가?

지금도 대부분의 서버 장비들은 컴퓨팅 환경을 소프트웨어로 구현한 가상머신(VM : Virtual Machine)을 사용하고 있습니다. 이 서버들은 다수의 운영 체제를 동시에 실행하기 위해 하이퍼바이저가 필요하고, 그 상위계층에 Guest OS가 각각 설치된 가상머신들을 구동시킵니다. 반면에 컨테이너로 구성된 서버는 아래의 그림과 같이, 하이퍼바이저를 사용하지 않고 CPU, RAM, Disk, Network 과 같은 운영체제의 자원을 필요한 만큼 격리하여 컨테이너에 할당합니다.

VM과 Container

컨테이너는 어떤 장점이 있는가?

첫째, 컨테이너는 효율성이 높다.
실제 기업들은 애플리케이션 서비스를 안정적으로 운영하기 위해, 1개의 가상머신에 1개의 서비스를 구동하는 것이 권장됩니다. 하지만, 해당 애플리케이션이 가상머신의 모든 자원을 사용하는 것이 아니기 때문에 유휴 자원이 생겨서 성능적 오버헤드가 발생할 수 있습니다. 반면 컨테이너의 경우, 운영체제의 자원을 공유하기 때문에 애플리케이션을 실행하는데 필요한 만큼의 자원만 할당받을 수 있습니다. 즉, 서버 전체 자원을 효율적으로 사용할 수 있다는 장점이 있습니다.

 

둘째, 컨테이너는 신속성이 높다.
기업들은 서비스 추가 및 확장을 위해 가상머신을 추가로 배포해야 하는 상황이 생깁니다. 가상머신의 용량은 최소 몇 GB 이기 때문에 추가 배포하는데 수 분에서 수십 분의 시간이 소요됩니다. 하지만, 컨테이너의 경우 구조적으로 Guest OS가 없기 때문에 용량이 MB 단위로 작습니다. 놀랍게도 컨테이너는 배포에 드는 시간이 수 초에 불과하다는 장점이있습니다.

 

셋째, 라이센스 비용이 절감된다.
가상화 서버의 경우 가상머신의 개수만큼 Guest OS의 Enterprise용 라이센스 비용이 발생합니다. 반면에 컨테이너 서버의 경우 Host OS 1대의 라이센스 비용만 발생합니다. 만약 추가로 많은 서버를 증설해야 한다면, 가상화 서버와 컨테이너 서버 사이의 라이센스로 인해 발생하는 비용의 차이는 기하급수적으로 증가할 것입니다.

장점만 있는것은 아닙니다.
가상머신의 경우 정확히 할당된 자원 내에서 가상머신이 운영되기 때문에, 컨테이너에 비해 안정적으로 운영할 수 있습니다. 반면에 컨테이너들은 OS 커널을 공유하기 때문에, 하나의 컨테이너가 무리하게 자원을 사용하게 될 수 있습니다. 자원 할당량을 사전에 지정시켜줄 수 있지만, 만약 이런 상황이 발생하면 컨테이너에 장애가 발생합니다. 이런 컨테이너의 문제는 뒤에 등장할 쿠버네티스로 해결할 수 있습니다.

컨테이너의 응용


1. 개발 환경 이전 솔루션

주로 개발자들이 애플리케이션을 개발할 때는 개인 환경에서 개발한 뒤에 통합 환경에서 여러 개발자의 코드를 통합합니다. 그다음 테스트 환경에서 애플리케이션을 테스트 한 뒤에, 실제 운영 환경으로 애플리케이션을 이전하게 됩니다. 이렇게 수차례 환경을 이전하다 보면 소프트웨어의 버전이나 서버 설정의 차이로 인해 다양한 장애가 매우 빈번하게 발생하고 이를 해결하기 위해 많은 시간이 소요됩니다. 그러나, 컨테이너를 사용하면 환경 이전이 쉽기 때문에 드는 시간을 대폭 줄일 수 있습니다. 컨테이너에 애플리케이션과 애플리케이션을 구동하는 환경을 그대로 담고 그 환경 자체를 다른 서버로 이전하면, 장애 걱정 없이 신속하고 안정적으로 환경을 이전할 수 있습니다. 컨테이너는 이미지 파일로 배포 및 형상관리가 가능하며 이와 관련해서는 다음 포스트에서 설명드리도록 하겠습니다.

 

2. 마이크로 서비스화 솔루션
기업에서 운영하는 애플리케이션은 하나의 큰 덩어리처럼 구성되어 있기 때문에 용량이 매우 큽니다. 이런 애플리케이션은 배포할 때 오랜 시간이 소요되고, 때로는 작은 부분의 수정사항이 애플리케이션 전체에 장애를 유발할 수 있습니다. 이런 거대한 애플리케이션을 기능별로 나누어 변경과 조합이 가능하게 한 것을 마이크로 서비스(Micro Service)라고 합니다. 마이크로 서비스를 구성할 때 컨테이너를 사용하면 하나의 애플리케이션을 기능 혹은 서비스 단위로 신속하게 배포할 수 있습니다. 또한, 컨테이너는 기본적으로 독립적인 구조이기 때문에 하나의 변경 사항이 분리된 다른 기능들에게 영향을 미치지 않습니다.

Monolith와 MSA

쿠버네티스란 무엇인가?

위의 본문에서 컨테이너를 사용하면 서버의 자원을 효율적으로 사용할 수 있다고 말씀드렸습니다. 그럼 컨테이너가 엄청나게 많아진다면 어떤 일이 발생할까요? 컨테이너들의 관리와 운영이 어려워져서 오히려 운영상의 효율성이 떨어지게 됩니다. 이 문제를 해결해주는 도구가 쿠버네티스(Kubernetes)입니다. 쿠버네티스는 컨테이너 오케스트레이션 플랫폼 중 하나로, 구글이 자사 서비스를 위해 개발했던 Borg에서 얻은 운영 노하우를 오픈소스로 공개한 것 입니다.

쿠버네티스는 어떤 장점이 있을까?

1. 무중단(Fault tolerance-FT) 서비스 제공
때때로 기업의 서비스를 이용하는 사용자들은 개선을 위해 임시점검 중이라는 안내문을 보게 됩니다. 기업에서는 서버 업데이트를 위해서 사용자들이 잠든 새벽 시간을 활용하거나 긴급 점검의 형태로 서비스를 일시 중단해왔습니다. 하지만, 쿠버네티스는 점진적 업데이트를 제공하기 때문에 서비스를 중단하지 않고도 애플리케이션을 업데이트할 수 있습니다. 또한, 쿠버네티스는 자가 회복(Self Healing) 기능이 있기 때문에 특정 컨테이너에 갑작스러운 장애가 발생하더라도 곧바로 복제 컨테이너를 생성해서 서비스를 유지할 수 있습니다.

 

2. Vendor Lock In 해결.
고객이 A사의 클라우드를 사용하다가 I사의 클라우드로 환경을 이전하고 싶을 때, 서로 다른 업체(Vendor)의 클라우드 제품 간에 호환 문제가 발생하여 이전하기 어려운 상황을 Vendor Lock In이라고 합니다. 쿠버네티스는 도커 컨테이너를 기반으로 하는 오픈소스이기 때문에 사용자들이 특정 업체에 종속되지 않고 클라우드의 환경들을 이전할 수 있습니다.

Q&A

1. 컨테이너로 개발 환경을 세팅할 수 있다던데, 가상머신은 그런 방법이 없나요?
Vagrant는 가상머신을 쉽게 생성하고 관리하게 하는 서비스입니다. 하이퍼바이저에 논리적인 가상 하드웨어 머신을 생성한 다음, 가상머신에 OS를 설치하고 일일이 모든 설정을 해야 하는 기존의 VM가상화 작업을, 단 몇 줄의 명령어로 처리할 수 있는 서비스입니다. 굳이 컨테이너와 vagrant의 비교를 하자면, 신속하게 여러 컨테이너를 생성하고 반복적인 테스트를 하기에는 컨테이너를 사용하는 것이 적합 합니다. Vagrant는 Guest OS를 포함한 안정적인 가상 공간을 조금 더 신속하게 만들기에 적합합니다.

 

2. 테라폼은 무엇인가요?
테라폼(terraform)은 다양한 클라우드에 가상머신을 배포하는 인프라 프로비저닝 도구입니다. Infrastructure as a Code의 개념으로 클라우드의 자원을 코드화해서, 코드로 쉽게 Cloud 자원을 생성, 변경 및 삭제를 하게 해줍니다.

 

3. 컨테이너 오케스트레이션이 무엇인가요?
쉽게 말하자면, 여러개의 컨테이너를 편리하게 관리해주는 작업을 뜻합니다. 그리고 실제로는 스케줄링, 클러스터링, 서비스 디스커버리, 로깅 및 모니터링을 수행합니다.

–스케줄링: 컨테이너를 비교적 가장 여유로운 노드에 자동 배치합니다. 작업 노드가 죽으면 실행 중이던 컨테이너를 다른 노드에 옮겨주는 역할도 수행합니다.
–클러스터링: 여러 개의 노드를 묶어 하나처럼 사용할 수 있습니다. 즉 모든 컨테이너가 내부통신을 할 수 있습니다.
–서비스 디스커버리: 컨테이너가 자동으로 배치되기 때문에 어디에 배치되었는지 찾는 임무를 수행합니다.
–로깅 및 모니터링: 로그를 관리하고 직접 또는 다른 툴을 사용해 보여줄 수 있습니다.

 

4. 쿠버네티스가 FT(Fault Tolerance)를 제공한다고 했는데, HA(High availability)랑은 어떤 차이가 있나요?
FT는 무중단 서비스로 작은 장애에도 동작이 멈추지 않고 서비스가 지속되는 것을 말합니다. 쿠버네티스는 특정 컨테이너가 죽었을때, 즉각 복제 컨테이너를 생성해서 서비스를 유지합니다. 하지만 컨테이너가 죽은 순간의 몇 초 동안은 서비스에 장애가 발생할 수 있습니다. 이를 대비해, 쿠버네티스는 동일한 서비스를 제공하는 컨테이너를 이중, 삼중으로 만들어 HA(고가용성)을 유지할 수 있습니다.

5. Docker file을 사용하다보면 Linux위에 Centos나 Ubuntu를 깔기도 하던데, 그러면 Guest OS를 설치하는 게 아닌가요?
아닙니다. Host OS가 Linux고 컨테이너의 Base Image를 Centos로 구동하게 되면, Linux와 Centos의 다른 부분(diff)만 따로 패키징 하는 것입니다. 결과적으로 Guest OS가 생기는 것이 아니기 때문에 훨씬 가볍습니다.

참고문헌

쿠버네티스 아키텍처: https://developer.ibm.com/kr/cloud/2017/07/29/kubernetes-cloud-private/
컨테이너: http://bongbonge.tistory.com/entry/컨테이너-기술에-대한-이해
오케스트레이션: https://subicura.com/2017/02/25/container-orchestration-with-docker-swarm.html
Vagrant: http://bcho.tistory.com/806