Huny's Dev Blog
huny.dev

containerd 2.0 아키텍처 해부: 7년 만의 대전환·Transfer Service 스트리밍 파이프라인과 OCI 1.1 Referrers 공급망 보안 DAG

2017년 1.0 이후 7년 만에 공식 출시된 containerd 2.0의 아키텍처 혁신을 분석한다. libchan 기반 Transfer Service의 범용 데이터 스트리밍과 Image Verifier 플러그인 인라인 검증, OCI 1.1 Referrers API를 통한 SBOM·Cosign 암호화 서명 그래프 바인딩, Sandbox Controller 및 v1 Shim·AUFS 기술 부채 청산과 로컬 Python 6대 검증 시뮬레이션을 살펴본다.

Hun Jang
Hun Jang Nov 14, 2026

containerd 2.0과 OCI 1.1 클라우드 네이티브 공급망 생태계를 상징하는 사이버네틱 큐브 클러스터와 데이터 스트리밍 웨이브 비주얼 아트워크 (텍스트 없는 순수 그래픽 .png)

2017년 12월 1.0 정식 버전이 발표된 이래, 전 세계 클라우드 인프라와 Kubernetes 생태계의 사실상 표준 컨테이너 런타임으로 자리 잡아온 containerd가 **무려 7년 만에 두 번째 메이저 버전인 containerd 2.0**을 공식 릴리스했다. 지난 7년간 containerd는 Docker Moby 엔진의 하부 코어에서 시작하여 CNCF 졸업 프로젝트로 성장했고, Kubernetes가 Dockershim을 공식 폐기한 이후 전 세계 수백만 개 쿠버네티스 노드의 심장 역할을 도맡아왔다. 그러나 장기간 메이저 버전을 동결한 채 1.x 마이너 업그레이드를 이어오면서 누적된 레거시 기술 부채—초기 runc-v1 쉼(shim), 구형 AUFS 파일시스템, 폐기된 CRI v1alpha2, Docker Schema 1 이미지 등—는 현대적인 클라우드 네이티브 보안과 고성능 파이프라인의 진화를 가로막는 걸림돌이 되었다. containerd 2.0은 이러한 낡은 인터페이스를 과감히 정리하는 한편, Transfer Service의 정식 안정화와 OCI 1.1(Open Container Initiative) 완전 지원을 축으로 차세대 컨테이너 플랫폼의 새로운 기준을 확립했다.

실무 판단 기준을 먼저 요약하면, containerd 2.0은 단순한 마이너 버그 픽스가 아니라 데이터 전송 계층의 전면적인 현대화(Transfer Service)와 공급망 보안(OCI 1.1 Referrers API)의 완결판이다. 이전 1.x 버전에서 이미지 다운로드와 저장이 내부 이미지 스토어에 강하게 결합되어 있던 구조를 탈피하여, 레지스트리·로컬 스토어·타르볼 스트림을 자유자재로 연결하는 범용 바이너리 스트리밍 파이프라인을 정식 기본 엔진으로 채택했다. 이를 통해 이미지 다운로드 과정에서 바이너리 플러그인이 Cosign 암호화 서명과 SBOM(소프트웨어 자재명세서)을 인라인으로 직접 검증하여 위변조되거나 취약한 이미지가 로컬 디스크에 기록조차 되지 못하게 원천 차단하는 강력한 보안 게이트웨이를 구성할 수 있게 되었다. 또한 OCI 1.1 Referrers API를 통해 기존의 지저분한 태그 편법(sha256-xxx.sig) 없이 이미지 다이제스트를 루트로 하는 트리(DAG) 형태로 서명과 SBOM을 우아하게 결합한다. 그러나 업그레이드 전 반드시 주의해야 할 점은 containerd-shim-runc-v1, AUFS 스냅샷터, Kubernetes CRI v1alpha2, Docker Schema 1 이미지가 완전히 영구 제거되었으므로, 프로덕션 노드 전환 전 ctr deprecations list와 containerd config migrate를 통해 기존 설정과 레거시 의존성을 전수 검사해야 한다는 사실이다. 이 글은 containerd 2.0 공식 릴리스 노트, OCI 1.1 스펙, CNCF 업스트림 아키텍처 및 로컬 Python 6대 검증 시뮬레이션을 기준으로 설명한다.

1. 7년 만의 메이저 판올림 배경과 기술 부채의 전면 청산

