kubernetes와 다른 컨테이너 관리도구들의 관계

2022. 8. 1. 12:37kubernetes | docker

<참고>
프로세스를 나누어서 실행하는 컨테이너 방식이 생태계를 넓혀가면서 여러 회사가 솔루션을 제공했지만 포맷과 러타임에 대한 특정한 규격과 표준 없었고....컨테이너의 미래는 불안하고 불명확했었다.
 
컨테이너 시장은 OCI의 런타임 명세와 이미지 명세를 준수하는 방향으로 성장하였으며, 이 과정에서 2016년 12월 k8s의 컨테이너 런타임을 만들기 위한 CRI(Container Runtime initiative)<리눅스 표준>를 구성. 이 후 컨테이너 시장은 OCI의 런타임 명세와 이미지 명세를 준하는 방향으로 성장하였고, 그 과정에서 2016년 12월 k8s의 컨테이너 런타임을 만들기 위한 CRI(Container Runtime Interface)가 등장.
 
OCI가 만들어질 당시 비공식적 표준 역할을 하던 도커는 컨테이너 런타임의 표준화를 위해 필요한 모든 단계가 아닌 세 번째 단계인 컨테이너의 실행 부분만 표준화하였습니다. 이로 인해 컨테이너의 런타임은 실제 컨테이너를 실행하는 저수준 컨테이너 런타임인 OCI 런타임과 컨테이너 이미지의 전송 및 관리, 이미지 압축 풀기 등을 실행하는 고수준 컨테이너 런타임으로 나뉘게 되었습니다.

 

 

 

저수준 컨테이너 런타임(Low-Level Container Runtimes)

 
컨테이너는 Linux namespace와 cgroup을 사용하여 구현합니다. namespace는 각 컨테이너에 대해 파일 시스템이나 네트워킹과 같은 시스템 리소스를 가상화하고 cgroup은 각 컨테이너가 사용할 수 있는 CPU 및 메모리와 같은 리소스 양을 제한하는 역할을 합니다. 저수준 컨테이너 런타임은 이러한 namespace와 cgroup을 설정한 다음 해당 namespace 및 cgroup 내에서 명령을 실행합니다.

 

OCI를 준수하는 저수준 컨테이너 런타임으로 가장 잘 알려진 것은 runC입니다.  runC는 원래 도커에서 컨테이너를 실행하기 위해 개발되었으나, OCI 런타임 표준을 위해 독립적인 라이브러리로 사용되었습니다. 저수준 컨테이너 런타임은 컨테이너를 실제 실행하는 역할을 하지만 이미지로부터 컨테이너를 실행하려면 이미지와 관련된 API 같은 기능이 필요. 이러한 기능은 고수준 컨테이너 런타임에서 제공된다.(ex> docker run -it ....)
 
고수준 컨테이너 런타임(High-Level Container Runtimes)
 
일반적으로 고수준 컨테이너 런타임은 원격 애플리케이션이 컨테이너를 논리적으로 실행하고 모니터링 하는데 사용할 수 있는 데몬 및 API를 제공합니다. 또한 컨테이너를 실행하기 위해 저수준 런타임 위에 배치됩니다.
 
이처럼 컨테이너를 실행하려면 저수준 및 고수준 컨테이너 런타임이 필요하기 때문에 OCI 런타임과 함께 도커가 그 역할을 했습니다. 도커는 docker-containerd라는 가장 잘 알려진 고수준 컨테이너 런타임을 제공합니다. containerd도 runC와 마찬가지로 도커에서 컨테이너를 실행하기 위해 개발되었으나 나중에 독립적인 라이브러리로 추출되었습니다.
 
 
 
CRI(Container Runtime Interface)
 
CRI는 쿠버네티스에서 만든 컨테이너 런타임 인터페이스로 개발자들의 컨테이너 런타임 구축에 대한 진입 장벽을 낮추어 줍니다. 초기 쿠버네티스는 컨테이너를 실행하기 위해 도커를 사용하였는데 이는 쿠버네티스 클러스터 워커 노드의 에이전트인 Kubelet 소스코드 내부에 통합되어 있었습니다. 이처럼 통합된 프로세스는 Kubelet에 대한 깊은 이해를 필요로 하였고 쿠버네티스 커뮤니티에 상당한 유지보수 오버헤드를 발생시켰습니다. 이러한 문제를 해결하기 위해 쿠버네티스는 CRI를 만들어 명확하게 정의된 추상화 계층을 제공함으로써 개발자가 컨테이너 런타임 구축에 집중할 수 있게 하였습니다.
 
 
 
  1. k8s에서 제공하는 컨테이너 CRI-O
 
CRI가 만들어진 후 주요 플랫폼 벤더들은 본격적으로 컨테이너 런타임 구축을 위해 노력하였습니다. 그 중 레드햇, 인텔, SUSE, Hyper, IBM 등의 관리자와 컨트리뷰터들이 커뮤니티 중심의 오픈소스 프로젝트인 CRI-O를 개발하였습니다.
 
 
CRI-O(Container Runtime Interface - Open Container Initiative)
CRI-O는 CRI와 OCI에서 유래된 프로젝트이며 컨테이너 런타임 및 이미지가 OCI와 호환되느느 것에 중점을 두고 있다. CRI 표준 컴포넌트를 최소한의 런타임으로 구현하며 k8s에서 모든 OCI 호환 런타임 및 컨테이너 이미지를 지원함.
 
