쿠버네티스는 도커를 버리는 중입니다

Roeniss Moon·2020년 12월 3일
24
post-thumbnail

이 내용은 다음 레퍼런스들을 읽고 간단히 요약한 것입니다. k8s와 docker 및 container에 대해 깊은 이해가 없는 상태에서 나름대로 정리하려고 노력한 글이므로, 가급적이면 훑어만 보시고 나머진 원문을 읽으시길 권장합니다.

(타이틀은 유머로 받으시길)

2021/8/20 추가: https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/ 이 글을 읽을 것을 강력히 권장함

Wait, Docker is deprecated in Kubernetes now? What do I do?

원문: https://dev.to/inductor/wait-docker-is-deprecated-in-kubernetes-now-what-do-i-do-e4m

k8s가 작동하는 방식

  • k8s: Orchestration tool that "controls distributed compute resources"
  • k8s -> node에 붙어있는 kubelet를 통해 node를 관리
  • kubelet -> node에 (pod라는 logical group을 이용하여) container(for images)를 구동
  • 그런데 container가 구동되기 위해선 container runtime, 즉 컨테이너를 돌리기 위한 environment가 필요함. (마치 js 코드를 서버에서 돌리려면 node가 필요하듯이)

docker의 두 가지 문제점

  • kubelet이 컨테이너를 생성하거나 제거하기 위해서 사용하는 API가 CRI(Container Runtime Inferface)
  • 그런데 docker는 이 CRI를 지원하지 않음. 조금 비약을 섞자면, 표준을 지키지 않는 셈
  • k8s는 그동안 dockershim이라는 브리지 서비스를 운영해옴. 이것은 CRI support for docker인데, 그동안 이것으로 Docker 속의 containerd와 소통하고 있었음. 그런데 k8s 커뮤니티는 이것을 운영하는 것이 점점 힘들어지는 상황. 이것이 docker를 버리는 첫 번째 이유. (구체적으로 힘든 이유)
  • 또한, docker는 그 자체로 Volume, Network, Container Runtime등 다양한 컴포넌트들을 가지고 있는데 k8s에선 사실 Runtime만 있으면 됨. 나머진 k8s의 다른 컴포넌트들이 책임지니까. 이것이 docker를 버리는 두 번째 이유.

대안 - pure Container Runtimes

  • Containerd (Docker에서 runtime job을 맡고 있음)
  • CRI-O

그런데 CRI는 정확히 무엇을 하나?

  • kublet으로부터 gRPC request를 받아서,
  • OCI 구동을 위한 json config 파일 생성, 이후 OCI에 전달함
  • 실질적으로 컨테이너를 직접 spawn하는 것은 OCI. CRI는 그것을 추상화한 중간 매개자 정도
  • OCI examples: runC, gVisor

Don't Panic: Kubernetes and Docker

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

tl;dr

  • end-user: 그냥 도커 계속 써도 됨 (*클러스터 업데이트 안할 경우, 를 말하는 것 같음)
  • managed-k8s' user: 지금 쓰는 Container Runtime이 향후 사라질 예정인지(=docker인지) 체크
  • cluster admin: v1.20 부터는 deprecation warning for Docker 등장. 2021년 말 쯤엔 완전히 지원 끊음

개발자들을 위한 추가 설명

  • Docker가 만드는 Image는 docker-specific하다는 통념과 다르게 OCI(Open Container Initiative) image다. 따라서 쿠버네티스 안에서는 어떤 container runtime을 쓰던 (OCI-compliant하다면) 이미지는 일관되게 똑같을 것이며, containerd와 CRI-O는 이러한 image를 어떻게 pull하는지 잘 알고 있음. 이게 표준이 필요한 이유임.

그 외 읽기 쉽고 알아두면 좋은 글

https://post.naver.com/viewer/postView.nhn?volumeNo=28882881

http://www.opennaru.com/kubernetes/cri-o/

profile
기능이 아니라 버그예요

0개의 댓글