1. OCI — Open Container Initiative
OCI 是隸屬 Linux Foundation 的開放組織,定義容器的開放標準:
| 規格 | 定義 | 實作範例 |
|---|---|---|
| OCI Image Spec | 容器映像格式(層、清單) | Docker image、OCI image |
| OCI Runtime Spec | 如何從映像執行容器(生命週期、檔案系統) | runc、crun、kata-containers |
| OCI Distribution Spec | 從 Registry push/pull 映像的 API | DockerHub、ECR、GCR |
考試重點: OCI 標準確保互通性:用 Docker 建置的映像可以在 containerd 或 CRI-O 上執行,無需修改。KCNA 經常考 OCI 在雲原生生態系中的角色。
2. 容器執行環境介面(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 kernel(namespaces、cgroups)
- 建立容器程序
3. 容器執行環境比較
| 執行環境 | 類型 | 特點 | 使用場景 |
|---|---|---|---|
| containerd | High-level(CRI) | 輕量、穩定、CNCF graduated | Kubernetes 1.24+ 預設 |
| CRI-O | High-level(CRI) | 為 Kubernetes 最佳化、輕量 | OpenShift、Kubernetes |
| Docker Engine | High-level(non-CRI) | 自 K8s 1.24 起棄用(使用 dockershim) | 開發環境 |
| runc | Low-level(OCI) | OCI 參考實作 | containerd/CRI-O 的後端 |
| gVisor (runsc) | Low-level(沙箱) | 安全沙箱,攔截系統呼叫 | GKE 沙箱、不受信任的工作負載 |
| Kata Containers | Low-level(VM-based) | 每個容器使用 VM 隔離 | 多租戶、高安全性 |
考試重點: Docker 作為 Kubernetes 執行環境自 v1.24 起被棄用,但 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. 容器 Registry
| Registry | 供應商 | 特點 |
|---|---|---|
| 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 映像推送到 Docker Hub。此映像可以在叢集上執行嗎?
- A) 不行,Docker 映像與 containerd 不相容
- B) 可以,因為 Docker 映像遵循 OCI Image Spec 並且相容 ✓
- C) 僅在叢集安裝 Docker 相容墊片的情況下
- D) 不行,containerd 僅支援 CNCF Registry 的映像
解析:Docker 映像遵循 OCI Image 規格,使其可與任何符合 OCI 的執行環境互通,包括 containerd 和 CRI-O。「Docker 棄用」指的是執行環境,而非映像格式。
Q2: 容器執行環境介面(CRI)的主要目的是什麼?
- A) 定義映像層格式
- B) 提供 gRPC API 讓 kubelet 與容器執行環境通訊 ✓
- C) 管理 Registry 之間的容器映像分發
- D) 在叢集節點間排程容器
解析:CRI 為 kubelet 提供穩定的 API 來與不同的執行環境(containerd、CRI-O)互動,無需了解實作細節。這種解耦使切換執行環境無需更改 kubelet 程式碼。
Q3: 哪種容器執行環境為高安全性多租戶工作負載提供每個容器的 VM 層級隔離?
- A) containerd
- B) CRI-O
- C) Kata Containers ✓
- D) runc
解析:Kata Containers 在輕量級 VM 中執行每個容器,提供比標準 Linux namespace 容器更強的隔離。gVisor 透過系統呼叫攔截提供使用者空間隔離,也很強但方法不同。