Skip to content
Published on

containerdアーキテクチャ内部分析

Authors

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-v2runcデフォルトOCIランタイム
containerd-shim-kata-v2Kata軽量VMベース
containerd-shim-runsc-v1gVisorユーザー空間カーネル

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による効率的な通信でオーバーヘッドを最小化します。