Huny's Dev Blog
huny.dev

containerd 2.0 정식 출시 해부: 7년 만의 메이저 개편·Sandbox & Transfer 서비스 안정화와 shim-v1/AUFS 영구 제거 실무 점검

2017년 이후 7년 만에 정식 출시된 containerd 2.0의 런타임 아키텍처를 분석한다. Pod·VM 수명주기를 분리한 Sandbox Service, 바이너리 스트림 기반 Transfer Service, User Namespaces 및 NRI/CDI 기본 탑재, shim-v1/AUFS/CRI v1alpha2 영구 제거 파괴적 변경과 로컬 Python 6대 검증 시뮬레이션을 살펴본다.

Hun Jang
Hun Jang Nov 14, 2026

containerd 2.0 릴리스와 차세대 컨테이너 런타임 아키텍처를 상징하는 3D 격리 샌드박스 큐브 및 바이너리 스트림 파이프라인 비주얼 아트워크 (텍스트 없는 순수 그래픽 .png)

2017년 containerd 1.0이 처음 릴리스된 이래, containerd는 지난 7년간 전 세계 클라우드 네이티브 인프라의 사실상 표준 런타임(de-facto runtime)으로 군림해왔다. Kubernetes의 CRI(Container Runtime Interface) 런타임이자 Docker 엔진의 근간 코어로 자리 잡은 containerd는 수십억 개의 프로덕션 컨테이너를 구동하며 안정성을 검증받았다. 그러나 수년간 클라우드 환경이 급변하면서 기존 1.x 아키텍처는 구조적 한계에 부딪혔다. 단일 모놀리식 CRI 서버 구조는 Kata Containers나 Firecracker와 같은 가상머신(microVM) 기반 격리 환경이나 Wasm(WebAssembly) 런타임을 매끄럽게 수용하기 어려웠고, 이미지 풀링/푸시 파이프라인 역시 OCI v1.1 사양의 Referrers API나 대규모 분산 환경의 지연 로딩(Lazy-loading)을 유연하게 처리하기에는 데이터 모델이 파편화되어 있었다.

2024년 10월 말 마침내 정식 GA된 containerd 2.0.0은 이러한 7년간의 기술 부채를 과감히 청산하고 클라우드 네이티브 생태계의 향후 10년을 지탱할 차세대 아키텍처로 전면 개편되었다.

실무 판단 기준을 먼저 요약하면, containerd 2.0은 Pod·가상머신 격리 경계의 수명주기를 컨테이너와 완전히 분리한 Sandbox Service를 기본 활성화하고, 이미지 및 아티팩트 이동을 바이너리 스트림으로 통합한 Transfer Service를 정식화하여 지연 로딩(Lazy-loading)과 OCI Referrers 생태계 대응력을 극대화했다. 특히 모놀리식 CRI 서버 구조를 탈피하여 신규 Update API를 통한 실행 중 Pod 사양 동적 변경을 지원하며, User Namespaces 및 NRI/CDI를 기본 탑재해 엔터프라이즈 멀티테넌트 보안과 하드웨어 가속기(GPU/NPU) 연동 표준을 확립했다. 그러나 이번 2.0 메이저 전환은 7년간 누적된 기술 부채를 정리하며 containerd-shim-v1 영구 제거, AUFS 스냅샷터 폐기, CRI v1alpha2 삭제, Docker Schema 1 매니페스트 기본 차단이라는 치명적인 파괴적 변경(Breaking Changes)을 동반하므로, 클러스터 업그레이드 전 ctr deprecations list를 통한 레거시 의존성 전수 조사와 containerd-shim-v2(io.containerd.runc.v2) 전환 검증이 필수적이다. 이 글은 containerd 2.0 공식 릴리스 노트, CNCF 아키텍처 설계 문서, Go v2 클라이언트 마이그레이션 가이드와 로컬 Python 6대 검증 시뮬레이션을 기준으로 설명한다.

1. 7년 만의 대전환: containerd 1.x의 한계와 2.0 설계 철학