containerd 1.x는 2017년부터 1.7에 이르기까지 뛰어난 하위 호환성을 유지해왔으나, 현대적인 리눅스 커널 기능과 쿠버네티스 요구사항을 수용하기에는 한계가 누적되어 있었다. containerd 2.0은 7년간 쌓인 레거시를 전면 정리했다:

  • 1. containerd-shim-runc-v1 및 오리지널 shim 완전 제거: 초창기 프로세스 관리자였던 v1 쉼은 cgroup v2의 완벽한 리소스 제어 및 쿠버네티스 파드(Pod) 수명주기 동기화에 구조적 한계를 가지고 있었다. 2.0에서는 v1 쉼이 완전히 삭제되었으며, 오직 io.containerd.runc.v2 쉼만이 공식 지원된다.
  • 2. AUFS 스냅샷터(Snapshotter) 영구 퇴출: 리눅스 메인라인 커널에서 공식 제거된 구형 유니온 파일시스템 AUFS 드라이버가 완전히 삭제되었다. 현재 프로덕션 환경의 기본 스냅샷터는 커널 네이티브 overlayfs로 일원화되었다.
  • 3. Kubernetes CRI v1alpha2 API 삭제: Kubernetes 1.26에서 이미 공식 제거된 구형 v1alpha2 엔드포인트를 완전히 정리하고, 오직 정식 CRI v1 사양만 제공한다. 이에 따라 Kubernetes 1.25 이하의 초구형 클러스터는 containerd 2.0과 연동할 수 없다.
  • 4. Docker Schema 1 이미지 포맷 기본 차단: 2015년 이전의 보안 취약점(서명 검증 우회 및 체크섬 결함)을 안고 있는 Docker Schema 1 매니페스트는 2.0에서 기본적으로 거부된다. 프로덕션 환경에서 여전히 Schema 1 이미지를 사용 중이라면 OCI 매니페스트 또는 Docker Schema 2로 반드시 재빌드해야 한다.
  • 5. 실시간 사용량 감사 도구 (ctr deprecations list): 노드 업그레이드 시 예기치 않은 중단을 방지하기 위해, 데몬이 실행 중에 레거시 플러그인이나 폐기 예정 API의 호출 횟수를 실시간으로 추적하는 인트로스펙션 API를 제공한다. 운영자는 쉘에서 아래 명령으로 노드의 마이그레이션 준비 상태를 즉시 진단할 수 있다:

2. Transfer Service 스트리밍 엔진과 Image Verifier 인라인 게이트

containerd 1.x에서 이미지 가져오기(pull), 내보내기(export), 보관(import)은 내부 Image Store 로직과 복잡하게 얽혀 있어 커스텀 스토리지 백엔드나 새로운 전송 프로토콜을 플러그인 형태로 확장하기 어려웠다. containerd 2.0은 이를 해결하기 위해 Transfer Service를 정식 안정화(Stable) 기능으로 승격시켰다.

2.1 libchan 철학 기반의 범용 바이너리 스트리밍 파이프라인

Transfer Service는 Docker 창립 멤버들의 동시성 채널 라이브러리인 libchan의 철학에서 영감을 받았다.

  • 일급 객체로서의 스트림: 임의의 소스(Registry, Local Storage, Tarball Stream)와 목적지를 연결하는 양방향 바이너리 데이터 채널을 일급 객체(First-class Object)로 다룬다.
  • 단일화된 클라이언트 인터페이스: Go 클라이언트의 client.Transfer API와 CLI 도구인 ctr images pull/push/import/export가 모두 내부적으로 동일한 Transfer Service 스트리밍 파이프라인을 통과하도록 리팩토링되었다.
  • 무한한 확장성: 전송 경로가 추상화된 스트림 디스크립터(Stream Descriptors)를 기반으로 동작하므로, 코어 데몬의 버전을 올리지 않고도 독자적인 네트워크 프로토콜(P2P 분산 이미지 배포, 지연 로딩 eStargz/SOCI 스트리밍 등)을 손쉽게 결합할 수 있다.

2.2 Image Verifier Plugins: 인라인 보안 게이트웨이

Transfer Service의 가장 혁신적인 엔지니어링 진보는 바이너리 기반 Image Verifier Plugin 인터페이스의 정식 통합이다.
과거에는 이미지를 로컬 스토리지에 전부 다운로드한 뒤에야 후행 배치 작업으로 서명을 검증하거나 취약점을 분석했다. 이 방식은 악성 코드가 이미 디스크 블롭으로 적재된 후에야 탐지된다는 치명적인 보안 허점을 안고 있었다.

