Skip to main content

쿠버네티스 개념

컨테이너란?

전통적으로 물리적인 서버에서 애플리케이션을 실행 하였다. 이 방법은 하나의 물리적인 서버에 애플리케이션을 통제로 배포 하는 방법이였다. 이 방법은 서버의 리소스 관리, 애플리케이션 유지 보수 및 업데이트 같은 중요한 면들이 어렵고 비용이 많이 들었다. 이러한 어려움을 해결하기 위해 가상화 (Virtualization)가 도입 되었다. 단일한 물리적 서버의 CPU에서 여러 대의 가상머신 (Virtual Machine)을 실행하고, 물리적인 서버의 리소스를 최대한 사용 할 수 있었다. 하지만 한 가상머신당 새로운 OS(Operating System)가 존재 하여 애플리케이션 배포 및 리소스 면에서는 물리적인 서버와는 다른 이점이 없었다. 그래서 나온 컨테이너는 프로세스 단위의 격리 환경을 조성하고 있어 상호 간의 의존도를 낮추었다. 그 외 컨테이너는 호스트 서버의 OS를 그대로 사용하기 때문에 VM보다 훨씬 사이즈가 작고, 배포가 빠르고, 성능 손실은 거의 없었다. 

image.png

컨테이너로 서비스를 제공하기 전 알아야 될 애플리케이션 배포의 형태들이 있다. 모놀리식(monolithic) 애플리케이션은 하나의 큰 애플리케이션으로, 모든 기능이 하나의 코드베이스에서 동작한다. 예를 들면 LAMP (Linux, Apache, MySQL, PHP) 스택을 사용하는 웹 서비스가 있다. 이러한 모놀리식 애플리케이션은 복잡하고 무거워지는 경향이 있다. 반면에, 컨테이너화된 애플리케이션은 애플리케이션을 실행하는 데 필요한 모든 것을 포함하고 있는 작은 패키지인 컨테이너 안에 애플리케이션을 묶는 것이고 이를 통해 애플리케이션을 더욱 효율적으로 실행할 수 있다. 컨테이너화된 애플리케이션의 예시로는 Docker, Podman, LXC와 같은 컨테이너화 기술을 사용하는 웹 서비스, 데이터베이스, 애플리케이션, 마이크로서비스 등이 있다. 


마이크로서비스_모놀리식서비스_다이어그램.png


컨테이너화된 서비스

다양한 컨테이너 런타임 기술이 존재하지만, 그중에 도커(Docker)가 표준으로 여겨지고 있다. 만약에 도커 컨테이너로 마이크로서비스 형태의 애플리케이션을 배포 하게 된다면, 하나의 도커 이미지 안에 서비스 운영에 필요한 모든 것들이 들어 있어 개발자들이 손쉽게 협업을 할 수가 있다. 또한 서비스 운영 환경과 개발 환경의 느슨한 결합으로 한쪽의 에러에도 다른 한쪽은 작업을 계속해서 이어 나갈 수가 있다.  도커컨테이너는 배포가 쉽고 빠르며 시스템 의존성을 쉽게 업그레이드할 수 있어 스케일 아웃에 용이하다. CPU limit, Memory limit 등의 시스템 자원을 효율적으로 활용할 수가 있고 무엇보다도 가상머신 보다 성능 면에서 뛰어나다. 하지만 이렇게 컨테이너화된 애플리케이션도 역시 관리를 해야 한다. 만약에 컨테이너화된 애플리케이션이 다운이 되면 직접 재실행 시켜야 된다. 전통적인 방식과 VM보다 관리가 용이하지만 컨테이너의 스케일 아웃 장점 때문에 관리해야 하는 컨테이너 수가 많아지게 되면 관리 와 운영에 어려움이 따르게 된다. 


쿠버네티스의 등장

