[Container] Container Runtime Interface (CRI) 완벽 정리

leehs·2023년 1월 3일
0

Container Runtime Interface

CRI는 Kubelet이 다양한 컨테이너 런타임을 사용할 수 있게 해주는 플러그인 인터페이스 정의이다.

Container Runtime Interface (CRI) – a plugin interface which enables kubelet to use a wide variety of container runtimes.

Doc: https://kubernetes.io/docs/concepts/architecture/cri/
Source: https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/cri-api
Mirror: https://github.com/kubernetes/cri-api

Intro

"Containerd나 cri-o와 같은 '컨테이너 런타임'을 kubernetes 주요 요소인 kubelet 에서 같은 호출 방법으로 제어하여 사용하기 위해 프로토콜을 정의한 것"

현재는 Protobuf 형식으로 작성되어 있다.

cri-api.pkg.apis.runtime.v1.api.proto: https://github.com/kubernetes/cri-api/blob/c75ef5b/pkg/apis/runtime/v1/api.proto

  • 컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트를 다시 컴파일하지 않아도 Kubelet이 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스다.

  • 클러스터의 모든 노드에 동작 중인 컨테이너 런타임이 존재해야, kubelet이 파드들과 컨테이너들을 구동할 수 있다.

  • 컨테이너 런타임 인터페이스(CRI)는 kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 프로토콜이다.

  • 쿠버네티스 컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트 kubelet과 container runtime 사이의 통신을 위한 주요 gRPC 프로토콜을 정의한다.

주요 컨테이너 런타임

High-level Runtime

Img: The differences between Docker, containerd, CRI-O and runc


shim이란,
부품을 정렬하거나 맞추거나 마모를 줄이는 데 사용되는 와셔 또는 얇은 재료 조각.

a washer or thin strip of material used to align parts, make them fit, or reduce wear.

기술 용어로 shim은 소프트웨어 시스템의 구성 요소로,
서로 다른 API 사이의 다리 역할을 하거나 호환성 계층 역할을 한다.

dockerd (engine)

  • dockerd는 컨테이너를 관리하는 persistent 프로세스이다
  • 컨테이너 '엔진'을 포함하는 데몬 프로세스로, 다양한 기능을 제공한다
  • docker cli 로부터 전달되는 REST API 형식 혹은 docker socket 을 통해 전달되는 gRPC 명령을 처리한다 (그림처럼 무조건 REST로만 받는게 아니다.)
  • dockerd 는 명령어를 해석해서 containerd socket을 통해 gRPC로 전달한다

Containerd (High-level Runtime)

  • containerd는 socket을 통해 전달된 gRPC 요청을 처리한다
  • run 명령의 경우, 새 컨테이너로 할당할 runc 인스턴스를 Fork 한다
  • 새로운 컨테이너 할당이 완료되면 runc 프로세스를 종료한다
  • (shim deprecated v1.20 ~) shim 이 실행중인 컨테이너의 부모가 된다
shim 의 역할
  • containerd-shim 은 컨테이너의 stdout, stderr의 스트림을 제공
  • runc 가 fork 후 컨테이너 프로세스를 의도적으로 데몬화 시킴
  • shim 프로세스를 subreaper 로 만들어 컨테이너 프로세스를 shim 에서 관리
  • containerd 가 재시작 하더라도 컨테이너 프로세스는 생존
containerd 변천사

containerd는 CRI 플러그인을 통해 Kubernetes 의 Container Runtime Interface(CRI)를 구현한다.
따라서, v1.11 이후 버전의 Docker를 설치하면 같이 설치되는 Containerd 가 실질적인 Container Runtime이 된다. 그리고 docker 19.03 버전부터 runc 가 containerd 에 통합되었다.
v1.11 이전 버전의 docker 에서는 libcontainer 가 기본 Container Runtime 이다.

TMI: containerd 는 0.0.5 버전부터 runc 를 지원하(려고 노력)했고,
1.1.0 버전부터 default 로 지정되었다.
containerd 1.1.0 release

CRI-O (High-level Runtime)

  • RedHat, Intel, SUSE, Hyper, IBM에서 OCI 표준에 따라 Kubernetes 용 Container Runtime 프로젝트를 추진한 게 CRI-O
  • CRI-O는 아래와 같은 요소로 구성됨
    • podman: Container 실행을 위한 tool
    • buildah: Container 이미지 생성
    • skopeo: Container 이미지 저장소 관리 tool


Low-level Runtime

OCI(Open Container Initiative) Runtime Spec: https://github.com/opencontainers/runtime-spec

runc (OCI Runtime) GoLang

