Google의 컨테이너

더욱 효율적인 애플리케이션 개발 및 배포 방법

무료로 사용해 보기 문서 보기
Google의 업무 방식

Gmail에서 YouTube, 검색에 이르기까지 Google의 모든 제품은 컨테이너에서 실행됩니다. 개발팀은 컨테이너화를 통해 더욱 신속하게 움직이고, 효율적으로 소프트웨어를 배포하며 전례 없는 수준의 확장성을 확보할 수 있습니다. Google은 매주 20억 개가 넘는 컨테이너를 생성합니다. 지난 10여 년간 프로덕션 환경에서 컨테이너화된 작업 부하를 실행하는 방법에 관해 많은 경험을 쌓으면서 Google은 커뮤니티에 계속 이 지식을 공유해 왔습니다. 초창기에 cgroup 기능을 Linux 커널에 기여한 일부터 내부 도구의 설계 소스를 Kubernetes 프로젝트로 공개한 일에 이르기까지 공유 사례는 다양합니다. 그리고 이 전문 지식을 Google Cloud Platform으로 구현하여 개발자와 크고 작은 규모의 회사가 최근에 이루어진 컨테이너의 혁신을 쉽게 활용할 수 있도록 하였습니다.

컨테이너 기초 지식: 컨테이너란 무엇인가?

컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공합니다. 이러한 격리를 통해 사설 데이터 센터나 공용 클라우드, 심지어 개발자의 개인 노트북 컴퓨터에 이르기까지 어떤 환경으로든 컨테이너 기반 애플리케이션을 쉽게 지속적으로 배포할 수 있습니다. 또한 컨테이너화를 통해 업무 영역을 깔끔하게 분리할 수 있습니다. 즉, 개발자는 애플리케이션의 로직과 종속 항목에 집중할 수 있고, IT 부서는 특정 소프트웨어 버전과 개별 앱 구성과 관련한 세부 업무에 시간을 낭비하지 않고 배포 및 관리에 집중할 수 있습니다.

가상 환경에 익숙하다면 컨테이너를 가상 머신(VM)에 비교하여 생각하면 이해하기 쉽습니다. VM의 개념은 이미 익히 알고 계실 것입니다. 호스트 운영체제에서 구동되며 그 바탕이 되는 하드웨어에 가상으로 액세스하는 Linux, Windows 등의 게스트 운영체제를 의미합니다. 컨테이너는 가상 머신과 마찬가지로 애플리케이션을 관련 라이브러리 및 종속 항목과 함께 패키지로 묶어 소프트웨어 서비스 구동을 위한 격리 환경을 마련해 줍니다. 그러나 아래에서 살펴보듯 VM과의 유사점은 여기까지입니다. 컨테이너를 사용하면 개발자와 IT 운영팀이 훨씬 작은 단위로 업무를 수행할 수 있으므로 그에 따른 이점도 훨씬 많습니다.

컨테이너를 사용해야 하는 이유

가상 머신은 하드웨어 스택을 가상화합니다. 컨테이너는 이와 달리 운영체제 수준에서 가상화를 실시하여 다수의 컨테이너를 OS 커널에서 직접 구동합니다. 컨테이너는 훨씬 가볍고 운영체제 커널을 공유하며, 시작이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 훨씬 적게 차지합니다.

컨테이너에는 여러 가지 형식이 있습니다. Docker는 널리 사용되는 오픈소스 컨테이너 형식으로 Google Cloud Platform과 Google Kubernetes Engine에서 지원됩니다.

샌드박스를 사용해야 하는 이유

컨테이너는 사용자가 의도적으로 연결하기 전까지는 애플리케이션을 서로 격리합니다. 따라서 종속 항목의 충돌이나 리소스 경합을 걱정할 필요가 없습니다. 각 서비스에 리소스 한도를 명시적으로 지정하기만 하면 됩니다. 애플리케이션이 호스트 운영체제에서 직접 구동되지 않으므로 추가 보안 계층이 존재한다는 점도 중요한 특징입니다.

일관성 있는 환경