containerd 2.0의 Transfer Service 파이프라인은 네트워크 스트림이 로컬 Content Store에 기록되는 중간에 Image Verifier 바이너리 플러그인이 실시간으로 개입한다:

  1. 스트림 가로채기(Intercept): 레지스트리로부터 매니페스트와 레이어 데이터가 유입되는 즉시 플러그인이 서명 검증을 수행한다.
  1. 인라인 차단(Abort): Cosign 전자서명이 유효하지 않거나 사내 승인되지 않은 베이스 이미지가 감지되면, Transfer Service 파이프라인은 데이터 전송을 그 즉시 중단하고 HTTP 연결을 끊어버린다.
  1. 무오염 원칙(Zero-Pollution): 검증에 실패한 이미지는 로컬 Content CAS 블롭 영역에 단 1바이트도 기록되지 않으므로 디스크 오염과 캐시 변조가 원천적으로 방지된다.

3. OCI 1.1 Referrers API와 그래프(DAG) 기반 공급망 보안

containerd 2.0은 2024년 공식 확정된 OCI Image & Distribution Specification v1.1을 완벽하게 네이티브 지원한다. 이는 컨테이너 생태계의 소프트웨어 공급망 보안(Software Supply Chain Security)을 완성하는 결정적인 전환점이다.

3.1 태그 꼼수의 종말과 Referrers API

기존 OCI 1.0 규격에서는 컨테이너 이미지 외에 암호화 서명이나 SBOM을 저장할 표준 방법이 없었다. 그 결과 Cosign 등의 도구는 원본 이미지 다이제스트를 변형하여 sha256-abc123...sig라는 가짜 이미지 태그를 강제로 만들어 레지스트리에 푸시하는 지저분한 우회책을 사용해야 했다. 이 방식은 태그 목록을 오염시키고, 이미지 정리(Garbage Collection) 시 서명이 고아 객체로 남아버리는 심각한 결함을 유발했다.

OCI 1.1은 **매니페스트의 subject 필드와 전용 Referrers API (/v2/<name>/referrers/<digest>)**를 도입했다:

  • 비순환 방향 그래프(DAG) 구조: 원본 컨테이너 이미지의 고유 다이제스트를 루트(Parent)로 두고, 암호화 서명·SPDX/CycloneDX SBOM·Trivy 스캔 보고서(SARIF)가 subject 필드로 부모 다이제스트를 명시적으로 가리킨다.
  • 투명한 역방향 쿼리: containerd는 레지스트리에 원본 이미지 다이제스트만 조회하면, 그 이미지에 부착된 모든 하위 서명과 자재명세서를 트리 구조로 단번에 역추적하여 가져올 수 있다.
  • 수명주기 일체화: 부모 이미지가 삭제되거나 승인 취소되면 연관된 서명과 SBOM 아티팩트 그래프가 함께 관리되므로 공급망 메타데이터의 정합성이 완벽하게 유지된다.

3.2 범용 OCI 아티팩트 (artifactType) 수용

OCI 1.1의 또 다른 강력한 특징은 매니페스트에 artifactType 속성을 공식 부여했다는 점이다. 이제 containerd는 전통적인 리눅스 컨테이너 이미지뿐만 아니라 WebAssembly(Wasm) 모듈, Helm 차트, OPA(Open Policy Agent) 거버넌스 정책 번들, 머신러닝 모델 가중치 파일까지 컨테이너 인프라와 동일한 레지스트리·캐시·전송 파이프라인으로 일관되게 배포하고 실행할 수 있다.

containerd 2.0 런타임 아키텍처: Transfer Service 스트리밍 파이프라인, OCI 1.1 Referrers DAG, Sandboxed CRI 및 레거시 제거 방어선 도식도 (로컬 고해상도 렌더링 .png)

4. Sandboxed CRI, NRI 런타임 훅 및 무권한 격리(User Namespace)

containerd 2.0은 쿠버네티스 워크로드를 실행하는 코어 런타임 계층에서도 괄목할 만한 성능과 보안 향상을 이루어냈다.

4.1 Sandboxed CRI와 Sandbox Controller의 정식 채택