containerd 1.x는 OCI(Open Container Initiative) 표준 런타임으로서 훌륭한 안정성을 제공했지만, 현대적인 컨테이너 오케스트레이션 요구사항 앞에서는 다음과 같은 아키텍처 병목을 드러냈다:

  • 모놀리식 CRI 서버와 Pod 수명주기 결합: containerd 1.x에서 Kubernetes PodSandbox는 CRI 플러그인 내부의 모놀리식 서버 코드에 깊숙이 결속되어 있었다. 컨테이너는 shim을 통해 관리되지만 Pod 격리 공간(네트워크 네임스페이스, cgroup, pause 컨테이너)은 별도 런타임 플러그인으로 유연하게 교체하기 어려웠다. 이로 인해 마이크로VM(Kata, gVisor)을 연동할 때 복잡한 shim 프록시 트릭이 강제되었다.
  • 이미지 및 아티팩트 전송의 파편화: 1.x의 이미지 다운로드 및 압축 해제 파이프라인은 push, pull, import, export가 각기 다른 내부 구현체로 나뉘어 있었다. 이 구조에서는 OCI v1.1 아티팩트(SBOM, 서명, 증명서)를 다루거나 Nydus/eStargz 같은 파일 단위 온디맨드 스트리밍을 단일 추상화로 지원하기가 극히 까다로웠다.
  • 레거시 하위 호환성 유지 비용: 7년 전 도입된 containerd-shim-v1, 구형 CRI v1alpha2, 2015년 시절의 Docker Schema 1 매니페스트, 그리고 리눅스 메인라인에서 퇴출된 AUFS 드라이버까지 모두 안고 가느라 런타임 코드가 비대해지고 버그 추적 경로가 복잡했다.

containerd 2.0은 **"모든 컴포넌트의 엄격한 서비스 모듈화"**와 **"일급 스트림 파이프라인 구축"**을 핵심 철학으로 삼아 이 문제들을 해결했다.

2. Sandbox Service & Controller: Pod 수명주기 디커플링과 동적 Update API

