關於 Gateway API

本頁面說明如何使用 GKE Gateway 控制器,在 Google Kubernetes Engine (GKE) 中實作 Kubernetes Gateway API

本頁面適用於負責設計及建構機構網路的雲端架構師和網路專家。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

Gateway API 是服務網路的開放原始碼標準,Gateway API 可改良 Ingress 資源,並透過下列方式推陳出新:

  • 以角色為導向:Gateway API 由對應叢集運算子、開發人員和基礎架構供應商組織角色的 API 資源組成。叢集運算子可藉此定義多個不同且不協調的開發團隊,如何使用共用基礎架構。

  • 可攜性:Gateway API 是開放原始碼標準,有許多實作方式,因此概念和核心資源在不同實作方式和環境中都能保持一致,可降低複雜度,並提高使用者熟悉度。其設計採用彈性一致性概念,使用高度可攜式核心 API (例如 Ingress),同時仍具備彈性和可擴充性,可支援環境和實作的原生功能。

  • 功能豐富:Gateway API 資源提供內建功能,可根據標頭進行比對、設定流量權重,以及其他只能透過自訂註解在 Ingress 中使用的功能。

Gateway API 資源

Gateway API 是以角色為導向的資源模型,專為與 Kubernetes 網路互動的雲端架構師和網路專家設計。如下圖所示,這個模型可讓不同的非協調服務擁有者安全地共用相同的基礎網路基礎架構,同時集中管理平台管理員的政策和控制項。

GKE 提供閘道類別。叢集運算子會根據這些類別建立 Gateway 資源。應用程式開發人員會建立繫結至 Gateway 資源的 HTTPRoute 資源。
圖: Gateway API 總覽

Gateway API 包含下列資源類型:

  • GatewayClass:定義叢集範圍內的資源,做為在叢集中建立負載平衡器的範本。GKE 提供可在 GKE 叢集中使用的 GatewayClass。
  • 閘道:定義負載平衡器監聽流量的位置和方式。叢集運算子會根據 GatewayClass,在叢集中建立閘道。GKE 會建立負載平衡器,實作 Gateway 資源中定義的設定。
  • HTTPRoute:定義將閘道要求轉送至 Kubernetes 服務的通訊協定專屬規則。GKE 支援 HTTPRoute,可根據 HTTP(S) 流量進行路由。應用程式開發人員會建立 HTTPRoute,透過 Gateway 公開 HTTP 應用程式。
  • 政策:定義閘道資源的一組導入作業專屬特徵。您可以將政策附加至 Gateway、Route 或 Kubernetes Service。
  • ReferenceGrant:在 Gateway API 中啟用跨命名空間參照。如要參照命名空間外部的物件,必須建立 ReferenceGrant 資源。

GatewayClass

GatewayClass 是一種資源,用於定義 Kubernetes 叢集中 HTTP(S) (第 7 層) 負載平衡器的範本。GKE 會以叢集範圍資源的形式提供 GatewayClass。叢集運算子會在叢集中建立閘道時指定 GatewayClass。

不同的 GatewayClass 對應不同的Google Cloud 負載平衡器。根據 GatewayClass 建立 Gateway 時,系統會建立對應的負載平衡器,以實作指定的設定。

部分 GatewayClass 支援多叢集負載平衡。

下表列出 GKE 叢集中可用的 GatewayClass,以及其基礎負載平衡器類型。如要瞭解 GatewayClass 的完整詳細資料,請參閱 GatewayClass 功能和規格

GatewayClass 名稱 說明
gke-l7-global-external-managed 全域外部應用程式負載平衡器為基礎建構的全域外部應用程式負載平衡器
gke-l7-regional-external-managed 區域性外部應用程式負載平衡器為基礎建構的區域性外部應用程式負載平衡器
gke-l7-rilb 內部應用程式負載平衡器為基礎建構的內部應用程式負載平衡器
gke-l7-gxlb 傳統版應用程式負載平衡器為基礎建構的全域外部應用程式負載平衡器
gke-l7-cross-regional-internal-managed-mc 跨區域內部應用程式負載平衡器為基礎建構的多叢集跨區域內部應用程式負載平衡器
gke-l7-global-external-managed-mc 全域外部應用程式負載平衡器為基礎建構的多叢集全域外部應用程式負載平衡器
gke-l7-regional-external-managed-mc 區域性外部應用程式負載平衡器為基礎建構的多叢集區域性外部應用程式負載平衡器
gke-l7-rilb-mc 內部應用程式負載平衡器為基礎建構的多叢集內部應用程式負載平衡器
gke-l7-gxlb-mc 傳統版應用程式負載平衡器為基礎建構的多叢集全域外部應用程式負載平衡器
gke-td 多叢集 Cloud Service Mesh
asm-l7-gxlb Cloud Service Mesh 為基礎建構的全域外部應用程式負載平衡器

