컨테이너 런타임 인터페이스

컨테이너 런타임 인터페이스 (Container Runtime Interface, CRI)

쿠버네티스는 다양한 컨테이너 런타임(containerd, CRI-O 등) 중 어떤 것을 골라도 쓸 수 있어요. 어떻게 그게 가능할까요? 바로 CRI(Container Runtime Interface, 컨테이너 런타임 인터페이스) 덕분입니다. CRI는 플러그인 인터페이스로서, kubelet이 클러스터 컴포넌트를 다시 컴파일할 필요 없이 다양한 컨테이너 런타임을 쓸 수 있게 해줍니다.

출처: 쿠버네티스 공식 문서 — Container Runtime Interface (CRI)

클러스터의 각 노드에 동작하는 컨테이너 런타임이 있어야, kubeletPod와 그 컨테이너를 실행할 수 있어요.

CRI는 kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 프로토콜입니다. 쿠버네티스 CRI는 노드 컴포넌트인 kubelet과 컨테이너 런타임 간 통신을 위한 핵심 gRPC 프로토콜을 정의해요.

API (The API)

기능 상태: Kubernetes v1.23 [stable]

kubelet은 gRPC로 컨테이너 런타임에 연결할 때 클라이언트 역할을 합니다. 런타임 서비스와 이미지 서비스 엔드포인트는 컨테이너 런타임이 제공해야 하며, kubelet 안에서 --container-runtime-endpoint 커맨드 라인 플래그로 각각 설정할 수 있어요.

쿠버네티스 v1.26 이후로 kubelet은 컨테이너 런타임이 v1 CRI API를 지원하도록 요구합니다. 런타임이 v1 API를 지원하지 않으면 kubelet은 노드를 등록하지 않습니다.

업그레이드 (Upgrading)

노드에서 쿠버네티스 버전을 업그레이드하면 kubelet이 재시작돼요. 컨테이너 런타임이 v1 CRI API를 지원하지 않으면 kubelet은 등록에 실패하고 오류를 보고합니다. 컨테이너 런타임이 업그레이드되어 gRPC 재연결이 필요하다면, 런타임이 v1 CRI API를 지원해야 연결이 성공합니다. 이 경우 컨테이너 런타임을 올바르게 설정한 뒤 kubelet을 재시작해야 할 수도 있어요.

리스트 스트리밍 (List streaming)

기능 상태: Kubernetes v1.36 [alpha](기본 비활성화)

표준 CRI 리스트 RPC(ListContainers, ListPodSandbox, ListImages)는 모든 결과를 단일 유너리(unary) 응답으로 반환합니다. 컨테이너가 매우 많은 노드(예: 실행 중·중지된 것을 합쳐 약 10,000개 이상)에서는 이 응답이 gRPC의 기본 메시지 크기 제한인 16 MiB를 초과해서, kubelet이 컨테이너 런타임과 상태를 동기화할 때 실패할 수 있어요.

CRIListStreaming 기능 게이트를 켜면 kubelet은 서버 측 스트리밍 RPC(예: StreamContainers, StreamPodSandboxes, StreamImages)를 사용해, 컨테이너 런타임이 결과를 여러 응답 메시지로 나눠 보낼 수 있게 합니다. 이렇게 하면 메시지당 크기 제한을 우회할 수 있어요. 특히 다음 환경에서 유용합니다:

  • 컨테이너 생성·삭제가 잦은 환경(CI/CD 시스템)
  • 대규모 배치 처리 워크로드

컨테이너 런타임이 스트리밍 RPC를 지원하지 않으면, kubelet은 하위 호환성을 위해 자동으로 표준 유너리 RPC로 폴백합니다.

더 알아보기 (Learn more)