iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
Cloud Native

從 Docker 到 K8s:我的 30 天雲原生筆記系列 第 24

Day 24: Istio 核心路由:Gateway & VirtualService

  • 分享至 

  • xImage
  •  

哈囉大家好,歡迎來到 Istio 的第二天!

在昨天的 Day 23 中,我們建立了 Istio 的架構,知道了它是由「控制平面 (istiod)」和「資料平面 (Sidecar Proxies)」所組成。

今天我們就要來介紹 Istio 中負責流量管理的兩個最核心的 API 物件,來取代我們之前使用的 K8s Ingress:

  1. Gateway:定義流量的入口點
  2. VirtualService:定義流量的路由規則

Part 1:為何不用 K8s Ingress 了?

你可能會問,我們在 Day 15 學的 K8s Ingress 不是已經能處理外部流量了嗎?為什麼 Istio 還要再造一套輪子?

原因在於,K8s Ingress 是一個功能相對基礎、且實現標準不一的規範。而 Istio 的目標,是提供一個功能更豐富、且與網格內部所有能力(安全、監控、策略)深度整合的統一流量管理方案。GatewayVirtualService 的組合就是為了實現這個目標。

Part 2:Istio Gateway - 服務網格的「守門員」

Gateway 物件的作用,是定義服務網格的一個流量入口點,以及這個入口點的屬性。

可以把它想像成 K8s 叢集邊界上的一個「守門員」。這位守門員只關心三件事:

  1. 在哪個埠號站崗?(Port):例如,在 80443 埠監聽。
  2. 為哪些網址服務?(Host):例如,只處理發往 ota.example.com 的請求。
  3. 用什麼協議溝通?(Protocol):例如,HTTPHTTPS

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 的請求

小知識:我的專案前面還有一層 Traefik?

我們的專案有在 Istio Gateway 前面,再部署一個如 Traefik 或 Nginx Ingress Controller 這樣的「邊界 Ingress」。

在這種架構下,職責劃分更清楚:

  • Traefik (邊界 Ingress):擔任整個 K8s 叢集的總入口,負責處理最外層的流量,例如 TLS/SSL 憑證管理、將不同網域(a.com, b.com)的請求,轉發給後端不同的應用。
  • Istio Gateway:擔任服務網格的專屬入口。Traefik 會將所有發往 ota.example.com 的流量,統一轉發給 Istio Gateway。Gateway 則作為一個安全、可控的關口,確保只有符合規則的流量,才能進入由 Istio 管理的微服務網格。

所以,即使 Gateway 角色看起來變小了,但它作為「進入網格的第一道防線」的定位依然重要。

Part 3:VirtualService - 網格內的「智慧型交通指揮官」

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 標頭的請求,轉發給行動版服務。
  • 權重路由 (Canary Release):將 90% 的流量發送到穩定版 v1,將 10% 的流量發送到新版 v2。

Part 4:Gateway + VirtualService:黃金組合

GatewayVirtualService 必須組合使用,才能完整地控制從外部進入的流量。

https://ithelp.ithome.com.tw/upload/images/20251001/20178656p2PYSgHHk1.png

它們的關係是:

  1. 流量先抵達 Gateway (守門員)。
  2. Gateway 檢查完埠號和 Host 後,將流量放行,並交給與自己綁定VirtualService
  3. VirtualService 檢查請求的詳細內容(例如路徑),然後根據規則,將流量精準地導向到最終的 K8s Service

結論

  • Gateway:定義了流量進入網格的入口點(在哪裡聽、聽誰的)。
  • VirtualService:定義了流量進入後,該如何被路由(往哪裡去、怎麼去)。

在明天的文章中,我們就要來探討 Istio 最核心的安全特性之一 mTLS 雙向認證!明天見!


上一篇
Day 23: 什麼是 Istio 與服務網格?
下一篇
Day 25: 服務間的雙向認證:啟用 mTLS
系列文
從 Docker 到 K8s:我的 30 天雲原生筆記26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言