Istio sidecar 中的流量型別及 iptables 規則詳解
我在之前的一篇部落格中講解過 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 中的流量有一個更全面的瞭解。
- 自 2020 年以來全球的開源商業化軟體融資情況
- IstioCon 2022 回顧及錄影、PPT 分享
- Beyond Istio OSS —— Istio 服務網格的現狀及未來
- 如何在 Istio 中整合 SPRIRE?
- 什麼是零信任?
- 為什麼 Istio 要使用 SPIRE 做身份認證?
- 再見 KataCoda!
- 如何編譯 Istio?
- Istio 資料平面 Pod 啟動過程詳解
- Istio 中的各元件埠及功能詳解
- Istio sidecar 中的流量型別及 iptables 規則詳解
- Tetrate 公司開源專案介紹
- 跨越鴻溝:理解鴻溝理論
- 網易開源 Istio 擴充套件專案 Slime 簡介——基於 Istio 的智慧服務網格管理器
- 服務網格現狀之我見
- 如何理解 Istio Ingress, 它與 API Gateway 有什麼區別?
- 如何除錯 Kubernetes 中的微服務 ——proxy、sidecar 還是 service mesh?
- Jimmy Song:為什麼山寨幣持有者不關心比特幣 Taproot 升級?
- Zoom OBS B 站直播配置手冊
- Istio 開源四週年回顧與展望