哈囉大家好,歡迎來到 Istio 的第二天!
在昨天的 Day 23 中,我們建立了 Istio 的架構,知道了它是由「控制平面 (istiod
)」和「資料平面 (Sidecar Proxies)」所組成。
今天我們就要來介紹 Istio 中負責流量管理的兩個最核心的 API 物件,來取代我們之前使用的 K8s Ingress:
你可能會問,我們在 Day 15 學的 K8s Ingress 不是已經能處理外部流量了嗎?為什麼 Istio 還要再造一套輪子?
原因在於,K8s Ingress 是一個功能相對基礎、且實現標準不一的規範。而 Istio 的目標,是提供一個功能更豐富、且與網格內部所有能力(安全、監控、策略)深度整合的統一流量管理方案。Gateway
和 VirtualService
的組合就是為了實現這個目標。
Gateway
物件的作用,是定義服務網格的一個流量入口點,以及這個入口點的屬性。
可以把它想像成 K8s 叢集邊界上的一個「守門員」。這位守門員只關心三件事:
80
和 443
埠監聽。ota.example.com
的請求。HTTP
或 HTTPS
。Gateway
只負責將流量安全地「接進」網格中,它完全不知道該把這個流量轉發給內部的哪個服務。它只是一個純粹的入口定義。
# gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ota-gateway
namespace: project-space
spec:
selector:
istio: ingressgateway # 告訴 Istio,這個規則要由預設的 Ingress Gateway Pod 來執行
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "ota.example.com" # 這個 Gateway 只處理發往 ota.example.com 的請求
我們的專案有在 Istio Gateway 前面,再部署一個如 Traefik 或 Nginx Ingress Controller 這樣的「邊界 Ingress」。
在這種架構下,職責劃分更清楚:
a.com
, b.com
)的請求,轉發給後端不同的應用。ota.example.com
的流量,統一轉發給 Istio Gateway。Gateway 則作為一個安全、可控的關口,確保只有符合規則的流量,才能進入由 Istio 管理的微服務網格。所以,即使 Gateway 角色看起來變小了,但它作為「進入網格的第一道防線」的定位依然重要。
VirtualService
的核心職責是定義「流量路由規則」。它的作用,是攔截發往某個特定目的地(例如 ota-backend-service
)的流量,然後根據我們定義的一系列規則,來決定該將這些流量,實際轉發到哪裡去。
官方文件定義:
A VirtualService defines a set of traffic routing rules to apply when a host is addressed.
(VirtualService 定義了一組在主機被尋址時,要應用的流量路由規則。)
VirtualService
能做到許多 K8s Service
辦不到的精細化操作:
/api/v1
的請求轉發給後端,/
的請求轉發給前端。user-agent: mobile
標頭的請求,轉發給行動版服務。Gateway
和 VirtualService
必須組合使用,才能完整地控制從外部進入的流量。
它們的關係是:
Gateway
(守門員)。Gateway
檢查完埠號和 Host 後,將流量放行,並交給與自己綁定的 VirtualService
。VirtualService
檢查請求的詳細內容(例如路徑),然後根據規則,將流量精準地導向到最終的 K8s Service
。在明天的文章中,我們就要來探討 Istio 最核心的安全特性之一 mTLS 雙向認證!明天見!