在 Kubernetes 剛誕生的時候,它的核心目標就已經很明確:負責調度與管理,但不要自己下去做「跑容器、拉網路線、搬磁碟」這些體力活。不過問題馬上出現了:
於是,Kubernetes 團隊做了一個聰明的決定,那就是把這三塊最容易變動、最依賴環境的能力切分出來,設計成三個「標準插槽」:
Kubernetes 自己只專注在「我要一個 Pod」,至於「Pod 裡的容器怎麼跑、怎麼上網、怎麼掛磁碟」,全都交給這三大介面後面的 plugin 來解決。
這也是為什麼今天我們可以在 AWS 上跑 VPC CNI + EBS CSI,換到自建環境又能用 Cilium + Ceph CSI,而 Kubernetes 本身完全不用修改 —— 真正做到可插拔的雲原生平台。
接下來,我們就來看看這三個插槽各自負責什麼角色。
在最初期的 Kubernetes,大家都是用 Docker 來跑容器。但隨著時間發展,Kubernetes 不想被某一個特定 Runtime 綁死 —— 於是設計了 CRI (Container Runtime Interface),讓不同的 Runtime 都能插進來,實現一樣的功能。
CRI 解決的問題是:
常見的 Runtime:
👉 實際案例:
當我們在 EKS 下 kubectl apply -f nginx.yaml
,其實流程是這樣:
所以 CRI 是 Kubernetes 跟「容器工人」之間的溝通語言。
有了容器,下一個問題是:這些容器要怎麼彼此連線?
光是建立 Pod 還不夠,如果 Pod 之間沒有網路,就像蓋了一堆房子卻沒拉網路線。
這就是 CNI (Container Network Interface) 的角色:它負責在 Pod 啟動的時候,自動幫 Pod 插上網卡、分配 IP、設定路由。
CNI 解決的問題是:
常見的 CNI Plugin:
👉 實際案例:
假設你有兩個 Pod:
10.0.1.5
10.0.2.8
當 Pod A 要連 Pod B:
如果沒有 CNI,Pod 雖然啟動了,但你會發現它沒有 IP,什麼網路都不能用。
最後一個問題是:資料要怎麼存?
容器是短命的,Pod 被刪掉後,裡面的檔案也會消失。但我們不可能讓資料庫每次重啟就歸零,所以需要一個方式讓 Pod 可以掛載持久化儲存。
這就是 CSI (Container Storage Interface)。
CSI 解決的問題是:
常見的 CSI Plugin:
👉 實際案例:建立一個 PVC 時,會有以下的設定:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
背後 CSI Driver 會幫你在 AWS 建一顆 EBS Volume,並自動掛到運行這個 Pod 的 Node 上,Pod 就能把資料寫進去,即使重啟也不會消失。
kubectl apply
│
▼
Kubelet
│
▼
CRI → 建立容器 (containerd / CRI-O)
│
▼
CNI → 分配 IP、插上網卡、設定路由
│
▼
CSI → (若有 PVC) 掛載持久化存儲
│
▼
Pod → 容器可運行、有網路、有存儲
這張圖可以幫助理解:
三者合力,才讓 Pod 真正「能工作」。
今天我們認識了 CRI / CNI / CSI 這三個 Kubernetes 的核心介面,分別負責容器的運行、網路的建立與存儲的掛載。它們就像三根支柱,讓 Kubernetes 能真正支撐起應用運行的需求。
接下來的安排會是:
這樣的脈絡能幫助我們由下而上,從基礎到進階,逐步建立對 Kubernetes 網路的完整認知 🚀