節點層級資料路徑 — A · B · C
條件 2 · Pod-A 命名空間是否加入 mesh? — 未安裝 mesh → A · 標籤已啟用 → B · 標籤不存在 → C
單一 backendRef → Service (Pod-A):每一欄沿著封包從 Pod-A 的命名空間出發,穿過節點核心(B 還會經過使用者空間),最後抵達實體網卡。三條路徑之前都是同一段共用 ingress 主幹。
A · 標準 Kubernetes
未安裝任何 mesh 元件 — IF · 未安裝 mesh
- 1 — Pod-A 內的應用程式開啟一條明文 TCP 連線。
- 2 — 封包經 veth-A 離開,進入主機核心。
- 3 — kube-proxy 將 Service IP DNAT 成目標 Pod IP。
- 4 — Calico 解析路由,跨節點時封裝(VXLAN/Geneve),再交給 NIC-1。
B · Ambient — 轉向
istio.io/dataplane-mode=ambient · 標籤已啟用 — IF · istio-cni 政策命中(標籤已啟用)
- 1–2 — 明文 TCP 經 veth-A 離開 Pod-A 進入核心。
- 3 — istio-cni 規則命中帶 ambient 標籤的命名空間,將流量轉向。
- 4 — ztunnel 接管連線並以 HBONE (mTLS) 封裝。
- 5–6 — 加密封包走標準的 kube-proxy → Calico → NIC 路徑。
C · Ambient — 繞過
已安裝 mesh · 命名空間無標籤 — IF · istio-cni 政策未命中(無標籤)
- 1–2 — 明文 TCP 經 veth-A 離開 Pod-A 進入核心。
- 3 — istio-cni 檢查未命中(命名空間未加入);ztunnel 保持閒置,完全不經過。
- 4–5 — 封包繼續走標準的 kube-proxy → Calico → NIC 路徑,未加密。