在前一篇 Day 13: Ingress 與 Ingress Controller 中,我們討論了如何管理進入叢集的 HTTP/HTTPS 流量。然而,在 Kubernetes 裡,除了外部流量的管理,更重要的是 Pod 與 Pod 之間、Node 與 Node 之間的網路互通。
這一層網路基礎,並不是 Kubernetes 自帶的,而是透過 CNI(Container Network Interface)插件 來實現。
今天,我們就來看看 CNI 的角色,並且比較三個常見的 CNI 插件:Flannel、Calico、Cilium。
CNI,全名 Container Network Interface,是 CNCF 制定的網路標準介面,定義了容器在建立/刪除時,如何分配與回收網路資源。
在 Kubernetes 裡,CNI 插件主要提供以下功能:
換句話說,沒有 CNI,Pod 就算建立起來,也無法互相通訊。
| 插件 | 架構 | 是否支援 NetworkPolicy | 效能 | 特點 |
|--------|----------------|-------------------------|------|--------------|
| Flannel | VXLAN Overlay | 否 | 中等 | 簡單、快速上手 |
| Calico | BGP/Overlay | 是 | 高 | 廣泛用於生產環境 |
| Cilium | eBPF | 是 (L3-L7) | 高 | 先進、可觀測性強 |
由於 Flannel 最簡單,這裡我們用它來做一個小範例,快速體驗 CNI 的安裝與驗證。
以 kind 為例:
kind create cluster --name cni-demo
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
建立兩個 Pod 測試連通性:
kubectl run pod-a --image=busybox -it --rm --restart=Never -- sh
在 Pod 內安裝 ping 並測試另一個 Pod 的 IP:
ping <pod-b IP>
若能正常回應,即表示 Flannel 運作成功。
在下一篇 Day 15: 多環境部署 中,我們會探討 Dev、Staging、Prod 的隔離方式。
實際上,這些環境往往會有不同的網路策略需求,例如:
這也正是選擇 CNI 插件(特別是 Calico 與 Cilium)時需要考量的關鍵。
下一篇,我們將進入 Day 15: 多環境部署,看看如何在 Dev、Staging、Prod 中落實不同程度的網路與環境隔離。