쿠버네티스는 컨테이너화된 어플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 시스템입니다.
그러나 이러한 설명만으로 쿠버네티스를 정확하게 이해하기 어렵죠. 쿠버네티스를 이해하기 위해 쿠버네티스가 어떤 문제를 해결하는지 살펴봅시다.
서버를 수동으로 관리하며 컨테이너를 수동으로 배포하는 경우를 생각해봅시다. 예를들어 AWS를 이용해 EC2를 인스턴스를 만들고, Docker를 설치해 컨테이너를 실행하는 것이죠. 이렇게 수동으로 배포하게되면 다양한 문제 상황에 직면하게 됩니다.
물론 AWS는 컨테이너 재실행, 오토 스케일링, 로드 밸런싱 등의 기능을 제공하긴 합니다. 즉, 이미 위에 있는 문제들은 AWS/EC2 같은 서비스를 이용하면 쉽게 해결이 가능합니다.
수동으로 배포하지 않고 배포 서비스를 사용해야 하는 이유가 생긴 것이죠. 하지만 이런 서비스는 한 가지 단점을 갖고 있습니다. 바로 서비스 자체에 베포 프로세스가 묶인다는 것이죠.
클라우드 제공자의 클라우드 서비스를 이용한다면 우리는 그 서비스에서 정의한대로 모든 것을 구성해야 합니다. 그리고 그 구성은 마찬가지로 서비스에서 제공하는 기능을 이용해야 하는 것이죠.
문제는 이러한 설정은 하나의 클라우드 제공자에서만 동작하고, 다른 클라우드 제공자에선 작동하지 않을겁니다.
만약 AWS에서 Microsoft Azure로 전환하려면 제공하는 세부 사항, 서비스, 우리가 사용한 구성을 다른 서비스로 수동 변환 하는 등의 노력이 필요합니다. 제공하는 기능의 차이점등도 생각해야겠죠.
쿠버네티스는 바로 이런 부분을 도와주는 시스템입니다.
쿠버네티스는 클라우드 제공자와 상관없이 독립적으로 배포, 컨테이너 확장, 컨테이너 모니터링 및 실패시 교체 방법을 정의할 수 있도록 도와줍니다.
쿠버네티스는 오픈 소스 시스템이며 동시에 컨테이너 배포와 컨테이너 관리의 실질적 표준이기 때문입니다. 즉, 다음과 같은 기능의 정의가 가능해지는 것이죠.
쿠버네티스는 Configuration file을 작성하여 이러한 방식을 정의할 수 있도록 도와줍니다. 그리고 이러한 설정 파일은 다른 클라우드 제공자나 머신에 전달 되어도 동일하게 동작하게 되는 것이죠.
따라서 우리는 Configuration file을 작성하는 방법을 익혀야 합니다. 만약 설정 파일이 동작하지 않는 머신이 있다면 쿠버네티스 소프트웨어를 설치하여 파일을 해석할 수 있습니다.
Standardized way of describing the to-be-created and to-be-managed resources of the Kubernetes Cluster
게다가 특정 클라우드 제공자가 추가 구성을 요구하는 경우, 해당 구성을 추가하는 것도 가능합니다.
한마디로 쿠버네티스는 모든 클라우드 공급자와 함께 사용할 수 있는 개념/소프트웨어 모음이라고 할 수 있습니다. 그리고 그 목표는 컨테이너 어플리케이션의 배포 및 관리에 대한 표준 정의 방식 제공입니다.
더 쉽게 Docker-Compose for multiple machine으로 해석도 가능합니다.
Master Node는 Cloud Provider API를 이용해 위 엔드 상태를 복제하라고 요청합니다.
Woker Node는 머신입니다. EC2에 대응되는 개념이죠. Master Node에 의해 관리되며 내부에 Pod가 있습니다.
Pod는 단순히 하나 이상의 어플리케이션 컨테이너와 컨테이너에 속하는 리소스(Volume, Ip, run config...)를 호스팅합니다. Pod 자체는 마스터노드에 의해 관리됩니다.
Worker Node는 특정 양의 CPU와 메모리를 가진 가상의 컴퓨터라고 이해할 수 있습니다. Docker 같은 소프트웨어도 설치되어 있을 수 있죠.
kubelet이라 불리는 마스터노트-워커노드 간의 통신 장치도 설치되어 있습니다. Node, Pod network communication을 관리하는 kube-proxy도 있습니다.
다행히 우리는 쿠버네티스를 통해 최종 상태만 정의하면 되고, 클라우드 제공자가 이런 최종 상태를 실제로 생성합니다.
마스터노드 내부에서 가장 중요한 서비스는 API Server입니다. Worker Node의 kublet이 통신하는 대상이죠.
Pod를 감시하고, Pod 생성시 담당하는 Worker Node를 선택하는 역할을 하는 Scheduler입니다. Pod의 추가, 삭제 등의 작업을 진행하죠. API Server를 통해 Worker Node와 통신합니다.
Kube-Controller-Manager는 전반적으로 Woker Node를 관리하며 정확한 수의 Pod를 운영하도록 합니다. 당연히 Scheduler, API Server와 긴밀하게 작동합니다.
Cloud-Controller-Manager는 클라우드 제공자에게 무엇을 할지 알려주는 역할을 합니다.
참조