기존 1.x의 CRI 플러그인은 파드 샌드박스와 컨테이너를 관리하기 위해 단일 모놀리식 CRI 서버 구현에 의존했다. 반면 containerd 2.0은 파드 단위 격리를 전담하는 Sandbox Controller 아키텍처를 기본 활성화했다:

  • 파드 수명주기 일급 제어: 파드의 cgroup v2 슬라이스 생성, CNI 네트워크 네임스페이스 바인딩, 내부 다중 컨테이너 상태 머신을 독립적인 샌드박스 컨트롤러가 정밀하게 조율한다.
  • VM 기반 런타임과의 인터페이스 단일화: 일반적인 runc 기반 격리뿐만 아니라 Kata Containers나 AWS Firecracker 같은 가상머신(VM) 기반 마이크로VM 샌드박스도 별도의 코드 브랜치 없이 동일한 Sandbox Controller API를 통해 완벽히 투명하게 구동된다.

4.2 NRI(Node Resource Interface) & CDI(Container Device Interface) 기본 활성화

  • NRI (Node Resource Interface): 쿠버네티스의 변이 웹훅(Mutating Webhook)을 노드 내부 컨테이너 런타임 수준으로 끌어내린 기술이다. 컨테이너가 생성되거나 실행되기 직전에 플러그인이 개입하여 CPU 코어 핀닝, 메모리 NUMA 노드 바인딩, 네트워크 파라미터를 저지연으로 재구성할 수 있다. containerd 2.0에서는 NRI가 기본 활성화된다.
  • CDI (Container Device Interface): GPU, NPU, FPGA, RDMA와 같은 차세대 AI 가속기를 표준화된 스펙 파일로 컨테이너에 마운트한다. 과거 엔비디아 드라이버 컨테이너 툴킷의 복잡한 래퍼 없이도 하드웨어 벤더 중립적인 가속기 할당이 가능해졌다.

4.3 idmap 마운트 기반 User Namespace 강화

루트리스(Rootless) 컨테이너 및 다중 테넌트 격리의 핵심 난제였던 파일 권한 매핑 문제를 해결하기 위해, 리눅스 5.12+ 커널의 idmap 마운트 기능을 적극 채택했다. 호스트의 디스크 스토리지를 번거롭게 재chown하지 않고도 컨테이너 내부의 root(UID 0)를 호스트의 일반 사용자 UID로 안전하게 격리함으로써, 컨테이너 탈옥(Escape) 공격이 발생하더라도 호스트 시스템 권한 탈취를 원천 차단한다.

5. containerd 1.7 vs containerd 2.0 핵심 비교

containerd 1.7과 2.0의 결정적인 차이점을 아래 표로 대조했다:

비교 항목
containerd 1.7 (구형 안정화)
containerd 2.0 (차세대 메이저)
실무 엔지니어링 영향
데이터 전송 아키텍처
내부 Image Store 종속 pull/push 로직
Transfer Service 스트리밍 엔진 정식 안정화
임의 소스/목적지 간 고성능 바이너리 파이프라인
공급망 보안 검증
다운로드 완료 후 디스크 사후 검증
Image Verifier Plugin 인라인 실시간 차단
위변조 및 미서명 이미지의 디스크 유입 원천 차단
OCI 스펙 호환성
OCI 1.0 (태그 꼼수 sha256-xxx.sig 의존)
OCI 1.1 네이티브 지원 (Referrers API DAG)
다이제스트에 SBOM·Cosign 서명 공식 트리 바인딩
컨테이너 런타임 쉼
runc-v1, runc-v2 혼재 지원
containerd-shim-runc-v2 단일 표준 강제
구형 v1 쉼 영구 제거, cgroup v2 완벽 통합
스토리지 스냅샷터
overlayfs, aufs, btrfs, zfs 등
AUFS 완전 삭제, OverlayFS 중심 표준화
커널 메인라인 호환성 및 파일시스템 안정성 확보
CRI 통신 프로토콜
CRI v1 및 레거시 v1alpha2 지원
CRI v1 단일화, v1alpha2 영구 폐기
Kubernetes 1.26+ 필수, 구형 클러스터 단절
데몬 설정 파일 규격
config.toml version = 2
config.toml version = 3 (마이그레이션 필수)
containerd config migrate로 자동 변환 지원

6. 혼동하기 쉬운 5가지 핵심 실무 경계와 트레이드오프

