Container Runtime & CRI (Container Runtime Interface)
Container Runtime 과 CRI는 Kubernetes 환경에서 Container 를 실제로 실행하는 역할과 그 실행 방식을 추상화하는 역할을 한다.
1. Container Runtime
컨테이너를 실제로 생성, 시작, 정지, 삭제하는 등의 역할을 수행하는 소프트웨어이다.
일반적으로 사용되는 Container Runtime 에는 Docker , Containerd, CRI - O 등이 있다.
Docker: 한때 가장 널리 사용되었으며, 컨테이너 이미지를 빌드하고 관리하는 도구까지 포함하는 종합 플랫폼.
containerd: Docker의 핵심 구성 요소로 시작되었으나, 독립적인 런타임으로 발전. Docker보다 경량화되어 있고, 컨테이너 실행에 집중되어 있음.
CRI-O: Kubernetes의 CRI(Container Runtime Interface) 표준에 맞춰 설계된 또 다른 경량화 런타임.
주요기능
- 컨테이너 실행
이미지 기반으로 Container Instance 를 시작한다
- 자원할당 및 관리
CPU, 메모리, Network 등 Resource 할당을 효율적으로 관리한다
- 격리 및 보안
각각의 컨테이너가 독립적으로 격리되어 실행되도록 지원한다.
2. CRI (Container Runtime Interface)
CRI는 Kubernetes 와 Container Runtime 사이의 표준화된 인터페이스를 의미한다.
Kubernetes가 Container 를 실행하고 관리할 때 각기 다른 Runtime의 내부 동작 방식을 몰라도 동일한 방식으로 요청하고 제어할 수 있도록 해주는 중간 계층이다.
CRI를 통해 Kubernetes 는 각기 다른 Container Runtime의 세부 구현 방식이나 내부 API를 의존하지 않고 CRI가 제공하는 통일된 Instance(API)를 사용하여 컨테이너를 실행, 상태 확인, 로그 수집 등의 작업을 수행할 수 있다.
CRI 기능
- Pod 실행 요청
Cluster 관리자가 Pod Deployment 명령을 내리면 CRI를 통해 해당 작업을 Container Runtime에게 전달한다
- 상태 체크
실행 중인 컨테이너의 상태나 로그를 조회할 수 있게 해준다.
- 컨테이너 관리
생성, 업데이트 및 삭제 등 컨테이너 lifecycle 관리를 표준화하여 처리한다.
CRI 은 추상적인 인터페이스라고도 불리는 데 이는 CRI이 여러 Container Runtime이 각기 다른 내부 구현 방식이 가지더라도 Kubernetes 에서 동일한 명령어와 API 호출을 통해 작업할 수 있도록 하게 하기 위해서다.
예를 들어, Kubernetes가 Pod를 스케줄링할 때, CRI 인터페이스를 통해 다음과 같은 순서로 작업이 진행된다.
- Pod 생성 요청: Kubernetes는 CRI API를 호출하여 새 Pod 생성 명령을 전달한다.
- 런타임 내부 처리:
- Docker: Docker 데몬이 해당 요청을 받아 컨테이너 생성 및 실행.
- containerd: 경량화된 방식으로 컨테이너를 생성하고 시작.
- CRI-O: CRI 표준에 맞춰 간소화된 방식으로 작업을 처리.
- 상태 및 결과 반환: 각 런타임은 성공, 실패, 상태 정보 등을 CRI를 통해 Kubernetes에 전달하여 클러스터 상태를 업데이트한다
이처럼 Kubernetes는 내부에서 CRI를 두어 여러 Runtime의 차이를 일관된 방식으로 컨테이너 작업을 수행할 수 있게 만들어준다는 것이다.