개발자는 컨테이너를 이용해, 다른 애플리케이션과 분리된 예측 가능한 환경을 생성할 수 있습니다. 컨테이너는 애플리케이션에 필요한 소프트웨어 종속 항목(프로그래밍 언어 런타임 및 기타 소프트웨어 라이브러리의 특정 버전 등)도 포함할 수 있습니다. 개발자의 관점에서 이 모든 요소는 애플리케이션이 배포되는 최종 위치에 관계없이 항상 일관성이 있습니다. 그 결과 자연히 생산성이 향상될 수밖에 없습니다. 개발자와 IT 운영팀이 버그를 잡고 환경 차이를 진단하던 시간을 줄이고 사용자에게 신규 기능을 제공하는 데 집중할 수 있기 때문입니다. 또한 개발자가 개발 및 테스트 환경에서 세운 가정이 프로덕션 환경에서 그대로 실현될 것이기 때문에 버그 수 자체도 감소합니다.

폭넓은 구동 환경

컨테이너는 Linux, Windows, Mac 운영체제, 가상 머신, 베어메탈, 개발자의 컴퓨터, 데이터 센터, 온프레미스 환경, 공용 클라우드 등 사실상 어느 환경에서나 구동되므로 개발 및 배포가 크게 쉬워집니다. 컨테이너용 Docker 이미지 형식은 워낙 널리 사용되기 때문에 이식성도 매우 뛰어납니다. 소프트웨어 구동 환경이 무엇이든 컨테이너를 사용할 수 있습니다.

격리

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

  컨테이너의 이점 가상 머신의 이점
일관성 있는 런타임 환경
애플리케이션 샌드박스화
디스크 용량 절감  
낮은 오버헤드  
코드에서 애플리케이션으로

컨테이너를 사용하면 애플리케이션과 종속 항목을 버전 관리가 쉬운 하나의 패키지로 묶어 팀 내의 여러 개발자가 쉽게 복제하고 클러스터 내의 머신으로도 간편하게 복제되도록 만들 수 있습니다.

소프트웨어 라이브러리로 개별 코드를 패키지로 묶어 사용자 인증 및 세션 관리 등의 로직을 추상화할 수 있듯이, 컨테이너로 애플리케이션 전체를 패키지로 묶어 운영체제와 머신, 코드 자체까지 추상화할 수 있습니다. 이를 서비스 기반 아키텍처와 결합하면 개발자들이 논리성을 판단해야 하는 단위 자체가 훨씬 작아지므로 민첩성과 생산성이 크게 향상됩니다. 그 결과 애플리케이션의 개발 및 테스트, 배포, 전반적인 관리가 훨씬 쉬워집니다.

모놀리식 아키텍처에서 서비스 기반 아키텍처로

컨테이너는 서비스 기반 아키텍처와 가장 잘 어울립니다. IO에서 데이터 처리, 렌더링에 이르기까지 애플리케이션의 모든 요소가 서로 얽혀 있는 모놀리식 아키텍처와 달리 서비스 기반 아키텍처는 이런 요소들을 개별 구성 요소로 분리합니다. 이러한 '분업' 덕분에 다른 요소에 오류가 발생하더라도 서비스에 중단이 발생하지 않으며 애플리케이션 전체의 안정성이 향상됩니다.

또한 구성 요소를 분리함으로써 더욱 빠르고 안정적인 개발이 가능해집니다. 코드베이스가 작은 만큼 유지보수도 쉽고 서비스가 분리되어 있으므로 특정 입출력 쌍을 테스트하기도 쉽습니다.

컨테이너는 서비스 기반 애플리케이션에 매우 적합합니다. 각 컨테이너의 상태를 확인하고 각 서비스에 할당되는 리소스를 제한하며 서비스를 서로 독립적으로 시작하거나 중단할 수 있기 때문입니다.

컨테이너는 또한 코드를 추상화하므로 개별 서비스를 블랙박스로 취급하여 개발자가 관리해야 하는 영역을 줄여 줍니다. 개발자가 서로 종속된 서비스를 개발하는 경우에는 환경 설정과 사전 문제해결에 시간을 낭비할 필요 없이 특정 서비스의 컨테이너를 생성하면 됩니다.

Kubernetes: 프로덕션급 컨테이너 관리 도구

Google의 내부 클러스터 관리 시스템인 Borg가 큰 성공을 거두면서 Google은 여기서 얻은 지식을 오픈소스 프로젝트인 Kubernetes에 적용했습니다. 덕분에 이제 다른 기업도 수십 년에 걸친 Google의 경험을 활용할 수 있습니다. 'k8s'라고도 불리는 Kubernetes는 시스템 및 서비스 관리를 대행하는 자동 컨테이너 관리 기능을 제공합니다. 이에 따라 안정성이 높아지고 관리 작업의 부담이 해소될 뿐만 아니라 DevOps에 써야 하는 시간과 리소스도 절감됩니다.

