iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
Cloud Native

K8s上的機器人沙盒系列 第 3

Day 3|CNI 選型:Cilium vs Calico,並安裝 Cilium(eBPF 與 Hubble 初探)

  • 分享至 

  • xImage
  •  

CNI 選型評估安裝 Cilium開啟 Hubble 可觀測性連通性測試

為什麼先選 Cilium?(Cilium vs Calico)

面向 Cilium Calico
核心資料平面 eBPF 為主;可選 kube-proxy replacement 傳統 iptables/BPF 混合;亦提供 eBPF 模式(可取代 kube-proxy)
網路型態 VXLAN / BGP / 原生路由等 VXLAN / BGP / IPIP 等
加密 WireGuard / IPsec(原生支援) WireGuard / IPsec
可監控性 Hubble(即時 flow、Service Map、UI) Flow logs / 第三方;商業版工具較多
生態與文件 eBPF 原生、雲商支援廣泛 歷史悠久、BGP/路由場景成熟

本系列要在瀏覽器中低延遲操作模擬(Selkies / WebRTC),需要對延遲、封包路徑與丟包有極高能見度;因此先選 Cilium,並啟用 Hubble 以快速觀察流量與除錯。Calico 也會在後續章節補充替代方案與異同。

前置條件檢查(兩台節點)

  • Day 2 完成 kubeadm 之後,Node 目前可能是 NotReady(尚未安裝 CNI)屬正常。
  • 建議關閉主機防火牆或先放行必要埠;Hubble Relay 會用到 TCP 4244(之後段落會用到)。
  • 你的系統核心版本建議 5.10 以上(RHEL/Alma 9 系等價可)。

安裝 Cilium(使用 cilium CLI)

以下步驟在 Control Plane cp1 執行,kubectl 已指向Cluster。

1) 安裝 cilium CLI 與 hubble CLI

# 取得 cilium CLI 最新穩定版
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64; [ "$(uname -m)" = "aarch64" ] && CLI_ARCH=arm64
curl -L --fail --remote-name-all \
  https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvf cilium-linux-${CLI_ARCH}.tar.gz -C /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

# 安裝 hubble CLI(Monitor用)
HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
HUBBLE_ARCH=amd64; [ "$(uname -m)" = "aarch64" ] && HUBBLE_ARCH=arm64
curl -L --fail --remote-name-all \
  https://github.com/cilium/hubble/releases/download/${HUBBLE_VERSION}/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvf hubble-linux-${HUBBLE_ARCH}.tar.gz -C /usr/local/bin hubble
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}

# 驗證版本
cilium version --client
hubble version

2) 安裝 Cilium(預設模式,先保留 kube-proxy)

先以「最安全預設」啟動:IPAM 使用 kubernetes、保留 kube-proxy,之後再考慮切換 kube-proxy-free。

# 安裝(會自動偵測你的環境與版本)
cilium install

# 等待就緒
cilium status --wait
kubectl get pods -n kube-system -l k8s-app=cilium -o wide
kubectl get nodes -o wide   # Node 應轉為 Ready

若你的叢集使用 cgroup v2、或 kernel 模組限制,需要額外值(如 --set cgroup.autoMount--set bpf.hostRouting 等),可在稍後進階章節調整;一般 Ubuntu/RHEL 9 預設即可。

開啟 Hubble(Relay + UI)

Hubble 是 Cilium 的可觀測層:能看到 L3/L4/L7 流量、Service Map、封包被哪條 Policy 擋下等。

# 啟用 Hubble(預設會部署 Relay;加上 --ui 會裝前端)
cilium hubble enable --ui

# 取得 Hubble Relay 與 UI 狀態
kubectl -n kube-system get deploy hubble-relay
kubectl -n kube-system get svc hubble-ui

# 本機 port-forward(在你的操作端開瀏覽器看 UI)
kubectl -n kube-system port-forward svc/hubble-ui 12000:80
# 瀏覽 http://localhost:12000 看到 Service Map

若節點有防火牆,請於每個裝有 Cilium 的節點放行 TCP 4244(Hubble Relay)。

連線與監控

# 1) 內建連線測試(會暫時建立多個測試 Pod/Service)
cilium connectivity test

# 2) 即時監控最近 20 則 flow(可查看來源/目的、Verdict)
hubble observe --last 20

# 3) 簡單效能測試
a. cilium connectivity perf --help   # 先看說明
b. # 或用 netshoot 做手動 iperf
kubectl run netshoot --image=nicolaka/netshoot -it --rm -- bash
# 進容器後可安裝 iperf3 / mtr 進行測速與路徑檢查

cilium connectivity test 完成後請清理(工具會自動清除資源)。若失敗,通常是節點間 L3 互通、防火牆或 kube-proxy 與 Cilium 設定衝突,Day 4 之後我們會逐步加上監控以利定位。

kube-proxy-free

Cilium 可用 eBPF 直接接手 Service 負載平衡,取代 kube-proxy。切換步驟包含:

  1. kubeadm init --skip-phases=addon/kube-proxy(新叢集)或先停用 kube-proxy DaemonSet(既有叢集)。
  2. cilium install --set kubeProxyReplacement=true(或更嚴格的 strict)。
  3. 必要時指定 --set k8sServiceHost=<APISERVER_IP> --set k8sServicePort=6443

感想

本来、クラスターはまだ構築中なのですが、やむを得ず文章についてGPTに助力を仰ぎました。ここまでお読みいただき、誠にありがとうございます。これまで記した内容の多くがこの場しのぎとなってしまい、誠に申し訳ございません。後ほど、一部のサーバーで実演いたします。


上一篇
Day 2|用 kubeadm + containerd 建一套最小 K8S
系列文
K8s上的機器人沙盒3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言