每個 GatewayClass 都會受到基礎負載平衡器的限制。

閘道

叢集運算子會建立閘道,定義負載平衡器監聽流量的位置和方式。閘道會從相關聯的 GatewayClass 取得行為 (即實作方式)。

Gateway 規格包含 Gateway 的 GatewayClass、要接聽的通訊埠和通訊協定,以及可繫結至 Gateway 的 Route。閘道會根據路由中繼資料選取路由,具體來說,就是路由資源的類型、命名空間和標籤。

如需部署 Gateway 的範例,請參閱「部署 Gateway」。

如需部署多叢集閘道的範例,請參閱部署多叢集閘道

HTTPRoute

HTTPRoute 會定義 Gateway 收到的 HTTP 和 HTTPS 要求如何導向至服務。應用程式開發人員會建立 HTTPRoute,透過 Gateway 公開應用程式。

HTTPRoute 會定義可從哪些閘道轉送流量、要轉送至哪些服務,以及定義 HTTPRoute 比對流量的規則。閘道和路徑繫結是雙向的,也就是說,這兩項資源必須互相選取,才能繫結。HTTPRoute 可根據要求標頭中的詳細資料比對要求。

政策

政策會定義閘道資源的屬性,通常是導入作業專屬屬性,叢集運算子可以附加至閘道、路由或 Kubernetes Service。政策會定義基礎Google Cloud 架構的運作方式。

政策通常會附加至命名空間,並可參照同一命名空間中的資源,存取權則會透過 RBAC 授予。Gateway API 的階層式特性可讓您將 Policy 附加至命名空間中的頂層資源 (Gateway),並讓不同命名空間中的所有下層資源接收該政策的特性。

GKE Gateway 控制器支援下列政策:

  • HealthCheckPolicy:定義健康狀態檢查的參數和行為,用於檢查後端 Pod 的健康狀態。
  • GCPGatewayPolicy:定義Google Cloud 負載平衡器前端的特定參數。這項政策與 Ingress 資源的 FrontendConfig 類似。
  • GCPBackendPolicy:定義負載平衡器的後端服務應如何將流量分配給端點。這項政策與 Ingress 資源的 BackendConfig 類似。
  • GCPBackendPolicy:定義負載平衡器的後端服務如何將流量分配給後端。GCPBackendPolicy 政策支援 CUSTOM_METRICS 平衡模式,可根據透過 ORCA 負載報告回報的使用者定義應用程式指標,做出路由決策。
  • GCPTrafficDistributionPolicy:定義流量在後端端點間的分配方式。這項政策與您為 Ingress 資源參照的後端服務設定特定流量平衡演算法的方式類似。

ReferenceGrant

透過跨命名空間參照,ReferenceGrant 可讓 HTTPRoute 或 Gateway 等資源參照不同命名空間中的後端服務或密鑰。ReferenceGrant 可做為權限提供者,指定哪些資源 (from) 可參照其他資源 (to)。如要啟用跨命名空間參照,您需要在參照資源的命名空間中建立 ReferenceGrant。

在下列範例中,frontend 命名空間中的 HTTPRoute 需要將流量路由至 backend 命名空間中的服務。您可以在 backend 命名空間中建立 ReferenceGrant,其中:

  • from 欄位會列出允許建立參照的來源命名空間和資源類型,也就是 frontend 命名空間中的 HTTPRoute。
  • to 欄位指定可參照的目標資源類型,也就是 backend 命名空間中的服務。
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-frontend-to-access-backend
  namespace: backend
spec:
  from:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    namespace: frontend
  to:
  - group: ""
    kind: Service

如果閘道狀態顯示「找不到有效的參照授權」錯誤訊息,請確認 fromto 區段中定義的 groupkindnamespacename 值是否有效。

閘道擁有權和使用模式

閘道和路徑資源可彈性決定組織內擁有和部署資源的方式。也就是說,基礎架構團隊可以部署及管理單一負載平衡器,但特定網域或路徑下的路由可以委派給其他 Kubernetes 命名空間中的其他團隊。GKE Gateway 控制器支援負載平衡器的多租戶使用,可在命名空間、叢集和區域之間共用。如果需要更分散的擁有權,閘道也不必共用。以下列舉 GKE 中最常見的閘道使用模式。

自行管理的閘道

單一擁有者可以只為自己的應用程式部署閘道和路徑,並專門使用這些資源。以這種方式部署的閘道和路徑與 Ingress 類似。下圖顯示兩位不同的服務擁有者,各自部署及管理自己的閘道。與 Ingress 類似,每個 Gateway 都對應到專屬的 IP 位址和負載平衡器。服務擁有者可完全控管 TLS、路由和其他政策。