Kubernetes를 사용하면 애플리케이션의 배포 및 관리와 관련된 모든 작업이 한층 간편해집니다. Kubernetes는 출시 및 롤백을 자동화하고 서비스 상태를 모니터링하여 상황이 악화되기 전에 불량 버전 출시를 예방합니다. 또한 끊임없이 서비스 상태를 확인하여 오류가 발생하거나 중단된 컨테이너를 재시작하고, 서비스가 정상적으로 작동하는 것을 확인했을 때만 고객에게 서비스를 광고합니다. 또한 Kubernetes는 사용률에 따라 자동으로 서비스의 규모를 조절하여 필요할 때에 필요한 것만 구동하도록 해 줍니다. 컨테이너와 마찬가지로 Kubernetes를 사용하면 선언형으로 클러스터를 관리하여 더욱 손쉽게 버전을 관리하고 복제할 수 있습니다.

Kubernetes의 특징
  • 출시 및 롤백 자동화
  • 서비스 상태 모니터링
  • 서비스 규모 자동 조절
  • 선언형 관리
  • 폭넓은 배포 환경(하이브리드 배포 포함)

무엇보다 Kubernetes는 어디서나 사용할 수 있도록 설계되어 사내, 공용 클라우드, 혼합된 하이브리드 등 어떤 환경으로의 배포든 조정할 수 있습니다. 이에 따라 인프라를 사용자가 있는 곳으로 제공하고, 애플리케이션의 가용성을 높이며, 보안 수준 및 비용의 균형을 회사의 특정 요구사항에 따라 맞출 수 있습니다.

Google이 클러스터를 관리

물론 Kubernetes는 Google Cloud Platform에서 가장 효과적으로 작동합니다. Google Kubernetes Engine은 빠르게 구성을 완료하고 애플리케이션을 출시할 수 있게 해주는 고급 관리형 Kubernetes 솔루션입니다.

Kubernetes Engine은 컨테이너를 가장 잘 아는 Google의 안정성 담당 엔지니어가 전담 관리하여 클러스트의 가용성을 높이고 최신 상태를 유지합니다. 이 엔진은 Stackdriver의 모니터링, 진단 및 로그 기록, ID 및 액세스 관리, Google의 동급 최고 네트워킹 인프라 등의 모든 GCP 서비스와 매끄럽게 연동됩니다.

Kubernetes Engine 기능
  • 관리형 오픈소스 Kubernetes
  • 99.5% 서비스수준계약, 고가용성, 다중 영역 배포 지원
  • 기타 GCP 서비스와의 매끄러운 연동
  • 업계 최고 수준의 가격 대비 성능
  • 높은 유연성, 온프레미스 클러스터 또는 외부 클라우드 공급업체와 상호 운용 가능
  • Google 수준의 관리형 인프라

다른 솔루션을 선택할 수 있는 옵션도 있습니다. Google Cloud Platform은 컨테이너 구동과 관련하여 폭넓은 선택권을 드립니다. Google App Engine 가변형 환경의 완전 관리형 Platform as a Service, Kubernetes Engine의 클러스터 관리, 세계 최고 수준의 가격 대비 성능을 자랑하는 Google Compute Engine 기반의 사용자 구축 인프라 등, Google Cloud Platform에서 컨테이너를 구동하기 위한 이상적인 솔루션을 직접 찾을 수 있습니다.

완벽한 컨테이너 솔루션

이게 끝이 아닙니다. Google Cloud Platform은 개발 단계에서 운영 단계까지 컨테이너를 사용하는 데 필요한 도구를 모두 제공합니다. Cloud BuildContainer Registry는 Google의 철통같은 보안 표준과 세계 최고 수준의 네트워크를 바탕으로 Docker 이미지 저장소와 관리 기능을 제공합니다. Google의 컨테이너 최적화 OS는 Docker 및 Kubernetes 런타임이 사전 설치되어 있는 가볍고 안전한 운영체제를 제공하므로 모든 컨테이너 관리 업무를 GCP에서 수행할 수 있습니다.

“ 10년간 컨테이너 관리 시스템을 구축한 경험으로 Google은 많은 것을 배웠고 그 지식의 대부분을 Google의 최신 컨테이너 관리 시스템인 Kubernetes에 담았습니다. 이 시스템의 목적은 컨테이너의 기능을 최대한 활용하여 프로그래머의 생산성을 대폭 향상시키고 수동 및 자동 시스템 관리를 더욱 용이하게 하는 것입니다.”

Google, Inc