각각 독립적으로 배치된 컨테이너를 연결, 관리 및 확장하면서 요소들 전체가 하나로 실행 되도록 해야 한다. 이렇게 다수의 컨테이너 실행을 관리해주는 것을 컨테이너 오케스트레이션 이라고 부른다. 오케스트레이션(Orchestration)은 수많은 연주자들이 지휘에 맞춰 연주하는 것을 "오케스트라"라고 한다. 오케스트레이션은 음악에서 다양한 음악적 요소들을 조화롭게 배열하고 조율하여 완성도 높은 작품을 만들어내는 과정이고, 컨테이너 오케스트레이션 또한 다양한 컨테이너들을 효율적으로 관리하고 조율하여 원활한 애플리케이션 운영을 가능하게 한다. 마치 오케스트레이션의 역할처럼, 컨테이너 오케스트레이션은 각각의 요소를 조화롭게 배치하고 조율하여 시스템 전체가 조화롭게 동작하도록 돕는다.  쿠버네티스는 구글이 개발한 오케스트레이션 엔진으로서 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼이다. 쿠버네티스는 구글에서 내부적으로 사용하던 Borg 시스템에서 발전되었고, 2014년에 쿠버네티스 프로젝트를 오픈 소스 화 했다. Kubernetes를 가끔 K8s라고 표현한다. K8s는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기이다. 


image.png


실제 프로덕션 환경에서의 애플리케이션들은 여러 컨테이너에 걸쳐 있으며 이러한 컨테이너는 여러 서버 호스트에 배포되어야 한다.  이 때문에 컨테이너를 위한 보안은 멀티 레이어 구조로 되어 있고 복잡할 수 있다. 쿠버네티스는 이러한 워크로드를 위해 규모에 맞는 컨테이너를 배포하는 데 필요한 오케스트레이션 및 관리 기능을 제공한다. 쿠버네티스 오케스트레이션을 사용하면 여러 컨테이너에 걸쳐 애플리케이션 서비스를 구축하고 클러스터 전체에서 컨테이너의 일정을 계획하고 이러한 컨테이너를 확장하여 컨테이너의 상태를 지속적으로 관리할 수 있다. 그것 뿐만이 아니라 컨테이너 오케스트레이션 도구를 사용하면 자동화된 배포 및 스케일링, 롤아웃/롤백 및 컨테이너 복구 작업을 구현 할 수가 있다는 장점들이 존재한다.


image.png

쿠버네티스 주요 기능

  • Self-healing: 쿠버네티스는 제대로 실행되지 않는 컨테이너를 자동으로 재시작하거나 교체할 수 있다. 

  • Automated Rollouts & Rollbacks: 원하는 배포 상태에 맞는 속도로 현재 배포 상태를 변경할 수 있다.

  • Service Discovery & Load Balancing: DNS 또는 IP 주소를 사용하여 클러스터 내의 컨테이너를 외부에 노출시킬 수 있다. 네트워크 트래픽이 많은 서비스의 경우, 안정적인 서비스 운영을 위해 네트워크 트래픽을 로드밸런싱도 가능 하다.

  • Storage Orchestration: 로컬 스토리지 서버와 퍼블릭 클라우드 스토리지 서비스를 연결하여 사용할 수 있다. 외부 스토리지 서버 자원을 쉽게 사용할 수 있으며, 데이터 지속성을 보장할 수 있다.

  • Secret and Configuration Management: 비밀번호, SSH Key, OAuth 토큰과 같은 중요한 정보를 안전하게 저장하고 관리할 수 있다. 컨테이너 구성 정보가 변경되면, 쿠버네티스는 컨테이너 이미지를 재구성하지 않고 구성 정보의 변경 사항을 반영하여 배포 및 업데이트할 수 있다.

  • Automatic Bin Packing: 컨테이너 운영에 필요한 자원 사용률을 수신하고 가장 적합한 클러스터 노드를 제공한다.



    https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wvs5e755yy8maamkzue1.png