containerd 2.0의 가장 중대한 구조적 변화는 **Sandbox Service (#4131)**의 정식 안정화(Stable)와 Sandboxed CRI의 기본 활성화다.

2.1 PodSandbox의 일급 객체화 (First-class Isolation Boundary)

과거 containerd는 Pod을 '특수하게 취급되는 Pause 컨테이너와 네트워크 네임스페이스의 묶음'으로 간주했다. 그러나 2.0에서는 Sandbox가 하나의 독립된 일급 서비스 엔터티로 승격되었다:

  • 격리 환경의 독립적 제어: Sandbox Controller 인터페이스를 구현하는 모든 런타임(표준 Linux cgroup/netns, Kata microVM, Cloud Hypervisor)이 containerd의 정식 플러그인(Sandboxer)으로 등록될 수 있다.
  • 컨테이너 수명주기 분리: Sandbox(Pod 경계)가 먼저 생성된 후, 그 안에서 컨테이너들이 몇 번이고 생성·실행·중지·재시작되더라도 Sandbox 자체의 격리 컨텍스트는 손상 없이 유지된다.
  • 모놀리식 CRI 서버 탈피: containerd의 CRI 플러그인은 이제 자체적으로 Pod을 생성하고 cgroup을 조작하는 무거운 작업을 직접 하지 않는다. 대신 표준화된 Sandbox Controller에 요청을 위임함으로써 코드 응집도를 획기적으로 높였다.

2.2 동적 Sandbox Update API: 무중단 리소스 재구성

containerd 2.0은 /containerd.services.sandbox.v1.Controller/Update gRPC 엔드포인트를 새롭게 추가했다:

  • 실행 중 Pod 사양 핫 업데이트: 기존에는 Pod 수준의 cgroup 리소스 제한(CPU shares, 메모리 한도)을 바꾸려면 Pod을 재기동하거나 복잡한 커널 수동 조작이 필요했다.
  • 런타임 옵션 및 메타데이터 갱신: 2.0의 Update API를 통해 운영자는 Pod이 활발히 트래픽을 처리하는 도중에도 Sandbox의 스펙, 런타임 옵션, 확장 속성, 레이블을 동적으로 변경할 수 있다. 이는 Kubernetes의 In-Place Pod Resize 기능(Pod 재기동 없는 리소스 수직 확장)을 지원하는 완벽한 런타임 토대가 된다.

containerd 2.0 런타임 아키텍처 및 핵심 서비스 파이프라인: Sandbox Service, Transfer Service, NRI/CDI, OverlayFS 스냅샷터, shim-v2 단일 표준 강제 및 레거시 제거 경계 도식도 (로컬 고해상도 렌더링 .png)

3. Transfer Service: 바이너리 스트림 파이프라인과 OCI 아티팩트 혁신

두 번째 핵심 기둥은 **Transfer Service (#7592)**의 GA다. 과거 분산되어 있던 이미지 이동 로직이 단 하나의 고성능 바이너리 스트림 파이프라인으로 통합되었다.

3.1 바이너리 스트림 및 데이터 채널의 일급 객체화

Transfer Service는 libchan 프로젝트의 철학을 차용하여, 소스(Source)와 목적지(Destination) 사이의 모든 데이터 전송을 파이프라인 채널로 추상화했다:

  • 단일 API 표면: 이미지 Push, Pull, Export, Import가 모두 client.Transfer(ctx, src, dst) 단일 인터페이스를 공유한다.
  • 병렬 언패킹 (Parallel Unpacking): 레이어 다운로드와 압축 해제(decompress)가 완전히 파이프라인화되어 멀티코어 CPU 자원을 최대로 활용하며, 1.x 대비 이미지 풀 속도가 20~35% 이상 향상되었다.
  • OCI v1.1 Referrers & 공급망 보안: 컨테이너 이미지 레이어뿐만 아니라 SBOM(SPDX, CycloneDX), Cosign 서명, 빌드 증명서(Attestation) 등 OCI 아티팩트를 자동으로 인식하고 일괄 전송할 수 있다.
  • 기밀 컴퓨팅(Confidential Computing) 지원: 목적지(Destination)를 게스트 샌드박스 내부로 직접 지정할 수 있어, 호스트 메모리에 복호화되지 않은 암호화 이미지를 전송한 뒤 게스트 VM 내부에서 안전하게 언팩하는 격리 배포가 가능하다.

4. containerd 1.7 vs 2.0 핵심 변경점 비교

두 메이저 버전 간의 주요 아키텍처 및 실무 차이점을 아래 표로 정리했다:

비교 항목
containerd 1.7 LTS
containerd 2.0 GA
엔지니어링 영향
Pod Sandbox 아키텍처
CRI 플러그인 내부 모놀리식 관리
Sandbox Service & Controller 기본 활성화
Pod/VM 수명주기 분리 및 동적 Update 지원
이미지/아티팩트 전송
Push/Pull 개별 구현체 분산
Transfer Service 바이너리 스트림 파이프라인
병렬 언팩, OCI Referrers 및 서명 검증 통합
지원 런타임 Shim
shim-v1 및 shim-v2 혼용 지원
containerd-shim-v2 단일 표준 강제 (v1 영구 삭제)
구형 커스텀 shim 사용 시 기동 불가
스토리지 스냅샷터
OverlayFS, btrfs, AUFS(비권장)
OverlayFS 표준 권장 (AUFS 영구 폐기)
AUFS 기반 구형 노드 마이그레이션 필수
보안 격리
User Namespaces 실험적 플러그인
User Namespaces 정식 기본 탑재
Rootless 컨테이너 호스트 보안 대폭 강화
디바이스 & 플러그인
NRI 별도 opt-in 활성화 필요
NRI(Node Resource Interface) & CDI 기본 활성화
GPU/NPU 벤더 디바이스 플러그인 표준화
레거시 호환성
CRI v1alpha2, Docker Schema 1 허용
CRI v1 전용 / Docker Schema 1 기본 차단
오래된 빌드 파이프라인 이미지 점검 필수
Go 클라이언트 SDK
Go 소스 코드 의존성 및 모듈 경로 갱신

5. 프로덕션 업그레이드 전 반드시 확인해야 할 5대 파괴적 변경(Breaking Changes)

containerd 2.0 도입 시 클러스터 장애를 유발할 수 있는 5대 핵심 파괴적 변경 사항을 점검해야 한다:

  • 1. containerd-shim-v1 완전 제거: 1.x 시절부터 유지되던 레거시 containerd-shim 바이너리가 삭제되었다. 이제 모든 런타임은 containerd-shim-v2 규격을 따라야 한다. 설정 파일(config.toml)에 runtime_type = "io.containerd.runtime.v1.linux"를 명시하고 있다면 컨테이너 생성이 즉시 실패하므로 io.containerd.runc.v2로 전환해야 한다.
  • 2. AUFS 스냅샷터 영구 폐기: 과거 Docker 초기에 광범위하게 쓰였으나 리눅스 커널 업스트림에서 제외된 AUFS 지원이 완전히 제거되었다. 기존에 AUFS로 생성된 루트 파일시스템은 containerd 2.0에서 인식되지 않으므로, 업그레이드 전 데이터를 백업하고 overlayfs 스냅샷터로 스토리지를 재구성해야 한다.
  • 3. Kubernetes CRI v1alpha2 영구 제거: Kubernetes 1.25 이하 버전에서 사용되던 구형 v1alpha2 gRPC 인터페이스가 완전히 삭제되었다. containerd 2.0은 현대적인 v1 인터페이스만 서비스하므로, Kubernetes 1.26 이상의 최신 클러스터에서만 운용 가능하다.
  • 4. Docker Schema 1 매니페스트 기본 차단: 2015년 이전에 빌드되었거나 구형 프라이빗 레지스트리에 보관된 application/vnd.docker.distribution.manifest.v1+prettyjws 형식의 이미지는 보안(취약한 서명 구조) 문제로 인해 기본적으로 다운로드가 거부된다. 만약 레거시 이미지를 불가피하게 가져와야 한다면 데몬 환경변수에 CONTAINERD_ENABLE_DEPRECATED_PULL_SCHEMA_1_IMAGE=1을 선언해야 한다.
  • 5. TOML 설정 머지(Merge) 파싱 동작 변경: 1.x에서는 플러그인 설정을 재정의할 때 기존 기본값이 통째로 덮어씌워지는 경우가 있었으나, 2.0부터는 설정 파일의 섹션들이 기본 템플릿과 정밀하게 병합(Deep Merge)된다. 불필요하게 작성된 빈 섹션이나 구형 키 이름이 기본값을 예기치 않게 방해하지 않는지 검토해야 한다.

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

6.1 실무 레거시 점검 및 전송 명령

containerd 2.0으로 마이그레이션하기 전 호스트에서 실행해야 할 필수 CLI 명령은 다음과 같다:

ctr deprecations list 명령을 실행했을 때 아무런 경고도 출력되지 않아야 안전한 무중단 업그레이드가 보장된다.

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

아래 스크립트는 containerd 2.0의 핵심 아키텍처 변경점을 로컬에서 완전히 재현한 코드다:

  1. Sandbox Service 수명주기 및 Pod-Container 디커플링 검증
  1. 동적 Sandbox Update API (/Update) 런타임 리소스 갱신 검증
  1. Transfer Service 바이너리 스트림 파이프라인 및 OCI 다이제스트 검증
  1. 레거시 Shim-v1 거부 및 Shim-v2 단일 표준 강제 검증
  1. Docker Schema 1 매니페스트 기본 차단 및 Opt-in 플래그 동작 검증
  1. 멀티스레드 동시 Sandbox/컨테이너 부하 및 레이스 컨디션 무결성 검증

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

7. containerd 2.0 실무 도입 및 마이그레이션 체크리스트

레거시 shim 의존성 전수 조사: 운영 중인 호스트의 모든 config.toml에서 runtime_type을 점검하여 io.containerd.runtime.v1.linux가 존재하는지 확인하고, 이를 즉시 io.containerd.runc.v2로 전환한다.

ctr deprecations list 실행 및 점검: 업그레이드 전 운영 및 스테이징 노드에서 ctr deprecations list를 실행하여 AUFS, CRI v1alpha2 등 폐기된 기능에 의존하는 항목이 0건인지 확인한다.

스냅샷터 드라이버 확인: 현재 사용 중인 스토리지 스냅샷터가 overlayfs인지 점검하고, 구형 AUFS 스토리지가 남아있다면 이미지 캐시를 초기화하고 OverlayFS로 재구성한다.

Kubernetes 버전 적합성 검증: CRI v1alpha2 삭제에 대응하기 위해 연동 대상 Kubelet 및 Kubernetes 제어 평면이 v1.26 이상인지 확인한다.

Docker Schema 1 레거시 이미지 스캔: 레지스트리 내부의 오래된 베이스 이미지가 Schema 1 형식인지 사전 스캔하고, 필요 시 최신 Docker/OCI v1 매니페스트로 재빌드·재푸시한다.

NRI/CDI 가속기 연동 테스트: GPU/NPU 워크로드가 있는 노드의 경우 containerd 2.0에서 기본 활성화된 CDI 스펙 및 NVIDIA Container Toolkit의 CDI 모드 호환성을 점검한다.

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

추천 글