containerd 2.0을 클러스터에 도입하거나 운영 환경을 업그레이드할 때 주의해야 할 실무 경계는 다음과 같다:

  • 1. 데몬은 2.0이지만 gRPC API Go 모듈은 1.x를 유지한다: containerd 저장소의 루트 모듈 버전은 v2.0.0으로 올라갔지만, 클라이언트 하위 호환성을 보장하기 위해 코어 gRPC API는 github.com/containerd/containerd/api라는 독립된 서브모듈에서 1.x 버전을 유지한다. 즉, 기존에 containerd/api gRPC 프로토콜을 사용하던 타사 모니터링 툴이나 에이전트 클라이언트는 코드를 전면 재작성하지 않고도 2.0 데몬과 정상 통신할 수 있다.
  • 2. config.toml version = 3 마이그레이션을 반드시 실행해야 한다: containerd 2.0은 시작 시 구형 version 2 설정 파일을 인메모리에서 자동 보정하려고 시도하지만, 명시적인 필드 변경(예: cri 플러그인의 sandbox 컨트롤러 섹션 이동, 레거시 쉼 경로 제거)이 누락되면 예기치 못한 부트 실패가 발생할 수 있다. 반드시 노드 업그레이드 전 containerd config migrate > /etc/containerd/config.toml을 수행하여 공식 v3 포맷으로 저장해야 한다.
  • 3. Docker Schema 1 이미지 배포 차단 대비: 아주 오래된 레거시 사내 애플리케이션이나 수년간 빌드 파이프라인을 돌리지 않은 구형 이미지는 여전히 Schema 1 포맷일 수 있다. containerd 2.0 노드에 배포하면 manifest schema 1 is rejected 에러를 뿜으며 실행이 거부된다. 배포 전 skopeo inspect --raw로 이미지 매니페스트 포맷을 확인하고 Dockerfile을 재빌드해야 한다.
  • 4. Image Verifier Plugin의 지연 시간(Latency) 관리: Transfer Service에 연결된 서명/정책 검증 플러그인이 외부 네트워크의 Rekor 투명성 로그 서버나 KMS에 매번 동기식으로 질의하면, 오토스케일링(HPA)으로 대규모 파드가 기동될 때 이미지 풀 지연이 발생할 수 있다. 플러그인 레벨에서 공개키 캐싱과 인메모리 인증서 유효성 검사 풀을 적절히 구성해야 한다.
  • 5. Kubernetes 호환성 경계: containerd 2.0의 CRI 구현체는 오직 CRI v1 규격만 응답한다. Kubernetes 1.25 이하 버전의 Kubelet은 CRI v1alpha2를 요구하므로 containerd 2.0 노드와 결합할 수 없다. Kubernetes 클러스터 버전이 최소 1.26 이상(권장 1.28+)인지 확인해야 한다.

7. 실무 점검 명령과 로컬 Python 6대 검증 시뮬레이터

7.1 실무 containerd 2.0 런타임 점검 및 설정 마이그레이션

운영 호스트에서 containerd 2.0을 점검하고 설정을 마이그레이션하는 표준 명령은 다음과 같다:

7.2 로컬 Python 6대 검증 시뮬레이터

아래 스크립트는 containerd 2.0의 6대 핵심 아키텍처(Transfer Service 스트리밍, Image Verifier 인라인 게이트, OCI 1.1 Referrers DAG, Sandboxed CRI, 레거시 차단 방어벽, ctr deprecations 감사)를 로컬에서 완벽하게 재현·검증한 코드다.

이 시뮬레이션은 로컬 환경에서 실행되어 모든 검증 항목을 완벽히 통과(ALL_CONTAINERD2_VERIFICATION_CHECKS_PASSED)했다.

8. 실무 도입 및 프로덕션 업그레이드 체크리스트

레거시 기능 호출 실시간 감사: 현재 운영 중인 containerd 1.7 호스트에서 ctr deprecations list를 실행하여 v1 쉼이나 AUFS, CRI v1alpha2 호출 흔적이 없는지 확인한다.

설정 파일(config.toml) v3 마이그레이션: containerd config migrate 명령을 통해 기존 설정을 공식 version = 3 포맷으로 변환하고 백업한다.

Kubernetes Kubelet 버전 확인: 클러스터 노드의 Kubernetes 버전이 1.26 이상인지 확인하여 CRI v1 단일화에 따른 연결 거부 위험을 사전에 방지한다.

사내 레거시 이미지 Schema 1 검사: 자주 배포되는 사내 컨테이너 이미지 매니페스트를 검사하여 Docker Schema 1 이미지가 남아있는 경우 사전에 OCI 규격으로 재빌드한다.

Transfer Service & Image Verifier 파이프라인 검증: 공급망 보안 정책(Cosign 서명, SBOM 첨부)을 프로덕션에 적용하기 전 스테이징 노드에서 서명 검증 게이트웨이의 지연 시간과 오탐 여부를 테스트한다.

9. 참고 자료 및 공식 출처 (확인 기준일: November 14, 2026)

추천 글