home: https://opencontainers.org/
source: https://github.com/opencontainers/runc

  • runc는 OCI 표준을 구현, 컨테이너 플랫폼과 오케스트레이션의 기본 런타임으로 사용되는 것을 의도하여 경량화와 이식성을 고려해 설계되었다
  • 넓은 폭의 지원과 수많은 사용자 기반이 장점이다

crun (OCI Runtime) CLang

source: https://github.com/containers/crun

  • crun은 대체 가능한 런타임을 목적으로 가볍고 빠르고 사용하기 쉽게 설계하였다
  • CRI-O의 일부로 개발되었으며, OCI 연합의 런타임과 Kubernetes 컨테이너 오케스트레이션 사이의 통합을 목적으로 두었다
  • Kubernetes 에서 사용하는 데 초점을 두고 만들어져서 최적화된 성능과 편리하게 사용할 수 있다

gVisor GoLang

home: https://gvisor.dev/
source: https://github.com/google/gvisor

  • gVisor는 컨테이너 애플리케이션에서 강력한 독립성과 보안성을 목적으로 설계되었다
  • 컨테이너 플랫폼과 오케스트레이션에서 샌드박스 런타임으로써 사용하는 것을 고려해 개발되었다
  • 여러 애플리케이션 간 멀티-테넌시 환경이 중요한 경우에 사용하면 좋다

CRI Spec 구성

서비스로는 크게 "RuntimeService", "ImageService" 로 나뉜다.
각각 컨테이너 관리, 이미지 관리 역할이다.

더 자세한 정의 내용은 proto 파일을 직접 확인해보자.
아주 간단하고 쉽게 작성되어 있다.

  • service RuntimeService

    • rpc Version(VersionRequest) returns (VersionResponse)
    • rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse)
    • rpc StopPodSandbox(StopPodSandboxRequest) returns (StopPodSandboxResponse)
    • rpc RemovePodSandbox(RemovePodSandboxRequest) returns (RemovePodSandboxResponse)
    • rpc PodSandboxStatus(PodSandboxStatusRequest) returns (PodSandboxStatusResponse)
    • rpc ListPodSandbox(ListPodSandboxRequest) returns (ListPodSandboxResponse)
    • rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse)
    • rpc StartContainer(StartContainerRequest) returns (StartContainerResponse)
    • rpc StopContainer(StopContainerRequest) returns (StopContainerResponse)
    • rpc RemoveContainer(RemoveContainerRequest) returns (RemoveContainerResponse)
    • rpc ListContainers(ListContainersRequest) returns (ListContainersResponse)
    • rpc ContainerStatus(ContainerStatusRequest) returns (ContainerStatusResponse)
    • rpc UpdateContainerResources(UpdateContainerResourcesRequest) returns (UpdateContainerResourcesResponse)
    • rpc ReopenContainerLog(ReopenContainerLogRequest) returns (ReopenContainerLogResponse)
    • rpc ExecSync(ExecSyncRequest) returns (ExecSyncResponse)
    • rpc Exec(ExecRequest) returns (ExecResponse)
    • rpc Attach(AttachRequest) returns (AttachResponse)
    • rpc PortForward(PortForwardRequest) returns (PortForwardResponse)
    • rpc ContainerStats(ContainerStatsRequest) returns (ContainerStatsResponse)
    • rpc ListContainerStats(ListContainerStatsRequest) returns (ListContainerStatsResponse)
    • rpc PodSandboxStats(PodSandboxStatsRequest) returns (PodSandboxStatsResponse)
    • rpc ListPodSandboxStats(ListPodSandboxStatsRequest) returns (ListPodSandboxStatsResponse)
    • rpc UpdateRuntimeConfig(UpdateRuntimeConfigRequest) returns (UpdateRuntimeConfigResponse)
    • rpc Status(StatusRequest) returns (StatusResponse)
    • rpc CheckpointContainer(CheckpointContainerRequest) returns (CheckpointContainerResponse)
    • rpc GetContainerEvents(GetEventsRequest) returns (stream ContainerEventResponse)
    • rpc ListMetricDescriptors(ListMetricDescriptorsRequest) returns (ListMetricDescriptorsResponse)
    • rpc ListPodSandboxMetrics(ListPodSandboxMetricsRequest) returns (ListPodSandboxMetricsResponse)
  • service ImageService

    • rpc ListImages(ListImagesRequest) returns (ListImagesResponse)
    • rpc ImageStatus(ImageStatusRequest) returns (ImageStatusResponse)
    • rpc PullImage(PullImageRequest) returns (PullImageResponse)
    • rpc RemoveImage(RemoveImageRequest) returns (RemoveImageResponse)
    • rpc ImageFsInfo(ImageFsInfoRequest) returns (ImageFsInfoResponse)

Reference

0개의 댓글