알고 있는 내용을 정리하고 기록하기 위해 작성하였습니다.
도커는 프로세스 가상화 도구이다. 리눅스의 리소스 격리 기능인 cgroups와 파일 레이어를 쌓아올리는 union file system을 활용하여 컨테이너를 구성하고 있다.
하이퍼바이저와 자주 비교되는데, 하이퍼바이저는 OS 자체를 가상화하는 도구이다. 하이퍼바이저는 타입 1과 타입 2로 구분되는데, 타입 1의 경우는 하드웨어 위에 하이퍼바이저를 두고, 그 위에 OS를 띄우는 방식이고 타입 2의 경우에는 하드웨어 위 OS 위에 하이퍼바이저를 두고, 그 위에 OS를 띄우는 방식이다. 하이퍼바이저 타입 1으로는 리눅스의 kvm-qemu, 마이크로소프트의 hyper-v가 유명하며, 타입 2의 경우에는 vmware의 virtualbox 등이 유명하다. 도커의 경우에는 단순히 OS 위의 프로세스 형태로 존재하며, 컨테이너 프로세스들을 관리하는 작업을 수행한다.
도커가 유명해지면서 OCI와 CRI 등의 표준이 생겼다. OCI의 경우 Open Container Initiative의 약자이며, 컨테이너 실행 및 정지 방식에 대한 방법을 가리킨다. 리눅스 재단에서 관리하고 있다. CRI의 경우 Container Runtime Interface의 약자이며, 쿠버네티스 측에서 제시한 표준이다. 외부에서 컨테이너 런타임을 활용하기 위한 인터페이스에 대한 표준이다. 도커의 경우 CRI를 구현하지 않아 쿠버네티스 측에서 Dockersim을 개발하여 도커를 활용하였으나, 쿠버네티스 자체의 개발에 큰 영향을 미쳐 이를 폐기하였고, 추후 도커 측에서 이를 만족하는 컨테이너 런타임 containerd를 개발했다.
컨테이너 런타임은 컨테이너를 실행할 수 있는 도구를 가리킨다. 도커의 containerd도 있고, cri-o, podman 등 다양한 런타임이 존재한다.
쿠버네티스는 컨테이너 오케스트레이션 도구이다. 선언적 방식으로 컨테이너를 관리할 수 있다. 크게 api-server, etcd, controller manager, scheduler 등으로 나뉘어져 있다. api-server를 통해 쿠버네티스의 모든 통신이 이루어지며, kubectl 명령어 또한 해당 api-server를 사용한다. 등록한 쿠버네티스 오브젝트들은 etcd에 등록되며, controller manager가 관리하고 있는 컨트롤러가 알맞은 쿠버네티스 오브젝트를 읽고 각각 알맞은 작업을 수행한다. 디플로이먼트 컨트롤러, 서비스 컨트롤러 등등 다양한 컨트롤러가 존재한다. 스케줄러는 노드의 상황과 정책에 따라 파드를 배치하는 작업을 수행한다. 각 노드들에 대한 정보 역시 etcd에 등록되어 있다. *
쿠버네티스는 크게 컨트롤 플레인과 노드로 구별되며, 컨트롤 플레인에서 위와 같은 주요 컴포넌트들이 배치되고 노드에 파드 등을 배치한다. 컨트롤 플레인 역시 클러스터 작업을 수행할 수 있다. 이 때 etcd를 동기화하는 작업이 필요한데, 컨트롤 플레인끼리 서로 통신하여 동기화하는 작업을 수행하거나, etcd 서버를 분리하고 해당 etcd 서버를 활용하도록 할 수 있다. 이 때 etcd 서버 역시 클러스터를 따로 구성할 수 있게 된다. *
CS/서버