티스토리 뷰

Kubernetes의 Docker container runtime 지원 중단에 대하여

기존에 Container, Kubernetes에 대한 기반 지식이 거의 없는 상태에서 위 내용을 처음부터 잘 이해하기엔 약간의 어려움이 있어서 개인적으로 정리해보았습니다. (얕게 한번 훑어보는 느낌으로)

 

https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/

Kubernetes는 Docker를 더 이상 Container runtime으로 사용하지 않는 것으로 결정했습니다. 1.20.0 버전부터 경고가 표시되며 2021년 하반기 정도로 계획된 1.22 릴리즈에서 완전히 중단될 예정입니다.

 

1. 지원 중단 이후 기존에 Docker로 빌드한 이미지들은 사용할 수 없는 걸까요?

아닙니다. 우리가 Docker를 사용해서 만들었던 컨테이너 이미지들($ docker build ...)은 Kubernetes에서 다른 컨테이너 런타임을 사용하더라도 그대로 사용할 수 있습니다. 그 이유는 Docker의 이미지는 실제로 OCI 이미지 스펙을 기반으로 하고 있기 때문입니다.

OCI(Open Container Initiative) 란?

OCI란, 컨테이너에 대한 표준을 만들고 이를 통일하기 위한 조직이자 프로젝트인데요. 여러 다양한 컨테이너 런타임(containerd, CRI-O)들이 통일된 규격을 사용하고 있습니다.

컨테이너 이미지의 경우 https://github.com/opencontainers/image-spec에 지정된 규격을 사용하고 있기 때문에, Docker에서 빌드 한 이미지 또한 다른 OCI 표준을 따르는 다른 컨테이너 런타임(containerd, cri-o)을 사용하더라도 그대로 사용할 수 있는 것이죠.

2. 왜 Kubernetes는 Container Runtime으로 널리 잘 사용되던 Docker를 지원 중단하는 것일까요?

Docker는 하나의 "플랫폼"으로서 containerd에서 제공하지 않는 Network, 빌드 등 여러가지 기능들을 쉽게 사용할 수 있도록 좀더 사용자(user) 친화적인 UX를 제공하고 있는데요.

 

 

Kubernetes의 Docker 지원 중단을 쉽게 이해하기 위해 잠시 Docker의 container runtime 구조에 대하여 살펴볼 필요가 있습니다.

runC?

Docker는 많은 기반 시스템들(plumbing)들로 구성되는데, 그중에서도 컨테이너 환경을 구성하는 시스템들(e.g. "cgroup", "namespace" 등)을 통합하고 추상화하여 runC라는 범용 경량 컨테이너 런타임을 공개했습니다. 이 runC는 Docker에 대한 종속성이 없도록 모듈화되었고, OCI runtime-spec을 따르기 때문에 쉽게 다른 컨테이너 기반 시스템에서 사용할 수 있습니다.

containerd?

containerd는 고수준 컨테이너 런타임(High-level Container Runtime)으로서, 컨테이너를 실행하기 위한 여러 OS의 syscall들을 추상화하여, 컨테이너를 사용하는 시스템이 커널에 직접 접근하지 않고도 runC와 같은 저수준 컨테이너 런타임을 관리할 수 있습니다. 그 밖에도 컨테이너 이미지를 실행/관리하고 컨테이너들의 수명주기 관리, 오버레이 파일시스템과 같은 Graphdriver가 작동하는 방식을 정의하는 등 여러 가지 역할을 하고 있습니다.

 

결과적으로, 간단하게 정리해보면 Docker Engine은 이미지를 관리하고, 컨테이너를 실행하고 동작시키는 데 있어서 containerd 데몬과 통신하여 runC를 기반으로 컨테이너를 실행하는 것인데요.

 

containerd는 단순히 Docker에서만 사용되도록 만들어진 것이 아닌, Kubernetes 그리고 다양한 OS를 기반으로 한 컨테이너 플랫폼에서 사용될 수 있도록 설계되었습니다. 그 예로, Kubernetes와 잘 통합될 수 있도록 CRI(Container Runtime Interface)를 구현하고 있습니다.

CRI(Container Runtime Interface)란?

Kubernetes에서는 Docker를 컨테이너 런타임으로 사용하기 위해 dockershim과 같은 도구를 kubelet에 구현하여 Docker engine의 인터페이스 변경에 맞게 수정하여 사용해왔습니다.

