Kubernetes

[Kubernetes] ContainerD Basics

Sean 션 2024. 7. 3. 15:00

과거의 쿠버네티스

과거에는 쿠버네티스가 도커만을 컨테이너 런타임으로 지원했지만, CRI의 도입으로 인해 다른 벤더의 컨테이너 런타임도 사용할 수 있게 되었습니다. CRI (Container Runtime Interface)는 쿠버네티스에서 다양한 컨테이너 런타임을 지원하기 위해 만들어진 인터페이스입니다. 쿠버네티스의 kubelet과 컨테이너 런타임 간의 표준 인터페이스를 정의하여, 다양한 런타임을 통합하고 관리하는 것을 쉽게 해줍니다.

 

CRI는 OCI (Open Container Initiative) 표준을 만족합니다. OCI는 컨테이너의 생성 및 실행 표준을 정의하는 비영리 조직으로, CRI는 이러한 표준을 따름으로써 다양한 컨테이너 런타임이 서로 호환되도록 합니다. 이를 통해 사용자들은 특정 런타임에 종속되지 않고, 필요에 따라 가장 적합한 런타임을 선택할 수 있습니다.

그 결과로 다양한 벤더들의 지원이 가능해졌으나, 여전히 Docker를 사용하는 것이 대부분이었기 때문에, CRI를 사용하지 않고 도커를 지원하는 dockershim 을 제공했습니다. 따라서 컨테이너 런타임 Docker는 dockershim을 사용하고, rkt같은 다른 벤더는 CRI를 사용하였습니다.

 

도커 지원의 중단

도커는 단순히 컨테이너 런타임이 아니다

도커는 단순히 컨테이너 런타임 이상을 제공합니다. 도커는 다음과 같은 다양한 기능을 포함하는 종합적인 컨테이너 관리 도구입니다:

  • CLI (Command Line Interface): 명령줄을 통해 도커와 상호작용할 수 있는 도구
  • API: 도커의 기능을 프로그래밍적으로 사용할 수 있는 인터페이스 제공
  • Build: 도커 이미지를 빌드하고 관리할 수 있는 도구
  • Volumes: 컨테이너에서 데이터를 지속적으로 저장하고 공유할 수 있는 기능 제공
  • Auth (Authentication): 이미지의 저장소와 사용자 인증 및 권한 관리 지원
  • Security: 컨테이너 보안 기능
  • Container Runtime (containerd): 컨테이너의 실제 실행을 담당하는 런타임

 

containerd

 

containerd는 도커의 핵심 구성 요소 중 하나로, 컨테이너의 실행 및 관리를 담당하는 경량화된 컨테이너 런타임입니다. containerd는 도커의 일부였지만, 현재는 독립적인 프로젝트로 발전하여 CRI(Container Runtime Interface)와 호환됩니다. 이는 containerd가 쿠버네티스와 직접적으로 동작할 수 있게 해줍니다.

 

containerd는 도커 전체가 아닌 그 자체만으로 CRI에 호환되며 쿠버네티스와 직접적으로 동작할 수 있습니다. 따라서 쿠버네티스에서 CRI를 사용해 containerd를 사용합니다. 이에 따라 쿠버네티스는 v1.24 부터 dockershim에 대한 지원을 중단합니다.


ContainerD

도커를 설치하지 않고도 containerd만 설치하여 컨테이너 런타임을 사용할 수 있습니다. 기존에 Docker 컨테이너를 실행하기 위해서 docker run 명령을 사용했는데, 도커를 설치하지 않고서 containerd만으로 어떻게 컨테이너를 실행할 수 있을까요?

1. CLI: ctr

ctr은 containerd를 설치하면 사용할 수 있는 CLI 도구입니다. 전체 Docker에 비해 제한된 기능만을 제공하지만, 이를 통해 컨테이너를 실행할 수 있습니다. ctr은 보통 디버깅과 같은 용도로 사용되며, 운영 환경에서 컨테이너를 관리하기 위해 자주 사용되는 도구는 아닙니다.

 

Hands on: containerd with ctr on amazon linux 2023

 

containerd를 설치합니다.

sudo yum install containerd -y
sudo systemctl enable --now containerd && \\
sudo systemctl restart containerd

 

ctr 명령이 제대로 작동하는지 확인합니다.

ctr

 

레디스 이미지를 가져오는 명령을 실행해봅니다.

sudo ctr images pull docker.io/library/redis:alpine

 

정상적으로 ctr의 pull 명령이 완료되었다

 

다음으로 가져온 이미지를 실행해봅니다.

sudo ctr run docker.io/library/redis:alpine redis

정상적으로 ctr의 run 명령이 완료되었다

 

2. CLI: nerdctl

nerdctl은 ctr의 대안으로, 보다 더 친숙한 환경을 제공합니다. Docker와 비슷한 형태의 CLI를 제공하며, docker-compose를 지원하고, containerd의 최신 기능들을 제공하기도 합니다.

  • Encrypted container images
  • Lazy Pulling
  • P2P image distribution
  • Image signing and verifying
  • Namespaces in Kubernetes

Docker의 거의 모든 명령을 nerdctl을 통해 사용할 수 있습니다. 단순히 docker 에서 nerdctl로 명령을 바꿔주기만 하면 됩니다.

docker run --name redis redis:alpine
nerdctl run --name redis redis:alpine

3. CLI: crictl

crictl은 CRI와 호환되는 컨테이너 런타임을 제공하기 위해 사용됩니다. containerd 뿐만 아니라 다른 컨테이너 런타임에서도 사용합니다. containerd에서 개발된 ctr와 nerdctl와는 다르게 crictl은 쿠버네티스에서 개발된 도구입니다. crictl도 ctr와 마찬가지로 사용자가 일반적인 용도로 사용하기에 적합하진 않습니다.

 

정리하면 다음과 같습니다.

  용도 커뮤니티 동작 환경
ctr 디버깅 containerd containerd
nerdctl 범용 containerd containerd
crictl 디버깅 kubernetes CRI 호환 가능한 런타임