1. OCI — Open Container Initiative
OCIはLinux Foundation傘下のオープン組織で、コンテナのオープンスタンダードを定義しています:
| 仕様 | 定義 | 実装例 |
|---|---|---|
| OCI Image Spec | コンテナイメージの形式(レイヤー、マニフェスト) | Dockerイメージ、OCIイメージ |
| OCI Runtime Spec | イメージからコンテナを実行する方法(ライフサイクル、ファイルシステム) | runc、crun、kata-containers |
| OCI Distribution Spec | レジストリからイメージをpush/pullするAPI | DockerHub、ECR、GCR |
試験のポイント: OCI標準は相互運用性を保証します:Dockerでビルドしたイメージは変更なしでcontainerdやCRI-Oで実行できます。KCNAではクラウドネイティブエコシステムにおけるOCIの役割についてよく出題されます。
2. Container Runtime Interface (CRI)
KubernetesはDockerやcontainerdと直接通信しません。代わりに、kubeletはCRI(Container Runtime Interface)という標準gRPC APIを使用します。
Kubernetes Architecture (Runtime Layer):
kubelet
│ CRI (gRPC)
├─── containerd ─── runc ─── container
├─── CRI-O ─── runc ─── container
└─── (Docker) ─── (deprecated v1.24+)
OCI Runtime (runc, crun):
- OCI runtime bundleを読み取り
- Linuxカーネルを呼び出し(namespaces、cgroups)
- コンテナプロセスを作成
3. コンテナランタイムの比較
| ランタイム | 種類 | 特徴 | 使用環境 |
|---|---|---|---|
| containerd | ハイレベル(CRI) | 軽量、安定、CNCF graduated | Kubernetes 1.24+のデフォルト |
| CRI-O | ハイレベル(CRI) | Kubernetes向けに最適化、軽量 | OpenShift、Kubernetes |
| Docker Engine | ハイレベル(非CRI) | K8s 1.24から非推奨(dockershim使用) | 開発環境 |
| runc | ローレベル(OCI) | OCI参照実装 | containerd/CRI-Oのバックエンド |
| gVisor (runsc) | ローレベル(サンドボックス) | セキュリティサンドボックス、syscallをインターセプト | GKEサンドボックス、信頼できないワークロード |
| Kata Containers | ローレベル(VMベース) | コンテナごとにVM分離 | マルチテナント、高セキュリティ |
試験のポイント: Dockerはv1.24からKubernetesランタイムとして非推奨ですが、Dockerイメージ(OCI互換)はcontainerd/CRI-Oで引き続き実行できます。「Docker非推奨」≠「Dockerイメージ非推奨」。
4. コンテナイメージレイヤー
Layer architecture:
┌──────────────────────────────┐
│ Layer 4: App code (5 MB) │ ← Writeable (container layer)
├──────────────────────────────┤
│ Layer 3: npm packages │ ← Read-only
├──────────────────────────────┤
│ Layer 2: Node.js runtime │ ← Read-only
├──────────────────────────────┤
│ Layer 1: Ubuntu base image │ ← Read-only (shared across images)
└──────────────────────────────┘
キャッシュの利点: Layer 1-2が同じであれば、Layer 3-4のみダウンロード
5. コンテナレジストリ
| レジストリ | プロバイダー | 特徴 |
|---|---|---|
| Docker Hub | Docker Inc. | パブリックデフォルト、プルにレート制限あり |
| ECR (Elastic Container Registry) | AWS | プライベート、IAM統合 |
| GCR / Artifact Registry | GCP | プライベート、Workload Identity |
| GHCR (GitHub Container Registry) | GitHub | パッケージ連携、Actions CI |
| Harbor | CNCF(オープンソース) | セルフホスト、脆弱性スキャン |
6. チートシート
| 試験の質問 | 回答 |
|---|---|
| OCIが定義する標準は? | Image Spec、Runtime Spec、Distribution Spec |
| K8s 1.24+のデフォルトランタイムは? | containerd |
| CRIとは? | Container Runtime Interface — kubeletとランタイム間のgRPC API |
| DockerのK8sでの非推奨は? | v1.24から(dockershim削除) |
| 信頼できないワークロード向けランタイムは? | gVisorまたはKata Containers |
7. 練習問題
Q1: Kubernetesクラスターがcontainerdをコンテナランタイムとして使用しています。開発者がDocker HubにDockerイメージをプッシュしました。このイメージはクラスターで実行できますか?
- A) いいえ、Dockerイメージはcontainerdと互換性がない
- B) はい、DockerイメージはOCI Image Specに準拠しており互換性がある ✓
- C) クラスターにDocker互換shimをインストールした場合のみ
- D) いいえ、containerdはCNCFレジストリのイメージのみサポート
解説:DockerイメージはOCI Image Specに準拠しているため、containerdやCRI-Oを含むOCI準拠のランタイムと相互運用可能です。「Docker非推奨」はランタイムを指し、イメージ形式ではありません。
Q2: Container Runtime Interface(CRI)の主な目的は何ですか?
- A) イメージレイヤー形式を定義する
- B) kubeletがコンテナランタイムと通信するためのgRPC APIを提供する ✓
- C) レジストリ間のコンテナイメージ配布を管理する
- D) クラスターノード間でコンテナをスケジュールする
解説:CRIはkubeletに異なるランタイム(containerd、CRI-O)と実装の詳細を知らずに対話するための安定したAPIを提供します。この分離により、kubeletのコードを変更せずにランタイムを切り替えることができます。
Q3: 高セキュリティのマルチテナントワークロードに対してコンテナごとにVMレベルの分離を提供するコンテナランタイムはどれですか?
- A) containerd
- B) CRI-O
- C) Kata Containers ✓
- D) runc
解説:Kata Containersは各コンテナを軽量VM内で実行し、標準的なLinux namespaceベースのコンテナよりも強力な分離を提供します。gVisorはsyscallインターセプトによるユーザースペース分離を提供し、これも強力ですがアプローチが異なります。