Chuyển đến nội dung chính

第5課:容器執行環境與 OCI 標準

OCI(Open Container Initiative)、容器執行環境介面(CRI)。 Docker、containerd、CRI-O。映像層、Registry 與映像生命週期。

OCI 容器執行環境堆疊 — CRI、containerd、runc

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 映像的 APIDockerHub、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. 容器執行環境比較

執行環境類型特點使用場景
containerdHigh-level(CRI)輕量、穩定、CNCF graduatedKubernetes 1.24+ 預設
CRI-OHigh-level(CRI)為 Kubernetes 最佳化、輕量OpenShift、Kubernetes
Docker EngineHigh-level(non-CRI)自 K8s 1.24 起棄用(使用 dockershim)開發環境
runcLow-level(OCI)OCI 參考實作containerd/CRI-O 的後端
gVisor (runsc)Low-level(沙箱)安全沙箱,攔截系統呼叫GKE 沙箱、不受信任的工作負載
Kata ContainersLow-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 HubDocker Inc.公開預設,有拉取速率限制
ECR (Elastic Container Registry)AWS私有,整合 IAM
GCR / Artifact RegistryGCP私有,Workload Identity
GHCR (GitHub Container Registry)GitHub與套件連結,Actions CI
HarborCNCF(開源)自建,弱點掃描

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 透過系統呼叫攔截提供使用者空間隔離,也很強但方法不同。