Istio sidecar 中的流量型別及 iptables 規則詳解

語言: CN / TW / HK

我在之前的一篇部落格中講解過 Istio 中 sidecar 的注入、使用 iptables 進行透明流量攔截及流量路由的詳細過程,並以 Bookinfo 示例中的 productpage 服務訪問 reviews 服務,和 reviews 服務訪問 ratings 服務為例繪製了透明流量劫持示意圖。在那個示意圖中僅展示了 reviews pod 接收流量和對外訪問的路由,實際上 sidecar 內的流量遠不止於此。

本文將向你展示 Istio sidecar 中的六種流量型別及其 iptables 規則,並以示意圖的形式帶你一覽其全貌。

Sidecar 中的 iptables 流量路由

Sidecar 中的流量可以劃分為以下幾類:

  • 遠端服務訪問本地服務:Remote Pod -> Local Pod
  • 本地服務訪問遠端服務:Local Pod -> Remote Pod
  • Prometheus 抓取本地服務的 metrics:Prometheus -> Local Pod
  • 本地 Pod 服務間的流量:Local Pod -> Local Pod
  • Envoy 內部的程序間 TCP 流量
  • Sidecar 到 Istiod 的流量

下面將依次解釋每個場景下 Sidecar 內的 iptables 路由規則。

型別一:Remote Pod -> Local Pod

以下是遠端服務、應用或客戶端訪問資料平面本地 Pod IP 的 iptables 規則。

Remote Pod -> RREROUTING -> ISTIO_INBOUND -> ISTIO_IN_REDIRECT -> Envoy 15006(Inbound)-> OUTPUT -> ISTIO_OUTPUT RULE 1 -> POSTROUTING -> Local Pod

我們看到流量只經過一次 Envoy 15006 Inbound 埠。這種場景下的 iptables 規則的示意圖如下。

型別二:Local Pod -> Remote Pod

以下是本地 Pod IP 訪問遠端服務經過的 iptables 規則。

Local Pod-> OUTPUT -> ISTIO_OUTPUT RULE 9 -> ISTIO_REDIRECT -> Envoy 15001(Outbound)-> OUTPUT -> ISTIO_OUTPUT RULE 4 -> POSTROUTING -> Remote Pod

我們看到流量只經過 Envoy 15001 Outbound 埠。這種場景下的 iptables 規則的示意圖如下。

以上兩種場景中的流量都只經過一次 Envoy,因為該 Pod 中只有發出或接受請求一種場景發生。

型別三:Prometheus -> Local Pod

Prometheus 抓取資料平面 metrics 的流量不會也無須經過 Envoy 代理。

這些流量通過的 iptables 規則如下。

Prometheus-> RREROUTING -> ISTIO_INBOUND (對目的地為 15002、15090 埠流量將轉到 INPUT )-> INPUT -> OUTPUT -> ISTIO_OUTPUT RULE 3 -> POSTROUTING -> Local Pod

這種場景下的 iptables 規則的示意圖如下。

型別四:Local Pod -> Local Pod

一個 Pod 可能同時存在兩個或多個服務,如果 Local Pod 訪問的服務也在該當前 Pod 上,流量會依次經過 Envoy 15001 和 Envoy 15006 埠最後到達本地 Pod 的服務埠上。

這些流量通過的 iptables 規則如下。

Local Pod-> OUTPUT -> ISTIO_OUTPUT RULE 9 -> ISTIO_REDIRECT -> Envoy 15001(Outbound)-> OUTPUT -> ISTIO_OUTPUT RULE 2 -> ISTIO_IN_REDIRECT -> Envoy 15006(Inbound)-> OUTPUT -> ISTIO_OUTPUT RULE 1 -> POSTROUTING -> Local Pod

這種場景下的 iptables 規則的示意圖如下。

型別五:Envoy 內部的程序間 TCP 流量

Envoy 內部程序的 UID 和 GID 為 1337,它們之間的流量將使用 lo 網絡卡,使用 localhost 域名來通訊。

這些流量通過的 iptables 規則如下。

Envoy 程序(Localhost) -> OUTPUT -> ISTIO_OUTPUT RULE 8 -> POSTROUTING -> Envoy 程序(Localhost)

這種場景下的 iptables 規則的示意圖如下。

型別六:Sidecar 到 Istiod 的流量

Sidecar 需要訪問 Istiod 以同步配置,因此 Envoy 會有向 Istiod 傳送流量。

這些流量通過的 iptables 規則如下。

Local Pod-> OUTPUT -> ISTIO_OUTPUT RULE 4 -> POSTROUTING -> Istiod

這種場景下的 iptables 規則的示意圖如下。

總結

Istio 注入在 Pod 內或虛擬機器中安裝的所有 sidecar 代理組成了服務網格的資料平面,也是 Istio 的主要工作負載所在地,通過 Istio 中的透明流量劫持 及這篇部落格,相信你一定對 sidecar 代理中的流量有了一個深刻的瞭解,但這還只是管中窺豹,略見一斑,在我的下一篇部落格中,我將帶你瞭解 Envoy 中各個元件的埠及其功能,這樣可以讓我們對 Istio 中的流量有一個更全面的瞭解。