Docker를 이용해서 생성한 docker container들을 쉽게 관리할 수 있는 tool이 바로 kubernetes이다. 수많은 docker container들을 정해진 규칙에 따라서 관리를 해줘야 하는데, 이러한 기술을 container orchestration이라고 한다. 이 중에서 가장 많이 사용되고 있으며 유명한 기술이 바로 kubernetes인 것이다.
Kubernetes가 유명한 기술이기는 하지만 설치부터 어려움이 따르고 운영하고 monitoring하는데 있어 사용중에 error가 발생하게 된다면 이를 해결하는데 기술적인 부분이 많이 필요하게 되어 어려움이 존재한다. 그렇기 때문에 AWS, GCP, Azure와 같은 대표적인 public cloud에서는 Amazon EKS, Google Kubernetes Engine, Azure Kubernetes Service와 같이 kubernetes를 감싸고 있는 관리형 service를 제공해주고 있다. 이렇게 되면 사용하는 user들에게 있어서는 그저 사용하는데만 비용을 지불하면 error가 발생하게 되더라도 안정된 상태로 kubernetes를 사용할 수 있게 된다.
비용적인 측면에서라도 아직 public service의 사용이 서툰 사람들은 체험할 수도 있다. 아니면 아예 자체적인 OS를 따로 구비해서 설치하고 사용하면 되는데, 처음 사용하는 user에게는 이 또한 어려움이 존재할 것이다. 이러한 사람들을 위해서 간단한 명령어를 통해서 나만의 private kubernetes를 설치하고 삭제하면서 자유롭게 사용할 수 있는 open source들이 존재한다. MicroK8s, minikube, K3s 등이 이러한 목적으로 시작이 된 open source들이고, 이중에서 간단하게 minikube를 이용해서 kubernetes를 이해해보려고 한다.
Kubernetes와 다른 container orchestration들과는 차이점이 존재한다. Kubernetes에는 원하는 상태라는 "desired state" 개념이 존재하고 이와 어울리게 선언형 인터페이스라는 "declarative interface"로 요청을 수행하게 된다. 기존의 다른 container orchestration 기술들이 명령형 인터페이스를 선호했다면, kubernetes는 선언형 인터페이스를 선호하고 있다.
예를 들어, user들이 kubernetes에 요청을 하고자 할 때는 어떠한 resource를 디테일하게 명령을 내리는 것이 아니라 단순히 어떠한 resource가 딱 하나 있는 상태를 바라고 있다고 명령을 내리게 된다. 이러한 과정에서 kubernetes가 중간에 해당 resource에 대해서 어떠한 작업을 하든지 user는 상관하지 않는 대신에 해당 resource 하나를 유지하는데만 kubernetes에게 기대할 수 있는 것이다. 더 쉬운 예시로 에어컨의 온도를 조절할 때 명령형 인터페이스라면 에어컨 내부의 냉매에 대한 정보와 순환 과정 등을 디테일하게 요청해서 온도를 설정하겠지만, 선언형 인터페이스라면 원하는 목적 자체인 특정 온도를 유지시켜달라고 그저 바라는 내용을 요청만 하는 것이다.
(출처 : kubernetes 공식 홈페이지 https://kubernetes.io/ko/)
Kubernetes의 다른 핵심적인 특징 중 하나는 master와 worker 역할을 하는 node가 분리되어 있다는 것이다. Kubernetes cluster는 보통 1개 이상의 server를 묶어서 구축하게 되는데, 이러한 식으로 cluster를 구성하게 되면 물리적으로 여러대의 server가 분리되어 있어도 실제로 사용하는 user의 입장에서는 가상화가 되어 마치 하나의 컴퓨터를 사용하는 것처럼 여러대의 server를 자유롭게 사용할 수 있게된다.
이러한 식으로 하나로 묶인 cluster는 master 역할을 하는 소수의 control plane node와 worker의 역할을 하는 다수의 node로 구성되어 있다. Control plane은 API server, Cloud controller manager, controller manager, etcd 등의 구성 요소들을 지니고 있다. 즉, control plane node는 여러개의 worker node들을 관리하고 monitoring하면서 client로부터 요청을 받아서 요청에 맞는 worker node를 scheduling해서 해당 node로 요청을 전달하는 역할을 한다. 그리고 이때 사용자가 보내는 요청을 받는 구성 요소의 이름이 API server이고, 사용자가 보내는 요청에 desired state를 key-value 형식으로 database가 바로 etcd라는 구성 요소이다. 그리고 worker node의 현재 상태를 control plane의 API server에 전달하는 역할을 하는 구성 요소가 바로 kubelet이다. 각각의 worker node 내부에서는 kubelet의 명령을 다시 받아서 docker나 container runtime engine이 실제로 container를 생성하고 관리하는 역할을 하게 된다. 많은 구성 요소들이 있지만 기본적으로 이정도는 알아두면 좋다.