單一擁有者可以完全控管閘道和路徑

這種使用模式在 Ingress 中很常見,但由於缺乏共用資源,因此難以在許多團隊之間擴大規模。Gateway API 資源模型支援下列使用模式,提供各種分散式控制和擁有權選項。

每個命名空間的平台管理閘道

閘道和路徑資源之間的分隔,可讓平台管理員代表服務擁有者控管閘道。平台管理員可以為每個命名空間或團隊部署閘道,讓該命名空間專屬使用閘道。這樣一來,服務擁有者就能完全掌控路由規則,不必擔心其他團隊發生衝突。平台管理員可藉此控管 IP 分配、通訊埠公開、通訊協定、網域和 TLS 等層面。平台管理員也可以決定團隊可使用的閘道類型,例如內部或外部閘道。這種使用模式可清楚劃分不同角色之間的職責。

跨命名空間的路由可讓 Route 跨命名空間界線附加至 Gateway。閘道可以限制可附加路徑的命名空間。同樣地,路由會指定要附加的閘道,但只能附加至允許路由命名空間的閘道。這種雙向附件可為兩側提供彈性控制項,支援多種使用模式。

在下圖中,平台管理員已部署閘道,供每個命名空間專屬存取。舉例來說,您可以設定 store 閘道,只允許 store 命名空間的路由附加至該閘道。每個閘道都代表一個獨特的負載平衡 IP 位址,因此每個團隊都能針對閘道部署任意數量的路徑,用於任何網域或路徑。

每個命名空間都有專屬閘道,可提供該命名空間的專屬閘道存取權。

每個叢集共用閘道

跨命名空間共用閘道,可讓平台管理員以更集中化的形式擁有資源。這項功能可讓在不同命名空間中執行的不同服務擁有者,共用相同的 IP 位址、DNS 網域、憑證或路徑,以便在服務之間進行精細的路由。平台管理員可透過閘道控管哪些命名空間可為特定網域路由。這與上一個範例類似,但閘道允許多個命名空間附加路徑。

在下圖中,平台管理員已將兩個閘道部署到 infra 命名空間。external 閘道允許 webmobile 命名空間的路徑附加至閘道。accounts Namespace 的路徑無法使用 external Gateway,因為 accounts Namespace 僅適用於內部服務。internal 閘道可讓 VPC 內的內部用戶端使用私人 IP 位址進行私人通訊。

每個叢集都有一個 Gateway,因此叢集內的不同命名空間可以共用單一 Gateway

m.example.com 網域會委派給 mobile 命名空間,讓行動服務擁有者在 m.example.com 網域下設定所需的任何轉送規則。服務擁有者可藉此更妥善地控管新 API 端點的導入作業和流量,不必向管理員要求變更。

每個機群的共用閘道

