流量管理

Istio 提供了強大的流量管理功能,如智能路由、服務發現與負載均衡、故障恢復、故障注入等。

istio-traffic-management

流量管理的功能由 Pilot 配合 Envoy 負責,並接管進入和離開容器的所有流量:

  • 流量管理的核心組件是 Pilot,負責管理和配置服務網格中的所有 Envoy 實例

  • 而 Envoy 實例則負責維護負載均衡以及健康檢查信息,從而允許其在目標實例之間智能分配流量,同時遵循其指定的路由規則

pilot
request-flow

API 版本

Istio 0.7.X 及以前版本僅支持 config.istio.io/v1alpha2,0.8.0 將其升級爲 networking.istio.io/v1alpha3,並且重命名了流量管理的幾個資源對象:

  • RouteRule -> VirtualService:定義服務網格內對服務的請求如何進行路由控制 ,支持根據 host、sourceLabels 、http headers 等不同的路由方式,也支持百分比、超時、重試、錯誤注入等功能。

  • DestinationPolicy -> DestinationRule:定義 VirtualService 之後的路由策略,包括斷路器、負載均衡以及 TLS 等。

  • EgressRule -> ServiceEntry:定義了服務網格之外的服務,支持兩種類型:網格內部和網格外部。網格內的條目和其他的內部服務類似,用於顯式的將服務加入網格。可以用來把服務作爲服務網格擴展的一部分加入不受管理的基礎設置(例如加入到基於 Kubernetes 的服務網格中的虛擬機)中。網格外的條目用於表達網格外的服務。對這種條目來說,雙向 TLS 認證是禁止的,策略實現需要在客戶端執行,而不像內部服務請求中的服務端執行。

  • Ingress -> Gateway:定義邊緣網絡流量的負載均衡。

服務發現和負載均衡

爲了接管流量,Istio 假設所有容器在啓動時自動將自己註冊到 Istio 中(通過自動或手動給 Pod 注入 Envoy sidecar 容器)。Envoy 收到外部請求後,會對請求作負載均衡,並支持輪詢、隨機和加權最少請求等負載均衡算法。除此之外,Envoy 還會以熔斷機制定期檢查服務後端容器的健康狀態,自動移除不健康的容器和加回恢復正常的容器。容器內也可以返回 HTTP 503 顯示將自己從負載均衡中移除。

流量接管

Istio 假定進入和離開服務網絡的所有流量都會通過 Envoy 代理進行傳輸。Envoy sidecar 使用 iptables 把進入 Pod 和從 Pod 發出的流量轉發到 Envoy 進程監聽的端口(即 15001 端口)上:

故障恢復

Istio 提供了一系列開箱即用的故障恢復功能,如

  • 超時處理

  • 重試處理,如限制最大重試時間以及可變重試間隔

  • 健康檢查,如自動移除不健康的容器

  • 請求限制,如併發請求數和併發連接數

  • 熔斷

這些功能均可以使用 VirtualService 動態配置。比如以下爲用戶 jason 的請求返回 500 (而其他用戶均可正常訪問):

熔斷示例:

故障注入

Istio 支持爲應用注入故障,以模擬實際生產中碰到的各種問題,包括

  • 注入延遲(模擬網絡延遲和服務過載)

  • 注入失敗(模擬應用失效)

這些故障均可以使用 VirtualService 動態配置。如以下配置 2 秒的延遲:

金絲雀部署

service-versions

首先部署 bookinfo,並配置默認路由爲 v1 版本:

示例一:將 10% 請求發送到 v2 版本而其餘 90% 發送到 v1 版本

示例二:將 jason 用戶的請求全部發到 v2 版本

示例三:全部切換到 v2 版本

示例四:限制併發訪問

爲了查看訪問次數限制的效果,可以使用 wrk 給應用加一些壓力:

Gateway

Istio 在部署時會自動創建一個 Istio Gateway,用來控制 Ingress 訪問。

使用 TLS:

Egress 流量

默認情況下,Istio 接管了容器的內外網流量,從容器內部無法訪問 Kubernetes 集群外的服務。可以通過 ServiceEntry 爲需要的容器開放 Egress 訪問,如

需要注意的是 ServiceEntry 僅支持 HTTP、TCP 和 HTTPS,對於其他協議需要通過 --includeIPRanges 的方式設置 IP 地址範圍,如

流量鏡像

參考文檔

Last updated