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 中的流量有一個更全面的瞭解。