하지만, 이러한 통합 방식은 kubelet에 대한 깊은 이해가 필요할 뿐만 아니라, 컨테이너 런타임의 유지 보수를 각각 관리해 주어야 하는 유지 보수의 어려움이 존재합니다.

결국 Kubernetes에서는 이러한 어려움을 해결하기 위해 컨테이너 런타임들과 kubelet이 쉽게 통합될 수 있도록 정의 것이 CRI(Container Runtime Interface)이고, containerd, cri-o와 같은 여러 가지 컨테이너 런타임들은 이러한 인터페이스를 충실히 구현하고 있습니다.

kubelet은 그렇게 구현된 인터페이스를 통해 컨테이너 런타임들과 통신하여 컨테이너를 생성, 종료하고 관리하는 동작들을 할 수 있는 것이죠.

 

현재 Kubernetes에서 지원하는 컨테이너 런타임은 다음 문서에서 볼 수 있습니다.

https://kubernetes.io/docs/setup/production-environment/container-runtimes/

3. (정리) 굳이 Docker를 사용할 필요가 없는 Kubernetes

지금까지 이야기한 것들을 정리해보면, 다음과 같습니다.

  • Docker는 Kubernetes 1.20.0부터 컨테이너 런타임으로서 지원 중단 "경고"를 표시하며, 1.22.0(2021년 하반기 예정)부터 완전히 지원 중단될 예정입니다.
  • OCI(Open Container Initiative)는 컨테이너에 관련된 표준을 만드는 조직, 프로젝트입니다.
  • Docker의 이미지는 OCI에서 정의한 이미지 표준을 따르므로, OCI 표준을 준수하는 컨테이너 플랫폼에서는 그대로 사용할 수 있습니다.
  • Docker는 컨테이너를 통해 애플리케이션을 쉽게 배포, 빌드 할 수 있도록 돕기 위한 "플랫폼"입니다.
  • Docker engine은 내부적으로 runC, containerd를 사용하고, 이를 다시 추상화하여 인터페이스를 제공합니다.
    • runC는 격리된 환경인 컨테이너를 구성하는 데 필요한 cgroup, namespace과 같은 시스템들을 통합하여 모듈화한 저수준 컨테이너 런타임입니다.
    • containerd는 컨테이너의 수명주기를 관리하고, 이미지를 실행/관리, syscall 추상화, graphdriver의 동작 방식을 정의하는 등 저수준 컨테이너 런타임을 관리할 수 있는 추상화된 인터페이스를 제공합니다.
    • runC, containerd는 OCI의 스펙을 따르며 따라서 Docker에 대한 종속성 없이 독립적으로 사용될 수 있습니다.
  • 기존에는 Kubernetes에서 dockershim과 같은 도구를 kubelet에 내장하여, Docker engine의 인터페이스 변화에 맞게 유지 보수해 왔습니다.
    • kubelet에 대한 깊은 이해가 필요하고, 유지 보수의 어려움들이 존재합니다.
  • Kubernetes에서는 컨테이너 런타임들과의 유연한 통합과 유지 보수의 효율성을 위해 CRI(Container Runtime Interface)를 정의했습니다.
    • containerd, cri-o와 같은 컨테이너 런타임들은 이러한 인터페이스를 구현하고 있습니다.

 

Docker는 이미 CRI를 제공하는 containerd를 기반으로 하고 있습니다. 그리고 Kubernetes에서는 이미 containerd를 컨테이너 런타임으로 사용할 수 있도록 제공하고 있으며, 기존에 Docker를 컨테이너 런타임으로 사용하더라도 containerd를 컨테이너 런타임으로 사용하는 데 있어서 문제가 없습니다. 때문에 Docker를 지속적으로 지원하는 것은 비효율적이고 불필요하다고 판단한 것입니다.

 

심지어 Docker를 사용하는 것과 containerd를 사용하는 것은 같은 containerd를 사용하는 것이나 다름없지만 pod을 실행하는 데 있어서 latency, CPU usage, Memory usage의 성능 차이도 있다고 합니다.

https://kubernetes.io/blog/2018/05/24/kubernetes-containerd-integration-goes-ga/#performance

 

 

4. 참고한 글(같이 읽으면 좋은 글)

댓글
댓글쓰기 폼