掌控隨心 - 服務網格的流量管理藝術 (Istio 實例)
想象一下,沒有服務網格的時候,我們要實現像“將 1% 的用戶流量導入到新版本應用”、“根據用戶設備類型訪問不同后端”、“模擬下游服務故障”這類高級流量策略,通常需要在代碼、負載均衡器、API 網關等多個地方進行復雜且分散的配置。
而服務網格(以 Istio 為例)提供了一套統一的、聲明式的 API(通過 Kubernetes CRD),讓你能夠像指揮家一樣,優雅地編排服務間的流量樂章。其中最重要的“指揮棒”就是以下三個資源:
1. 入口管理:Gateway
- 網格的“看門人”
-
作用:
Gateway
資源本身不處理流量,而是用來配置運行在網格邊緣的 Envoy 代理(通常是istio-ingressgateway
這個 Deployment)。它定義了哪些端口對外開放、使用什么協議(HTTP, HTTPS, GRPC, TCP)、以及關聯的 TLS 證書等 L4-L6 層配置。它控制著進入服務網格的流量入口點。 -
類比:
Gateway
就像是城市的主要入口大門或高速公路收費站。它規定了哪個大門(端口)是開放的,允許哪種類型的車輛(協議)進入,以及是否需要安檢(TLS)。但它不負責告訴你進入城市后具體該去哪里。 -
YAML 示例 (輸入):配置一個 HTTP 入口,監聽 80 端口,處理
myapp.example.com
的流量。apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata:name: myapp-gatewaynamespace: istio-system # 通常 Ingress Gateway 部署在 istio-system spec:# selector 非常重要,它關聯到運行 Ingress Gateway 的 Envoy Podselector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "myapp.example.com" # 指定此網關處理哪個域名(或通配符)的流量# tls: # 如果需要 HTTPS,可以在這里配置# mode: SIMPLE # 或 MUTUAL# credentialName: myapp-tls-secret # 引用包含證書和私鑰的 K8s Secret
-
關鍵字段解釋:
selector
: 將此Gateway
配置應用到哪些 Envoy 代理 Pod 上(通過標簽匹配)。servers
: 定義監聽的端口、協議和關聯的主機名。port
:number
,name
,protocol
(HTTP, HTTPS, GRPC, TCP, TLS 等)。hosts
: 一個或多個主機名,支持通配符。tls
: (可選) 配置 TLS 模式(單向SIMPLE
或雙向MUTUAL
)及引用的證書 Secret。
-
效果 (輸出):應用此配置后 (
kubectl apply -f ...
),Istio 控制平面會指令匹配selector
的 Envoy 代理(即istio-ingressgateway
Pods)監聽指定的端口,并準備接收匹配hosts
的流量。它只負責“開門”,不負責“指路”。
2. 路由規則:VirtualService
- 網格的“GPS 導航”
-
作用:
VirtualService
定義了服務請求的路由規則