컨테이너에 대한 내용인데, 공부하면서 중요한 점만 요약해보려고 한다.
개발자라면 자신이 맡은 서비스뿐만 아니라 컨테이너 내부까지도 잘 이해해야한다. 이 글을 통해서 컨테이너 내부를 기초부터 공부해보자. 내용은 다음과 같이 진행된다.
"클라우드"라는 용어는 컴퓨팅에서 사용되는 개념을 설명하기 위해 만들어졌습니다. 클라우드 컴퓨팅은 인터넷을 통해 데이터와 컴퓨팅 리소스를 공유하는 기술입니다. 이 용어는 데이터와 컴퓨팅 리소스가 인터넷을 통해 어디에서나 접근 가능하다는 점에서 유래하였습니다.
“클라우드”에 대한 미국 국립 표준 기술연구소(NIST)의 정의는 다음과 같습니다. “공유 구성이 가능한 컴퓨팅 리소스(네트워크, 서버, 스토리지, 애플리케이션)의 통합으로 어디서나 간편하게, 요청에 따라 네트워크를 통해 언제든 접근하는 것을 가능하게 하는 모델이다.
"클라우드"라는 단어는 인터넷이 처음 등장하면서부터 사용되기 시작했습니다. 1990년대 후반에는 인터넷 서비스 제공업체(ISP)들이 자신들의 네트워크를 "클라우드"라고 불렀습니다. 그리고 2000년대 초반, 아마존(Amazon)이 "Amazon Web Services"를 출시하면서 클라우드 컴퓨팅의 개념이 처음 등장했습니다. 그 후, 마이크로소프트(Microsoft)와 구글(Google)과 같은 기업들도 클라우드 컴퓨팅 서비스를 제공하면서 클라우드 컴퓨팅이 보편화되었습니다.
가상화의 사전적 의미는 '실제가 아닌'으로, 컴퓨팅에서는 실제가 아닌 하드웨어 환경을 의미한다. 가상화는 가짜 하드웨어 환경을 만들어 내는 기술로, 실제 물리장비인 호스트와 가상머신인 게스트를 구분합니다.
가상머신이라고 하니 명확히 이해되지 않는 것 같아 다른 설명을 찾아보니, 가상 서버에 설치되는 운영체제라고 한다.
게스트는 호스트 시스템에서 실행되는 가상 머신(가상 서버) 안에 설치되는 운영 체제나 응용 프로그램을 가리킵니다. 게스트 운영 체제는 호스트 시스템의 자원을 가상적으로 할당받아 실행되며, 호스트 시스템과는 완전히 분리된 독립적인 환경에서 동작합니다.
가상화라고 하니 Virtual Memory를 공부한 기억이 떠오르긴 한다.
가상화에는 컨테이너 가상화, 네트워크 가상화, 하이퍼바이저 가상화, 스토리지 가상화 등 다양한 기술 스택이 존재하는데, 그중 우리는 앞의 세가지 영역의 가상화에 대해 알아보자..
하이퍼바이저는 한 대의 머신에서 다수의 운영체제를 동시에 실행하는 소프트웨어로, 하드웨어를 가상화한다고 한다. 오락실 게임을 PC에서 돌릴 때, 사용하는 에뮬레이터와 유사하다. 그리고 내가 mac에서 윈도우를 설치하기 위해서 VMware라는 제품군 역시 하이퍼바이저도 하이퍼바이저라고 한다. 하이퍼바이저도 Native VMM (제 1형), Hosted VMM (제 2형) 나뉘는데, 해당 링크를 따라가보면 설명이 되어있다.
컨테이너는 애플리ㅔ이션 구동에 필요한 모든 것들을 패키징하고 격리된 환경에서 실행합니다. "패키징"과 "격리된 환경" 이 두 특징 덕분에 서버별 환경에 영향받지 않고 자동으로 배포가 가능하다.
네트워크의 한정된 물리주소라는 제약을 해결하고, 물리 IP사용으로 인한 여러 의존성 구성을 가상 네트워크를 통해 추상화하여 단순하고, 유연하게 할 수 있다.
API는 가상화를 통해 가능해진 하트웨어와 애플리케이션 제공을 "추상화"하는 레이어이다. 추상화는 세부 구현을 가림으로써 합의된 인터페이스 범주 내에서 다양한 구현이 가능하고, 필요에 따라 교체하여 사용할 수 있습니다.
API는 명세로 랩핑 되는데, 다양한 리소스에 연결된 API들이 명세 안에서 목적에 맞게 구성됩니다. 명세는 오픈스택, 쿠버네티스 등 오케스트레이션 도구 위에서 컨트롤러들을 부리기 위한 일종의 작업 지시서로, 컴퓨팅 리소스 할당, 가상 네트워크 구성, 컨테이너 배치, 오토스케일링 등 다양한 작업을 자동화합니다.
컨테이너란 무엇일까? 컨테이너는 격리된 환경과 제한된 리소스로 제어되는 프로세스를 의미한다. 호스트가 다세대 주택이라고 생각해볼 수 있다. 다세대 주택은 여러 가족들이 들어와서 독립적인 공간을 제공하면서도 생활에 필요한 전기 수도, 가스도 공급해준다. 전기, 수도, 가스는 한정적인 리소스이기 때문에 제한을 둘 수 밖에 없는 상황이다.
컨테이너는 실행파일 뿐만 아니라 의존성 라이브러리, 설정 등 실행에 필요한 모든 것들을 이미지라고 하는 것에 모아 패키징함으러써 서버 환경에 의존하지 않고 실행되는 것을 보장한다.
격리된 환경을 제공하는 방법은 컨테이너만 있는게 아니다. 앞에서도 언급한 VM(Virtual Machine, 가상머신) 같은 것들이 그런 것들이다.
컨테이너는 VM에 비해 작고 빠릅니다. 컨테이너는 호스트 커널에서 바로 처리되고 하드웨어를 직접 관리하는 반면에 VM은 GuestOS가 하드웨어 사용 시 하이퍼바이저의 처리를 기다려야 합니다. 하이퍼바이저는 여러 GuestOS를 상대해야 하고, 하드웨어는 한정된 자원이다 보니 개별 GuestOS의 사정에 맞춰서 리소스를 제공하기 쉽지 않습니다. 이런 이유로 컨테이너와 VM의 성능 차이가 발생할 수밖에 없긴 하지만, 둘 다 각자 클라우드에서 필요한 역할이 있습니다.
컨테이너는 애플리케이션을 패키징하고 서버 환경에 제약 없이 구동할 수 있기 때문에 일종의 “앱" 자판기가 가능합니다. 그리고 VM은 하드웨어를 가상화하고 그 위에 다양한 GuestOS를 올리는 “컴퓨팅" 자판기가 가능합니다. 자판기라고 표현한 이유는 코인만 넣으면 즉, 요청만 하면 원하는 제품을 제공해 주기 때문입니다. AWS, Azure, GCP 등 퍼블릭(Public) 클라우드 환경에서는 실제로 VM 기반으로 인프라를 구성하고 그 위에서 컨테이너 형태로 애플리케이션을 구성해 다양한 IT 리소스를 명세와 API 기반으로 자동화하여 제공하고 있습니다.
‘쿠버네티스’는 도커와 같은 컨테이너 런타임을 통해 컨테이너를 ‘오케스트레이션’하는 플랫폼입니다. 컨테이너 오케스트레이션이란 용어는 거창하지만, 컨테이너에 필요한 설정과 관리, 적절한 노드로 배치, 모니터링 등을 제공하는 것을 의미합니다
쿠버네티스는 명세(일종의 작업지시서)를 기반으로 다양한 “컨트롤러”가 협력하는 방식으로 동작하는데요, 여러 종류의 빌트인 컨트롤러들이 있고 필요하면 커스텀 컨트롤러를 구현할 수도 있습니다. 각 컨트롤러는 각자 처리하는 명세를 정의하고 그에 맞춰 구현됩니다. 컨트롤러는 (사람 대신) 컨테이너를 배치하고, (사람 대신) 상태를 모니터링하고, (사람 대신) 상태가 달라지면 명세에 정의된 스펙대로 맞추려는 노력도 합니다.