使用多叢集閘道時,閘道可跨命名空間、叢集和區域共用。對於應用程式分布於不同地理位置的大型機構而言,多叢集閘道或許是個好選擇,因為這類機構可精細控管全域流量,同時委派路由擁有權。與先前的範例類似,平台管理員會管理閘道並委派路由。這項用途的主要新增功能是,路徑會參照部署在叢集中的多叢集服務。流量可以明確轉送至 store.example.com/us,然後轉送至 gke-us Pod,也可以隱含轉送至 example.com/*,然後轉送至最靠近用戶端的叢集。服務擁有者可運用這項彈性,為應用程式定義最佳的轉送策略。

每個機群都有一個閘道,可提供多叢集、多區域負載平衡

GKE Gateway 控制器

GKE Gateway 控制器是 Google 實作的 Cloud Load Balancing Gateway API。與 GKE Ingress 控制器類似,Gateway 控制器會監控 Kubernetes API 的 Gateway API 資源,並調解 Cloud Load Balancing 資源,以實作 Gateway 資源指定的網路行為。

GKE Gateway 控制器有兩個版本:

  • 單一叢集:管理單一 GKE 叢集的單一叢集閘道。
  • 多叢集:管理一或多個 GKE 叢集的多叢集閘道。

這兩個 Gateway 控制器都是 Google 代管的控制器,會監控 GKE 叢集的 Kubernetes API。與 GKE Ingress 控制器不同,Gateway 控制器不會託管在 GKE 控制層或使用者專案中,因此更具擴充性和穩定性。兩個 Gateway 控制器都已正式發布。

閘道控制器本身並非網路資料層,也不會處理任何流量。這些控制器位於流量頻外,可管理處理流量的各種資料平面。下圖顯示單一叢集和多叢集 GKE Gateway 控制器的架構。使用的基礎控制器取決於已部署 Gateway 的 GatewayClass。

多叢集和單一叢集閘道控制器會部署及管理 GKE 的負載平衡器,但不會自行處理網路流量。

控制器 單一叢集閘道控制器 多叢集閘道控制器
管理員: Google Cloud Google Cloud
叢集範圍 單一叢集閘道 多叢集閘道
部署位置 在與 GKE 叢集相同的區域中部署。 在全球多個 Google Cloud 區域部署。
如何啟用 GKE 預設會啟用這項功能。 透過 Multi Cluster Ingress API 啟用,並註冊至機群。請參閱「啟用多叢集閘道」。
支援的 GatewayClass
  • gke-l7-global-external-managed GA
  • gke-l7-regional-external-managed GA
  • gke-l7-rilb GA
  • gke-l7-gxlb GA
  • asm-l7-gxlb 預先發布版
  • gke-l7-global-external-managed-mc GA
  • gke-l7-regional-external-managed-mc GA
  • gke-l7-cross-regional-internal-managed-mc GA
  • gke-l7-rilb-mc GA
  • gke-l7-gxlb-mc GA
  • gke-td 預先發布版

您可以在 GKE 叢集中同時使用多個閘道控制器,包括非 Google 提供的控制器。每個 GatewayClass 都只支援一個 Gateway 控制器,因此可以同時使用單一和多叢集負載平衡。

Service Extensions

GKE Gateway 控制器支援服務擴充功能,可讓您在 Cloud Load Balancing 中新增自訂邏輯。

GKE Gateway 控制器支援兩種擴充功能:

  • GCPTrafficExtension:這個擴充功能提供在 Cloud Load Balancing 中新增自訂邏輯的方法。擴充功能服務可以修改要求和回應的標頭和酬載,不會影響後端服務的選擇,也不會影響與後端服務相關聯的任何其他安全政策。
  • GCPRoutingExtension:這項擴充功能可讓您在 Cloud Load Balancing 中新增自訂邏輯,控管特定要求流量的轉送目的地。

如要進一步瞭解如何設定 GKE 閘道控制器,請參閱「使用服務擴充功能自訂 GKE 閘道流量」。

Ingress 和閘道

Ingress 和 Gateway 都是用於轉送流量的開放原始碼標準,但兩者之間有重大差異。

Ingress 與 Gateway 的比較

Gateway 和 Ingress 都是開放原始碼的流量路徑標準,可同時使用,不會發生衝突。建議您日後改用 Gateway 和 Route 資源,因為這些資源的功能更強大。Gateway 是 Kubernetes 社群根據從 Ingress 和服務網格生態系統中學到的經驗設計而成。Gateway 是 Ingress 的進化版,功能相同,但提供的 Ingress 功能更多。

在 GKE 中,所有 Ingress 資源都會直接轉換為 Gateway 和 HTTPRoute 資源。單一 Ingress 對應至 Gateway (適用於前端設定) 和 HTTPRoute (適用於路由設定)。以下範例顯示對應的 Gateway 和 HTTPRoute 設定。請注意,Gateway 和 HTTPRoute 資源可以分開建立,也可以由不同使用者建立。閘道可以有多個路徑,而路徑也可以附加至多個閘道。閘道和路徑之間的關係會在「閘道使用模式」中討論。

輸入

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "gce-internal"
spec:
  rules:
  - host: "example.com"
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: site
            port:
              number: 80
      - pathType: Prefix
        path: /shop
        backend:
          service:
            name: store
            port:
              number: 80

閘道

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: gke-l7-rilb
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      kinds:
      - kind: HTTPRoute

路徑

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-route
spec:
  parentRefs:
  - name: my-gateway
  hostnames:
  - "example.com"
  rules:
  - matches:
    - path:
        value: /
    backendRefs:
    - name: site
      port: 80
  - matches:
    - path:
        value: /shop
    backendRefs:
    - name: store
      port: 80

整合 Gateway API 與服務網格

您可以使用 Gateway API 設定 Cloud Service Mesh。這項功能可為服務網格用途啟用服務對服務通訊、流量管理、全球負載平衡,以及安全性政策強制執行。如要完整瞭解如何搭配使用 Cloud Service Mesh 與 Gateway API,包括部署設定指南,請參閱 Cloud Service Mesh 總覽

定價

透過 Gateway 控制器部署的所有 Compute Engine 資源,都會向 GKE 叢集所在的專案收費。單一叢集 Gateway 控制器是 GKE Standard 和 Autopilot 定價的一部分,無須額外付費。如要瞭解多叢集閘道的定價,請參閱多叢集閘道和多叢集 Ingress 定價頁面

後續步驟