containerdアーキテクチャ内部分析
containerdは業界標準のコンテナランタイムで、Dockerから分離されて独立プロジェクトとして発展しました。Kubernetes CRIを実装しコンテナの全ライフサイクルを管理します。
1. containerd概要
1.1 位置と役割
Kubernetes (kubelet)
|
v (CRI gRPC)
containerd
|
v (OCI runtime)
runc / kata / gVisor
|
v
Linux kernel (namespaces, cgroups)
主な役割: イメージ管理、コンテナライフサイクル管理、スナップショット管理、ネームスペース分離、タスク管理。
1.2 コア設計原則
- **シンプルさ**: 1つのことを上手く実行
- **プラグインベース**: すべての機能がプラグインで実装
- **OCI準拠**: OCIイメージスペックとランタイムスペック遵守
- **gRPC API**: すべてのインタラクションはgRPCを通じて
2. gRPC API構造
containerdはContainers、Content、Images、Namespaces、Snapshots、Tasks、Events、LeasesのgRPCサービスを提供します。
containerdのネームスペースはKubernetesネームスペースとは異なり、containerd内部でリソースを分離するメカニズムです:
- **k8s.io**: Kubernetes(CRI)が使用
- **moby**: Dockerが使用
3. プラグインシステム
3.1 プラグインタイプ
containerdのすべての機能はプラグインで実装: Service、Snapshotter、Runtime、GC、Content Store、Metadata、Differ。
3.2 依存関係解決
起動時にすべてのプラグインの依存関係を分析し、トポロジカルソートで正しい順序で初期化します。
3.3 プラグイン設定
version = 2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
4. CRI実装
containerdはCRI gRPCサービスを内蔵プラグインとして実装:
- **RuntimeService**: Pod/コンテナライフサイクル管理
- **ImageService**: イメージ管理
CRIリクエストフロー:
1. kubeletがRunPodSandbox呼び出し
2. containerdがpauseコンテナ作成
3. CNIプラグイン呼び出し
4. kubeletがCreateContainer + StartContainer呼び出し
5. containerdがshimプロセスを通じてコンテナ実行
5. Shim v2アーキテクチャ
5.1 Shimの役割
containerd --> shim (containerd-shim-runc-v2) --> runc --> container process
Shimの責任: containerd再起動時もコンテナ維持、stdin/stdout/stderr管理、終了コード収集、OOMイベント報告。
5.2 ttrpcプロトコル
Shim v2はttrpc(tiny-ttrpc)を使用。gRPCの軽量版で、protobufシリアライゼーション、Unixドメインソケット通信、低メモリ使用、HTTP/2オーバーヘッドなし。
5.3 様々なShim実装
| Shim | ランタイム | 説明 |
| :----------------------- | :--------- | :---------------------- |
| containerd-shim-runc-v2 | runc | デフォルトOCIランタイム |
| containerd-shim-kata-v2 | Kata | 軽量VMベース |
| containerd-shim-runsc-v1 | gVisor | ユーザー空間カーネル |
6. メタデータストア
containerdはBoltDBをメタデータストアとして使用。コンテナ定義、イメージメタデータ、スナップショットメタデータ、Lease情報を保存。
/var/lib/containerd/
io.containerd.metadata.v1.bolt/meta.db
io.containerd.content.v1.content/blobs/sha256/
io.containerd.snapshotter.v1.overlayfs/snapshots/
7. まとめ
containerdのプラグインベースアーキテクチャは高い拡張性と柔軟性を提供します。Shim v2のプロセス分離モデルはcontainerd再起動時もコンテナを安定的に維持し、ttrpcによる効率的な通信でオーバーヘッドを最小化します。
현재 단락 (1/54)
containerdは業界標準のコンテナランタイムで、Dockerから分離されて独立プロジェクトとして発展しました。Kubernetes CRIを実装しコンテナの全ライフサイクルを管理します。