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

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

CRI는 kubelet이 클러스터 구성 요소를 다시 컴파일할 필요 없이 다양한 컨테이너 런타임을 사용할 수 있게 해주는 플러그인 인터페이스예요.

클러스터의 각 노드에 동작하는 컨테이너 런타임이 필요해요. 그래야 kubelet이 파드와 그 컨테이너를 시작할 수 있어요.

CRI(Container Runtime Interface)는 kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 프로토콜이에요.

쿠버네티스 CRI는 노드 구성 요소인 kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 gRPC 프로토콜을 정의해요.

출처: 문서

본문

API

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)

이 기능을 사용하려면 (클러스터 관리자나) 클러스터의 모든 관련 구성 요소에서 CRIListStreaming 기능 게이트를 활성화해야 해요.

기능 게이트 활성화/비활성화에 대한 자세한 내용은 '기능 게이트 활성화 또는 비활성화' 문서를 참고하세요.

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

CRIListStreaming 기능 게이트를 활성화하면 kubelet은 서버 측 스트리밍 RPC(StreamContainers, StreamPodSandboxes, StreamImages 등)를 사용해서, 컨테이너 런타임이 결과를 여러 응답 메시지로 나눌 수 있게 해 메시지당 크기 제한을 우회해요. 이는 특히 다음에 유용해요.

  • 컨테이너 회전(churn)이 많은 환경 (CI/CD 시스템)
  • 대규모 배치 처리 워크로드

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

더 알아보기 (Learn more)