CRI-O는 컨테이너의 실행을 목적으로 경량화했기 때문에 도커가 제공하는 컨테이너 생성 및 이미지 빌드와 같은 기능은 제공하지 않습니다. 즉, CRI-O 덕분에 쿠버네티스는 컨테이너를 실행할 때 도커가 필요없었으나, 컨테이너의 생성 및 이미지 빌드와 같은 과정에서는 여전히 도커를 필요로 했습니다. 이러한 이유로 CRI-O 개발팀은 도커를 대체할 수 있는 새로운 생태계를 만들기 위해 노력하였습니다.OCI를 준수하는 저수준 컨테이너 런타임으로 가장 잘 알려진 것은 runC입니다.  runC는 원래 도커에서 컨테이너를 실행하기 위해 개발되었으나, OCI 런타임 표준을 위해 독립적인 라이브러리로 사용되었습니다. 저수준 컨테이너 런타임은 컨테이너를 실제 실행하는 역할을 하지만 이미지로부터 컨테이너를 실행하려면 이미지와 관련된 API 같은 기능이 필요. 이러한 기능은 고수준 컨테이너 런타임에서 제공된다.(ex> docker run -it ....)
 
고수준 컨테이너 런타임(High-Level Container Runtimes)
 
일반적으로 고수준 컨테이너 런타임은 원격 애플리케이션이 컨테이너를 논리적으로 실행하고 모니터링 하는데 사용할 수 있는 데몬 및 API를 제공합니다. 또한 컨테이너를 실행하기 위해 저수준 런타임 위에 배치됩니다.
 
 
이처럼 컨테이너를 실행하려면 저수준 및 고수준 컨테이너 런타임이 필요하기 때문에 OCI 런타임과 함께 도커가 그 역할을 했습니다. 도커는 docker-containerd라는 가장 잘 알려진 고수준 컨테이너 런타임을 제공합니다. containerd도 runC와 마찬가지로 도커에서 컨테이너를 실행하기 위해 개발되었으나 나중에 독립적인 라이브러리로 추출되었습니다.
 
 
 
CRI(Container Runtime Interface)
 
CRI는 쿠버네티스에서 만든 컨테이너 런타임 인터페이스로 개발자들의 컨테이너 런타임 구축에 대한 진입 장벽을 낮추어 줍니다. 초기 쿠버네티스는 컨테이너를 실행하기 위해 도커를 사용하였는데 이는 쿠버네티스 클러스터 워커 노드의 에이전트인 Kubelet 소스코드 내부에 통합되어 있었습니다. 이처럼 통합된 프로세스는 Kubelet에 대한 깊은 이해를 필요로 하였고 쿠버네티스 커뮤니티에 상당한 유지보수 오버헤드를 발생시켰습니다. 이러한 문제를 해결하기 위해 쿠버네티스는 CRI를 만들어 명확하게 정의된 추상화 계층을 제공함으로써 개발자가 컨테이너 런타임 구축에 집중할 수 있게 하였습니다.
 
 
  1. k8s에서 제공하는 컨테이너 CRI-O
 
CRI가 만들어진 후 주요 플랫폼 벤더들은 본격적으로 컨테이너 런타임 구축을 위해 노력하였습니다. 그 중 레드햇, 인텔, SUSE, Hyper, IBM 등의 관리자와 컨트리뷰터들이 커뮤니티 중심의 오픈소스 프로젝트인 CRI-O를 개발하였습니다.
 
 
CRI-O(Container Runtime Interface - Open Container Initiative)
CRI-O는 CRI와 OCI에서 유래된 프로젝트이며 컨테이너 런타임 및 이미지가 OCI와 호환되느느 것에 중점을 두고 있다. CRI 표준 컴포넌트를 최소한의 런타임으로 구현하며 k8s에서 모든 OCI 호환 런타임 및 컨테이너 이미지를 지원함.
 
CRI-O는 컨테이너의 실행을 목적으로 경량화했기 때문에 도커가 제공하는 컨테이너 생성 및 이미지 빌드와 같은 기능은 제공하지 않습니다. 즉, CRI-O 덕분에 쿠버네티스는 컨테이너를 실행할 때 도커가 필요없었으나, 컨테이너의 생성 및 이미지 빌드와 같은 과정에서는 여전히 도커를 필요로 했습니다. 이러한 이유로 CRI-O 개발팀은 도커를 대체할 수 있는 새로운 생태계를 만들기 위해 노력하였습니다.

'kubernetes | docker' 카테고리의 다른 글

replication controller, replicaset  (0) 2022.08.01
deployment vs statefulsets  (0) 2022.08.01
Docker 운영방식과 구조  (0) 2022.08.01
docker와 CRI-O 같이 운영 방법  (0) 2022.08.01
K8S Cluster IP Change Procedure  (0) 2022.08.01