Kubernetes Architecture #3

공광조 (Lucas Gong)·2023년 7월 28일
0

Kubernetes Architecture

목록 보기
3/3
post-thumbnail

*해당 내용은 edX 및 Linux Foundation에서 제공하는 강의 LinuxFoundationX LFS158x - Introduction to Kubernetes의 내용을 해석 및 요약한 것입니다.
** 본문 내 모든 이미지의 출처는 해당 강의 내 자료 입니다.

이전글 : https://velog.io/@gwangjogong/Kubernetes-Architecture-2

TL;DR

  • Worker node components들 중 Container Runtime과 Node Agent(kubelet)를 다룬다.
  • Container runtime은 k8s가 container들의 lifecycle을 관리하기 위해 활용한다.
    • CRI-O, containerd, Docker engine, MCR 등이 있다.
  • Node Agent(kubelet)은 API server로 부터 Pod definition을 받아, CRI를 통해 container runtime과 소통하고, 그를 통해 node의 container들을 조정한다.

Worker Node Components

k8s 클러스터내 worker node에는 다음과 같은 component들이 있다.

  • Container Runtime
  • Node Agent(kubelet)
  • Proxy(kube-proxy)
  • Add-ons for DNS, Dashboard UI, cluster-level monitoring and logging

Container Runtime

k8s 자체가 container orchestration engine이긴 하지만, 직접적으로 container들을 실행시키고, 조정하는데에는 한계가 있다. 그에따라 k8s는 container의 lifecycle을 관리하기위해, 각 node에 container runtime을 요구한다. runtime은 worker node 뿐만 아니라, control plane node에도 요구된다. 다음은 k8s가 지원하는 대표적인 container runtime 목록이다.

  • CRI-O
  • containerd
  • Docker Engine
  • Mirantis Container Runtime

Node Agent(kubelet)

kubelet은 각 node(control plane, worker)에서 작동하는 agent로, control plane과 소통한다. API server로 부터 Pod definition을 받아오고, 그에 기반하여 container runtime을 통해 node의 container들을 조정한다.

kubelet은 Container Runtime Interface(CRI)를 통해 container runtime과 연결된다. CRI는 protocol buffer, gRPC API, libraries등으로 구성되어 있다. 또한, kubelet은 교환될 수 있는(interchangable) container runtime과 연결하기 위해, CRI shim 이라는 abstraction layer를 사용한다.(하단 사진 참고)

Container Runtime Interface

사진에서 확인 할 수 있듯이, kubetlet은 gRPC client로써, CRI shim의 gRPC server에 연결한다. 이를 통해 container와 image 작업을 실행한다.

CRI는 두가지 서비스를 구현한다: Image Service 와 Runtime Service. Image Service는 모든 image 관련 작업을 담당하고, Runtime Service는 모든 Pod 및 container 관련 작업을 담당한다.

CRI shims

원래 kubelet agents는 몇가지 한정된 container runtime만을 지원했다. 대표적으로 Docker Engine이 유일하게 kubelet 소스코드에 직접적으로 포함되어 있었다. 하지만 해당 방식은 계속 지속되지 않았고, k8s는 CRI를 도입하며 container runtime에 대한 표준화된 접근 방식을 채택했다. 이를 통해 k8s 소스코드를 새로 컴파일 할 필요없이 여러가지 container runtime을 통합할 수 있다. 모든 container runtime은 CRI를 구현하기만 한다면, k8s의 container runtime으로 사용할 수 있다.

CRI Shims는 k8s가 지원하는 각 container runtime의 CRI 구현체(implementations), 인터페이스 및 어댑터이다. 다음은 CRI Shims의 몇가지 예시다.

cri-containerd

cri-containerd는 kubelet 요청시 containerd를 활용하여 container들을 생성 및 관리할 수 있게 해준다.
cri-containerd

CRI-O

CRI-O는 runC와 같은 Open Container Initiative(OCI) compatible runtime을 k8s에서 사용할 수 있게 해준다.

CRI-O

dockershim & cri-dockerd

v1.24이전의 k8s에서는 dockershim이 Docker Engine과 내부 runtime인 containerd를 호출하여, container들을 생성 및 관리했다. Docker Engine이 엄청난 인기가 있었으므로, dockershim이 kubelet의 기본 인터페이스로 사용됐었다.

하지만, v1.24부터 dockershim이 더이상 k8s 프로젝트에서 유지보수가 진행되지 않게되었다.(해당 코드가 k8s 소스코드에서 삭제되었다) 그 결과 Docker Inc. 및 Mirantis 측에서 cri-dockerd라는 대체 adapter를 도입했다.

cri-dockered의 도입으로 Docker Engine과 MCR(Mirantis Container Runtime) 역시 CRI shims implementation을 따르게 되었다.

dockershim

1개의 댓글

comment-user-thumbnail
2023년 7월 28일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기