本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

透過 Gateway API 發展 Kubernetes 網路功能

Ingress 資源是 Kubernetes 眾多成功案例之一。它建立了一個 多元的 Ingress 控制器生態系統,這些控制器以標準化且一致的方式在數十萬個叢集中使用。這種標準化協助使用者採用 Kubernetes。然而,在 Ingress 建立五年後,出現了分散化的跡象,形成了不同但 驚人地相似的 CRD過載的註解。使 Ingress 普及的相同可移植性也限制了它的未來。

在 2019 年聖地牙哥 Kubecon 上,一群熱情的貢獻者聚集在一起討論 Ingress 的演進。討論蔓延到街對面的飯店大廳,而由此產生的成果後來被稱為 Gateway API。此討論基於幾個關鍵假設

  1. 作為路由匹配、流量管理和服務暴露基礎的 API 標準已商品化,並且作為自訂 API,它們對實作者和使用者提供的價值很小
  2. 有可能透過通用的核心 API 資源來表示 L4/L7 路由和流量管理
  3. 有可能為更複雜的功能提供擴充性,而不會犧牲核心 API 的使用者體驗

介紹 Gateway API

這導致了設計原則,使 Gateway API 能夠改進 Ingress

  • 表達性 - 除了 HTTP 主機/路徑匹配和 TLS 之外,Gateway API 還可以表達 HTTP 標頭操作、流量權重和鏡像、TCP/UDP 路由以及其他只能透過自訂註解在 Ingress 中實現的功能。
  • 角色導向設計 - API 資源模型反映了路由和 Kubernetes 服務網路中常見的職責分離。
  • 擴充性 - 資源允許在 API 內的不同層級附加任意配置。這使得在最合適的位置進行細緻的自訂成為可能。
  • 彈性一致性 - Gateway API 定義了不同的一致性層級 - 核心(強制支援)、擴展(如果支援則可移植)和自訂(不保證可移植性),統稱為 彈性一致性。這促進了高度可移植的核心 API(如 Ingress),同時仍然為 Gateway 控制器實作者提供彈性。

Gateway API 看起來像什麼?

Gateway API 引入了幾個新的資源類型

  • GatewayClasses 是叢集範圍的資源,作為範本來明確定義從它們衍生的 Gateway 的行為。這在概念上類似於 StorageClasses,但用於網路資料平面。
  • Gateways 是 GatewayClasses 的已部署實例。它們是執行路由的資料平面的邏輯表示,可以是叢集內代理、硬體 LB 或雲端 LB。
  • Routes 不是單一資源,而是代表許多不同的協定特定 Route 資源。HTTPRoute 具有匹配、篩選和路由規則,這些規則應用於可以處理 HTTP 和 HTTPS 流量的 Gateway。同樣地,也有 TCPRoutesUDPRoutesTLSRoutes,它們也具有協定特定的語意。此模型還允許 Gateway API 在未來逐步擴展其協定支援。

The resources of the Gateway API

Gateway 控制器實作

好消息是,儘管 Gateway 仍處於 Alpha 階段,但已經有幾個 Gateway 控制器實作 可以執行。由於它是標準化的規範,以下範例可以在任何一個實作上執行,並且應該以完全相同的方式運作。查看 入門指南 以了解如何安裝和使用其中一個 Gateway 控制器。

親身體驗 Gateway API

在以下範例中,我們將示範不同 API 資源之間的關係,並引導您完成常見的使用案例

  • foo 團隊將其應用程式部署在 foo 命名空間中。他們需要控制其應用程式不同頁面的路由邏輯。
  • bar 團隊在 bar 命名空間中執行。他們希望能夠對其應用程式進行藍綠部署,以降低風險。
  • 平台團隊負責管理 Kubernetes 叢集中所有應用程式的負載平衡器和網路安全。

以下 foo-route 執行路徑匹配到 foo 命名空間中的各種服務,並且還具有到 404 伺服器的預設路由。這透過 foo.example.com/loginfoo.example.com/home 分別公開 foo-auth 和 foo-home 服務。

kind: HTTPRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
  name: foo-route
  namespace: foo
  labels:
    gateway: external-https-prod
spec:
  hostnames:
  - "foo.example.com"
  rules:
  - matches:
    - path:
        type: Prefix
        value: /login
    forwardTo:
    - serviceName: foo-auth
      port: 8080
  - matches:
    - path:
        type: Prefix
        value: /home
    forwardTo:
    - serviceName: foo-home
      port: 8080
  - matches:
    - path:
        type: Prefix
        value: /
    forwardTo:
    - serviceName: foo-404
      port: 8080

bar 團隊在同一個 Kubernetes 叢集的 bar 命名空間中運作,也希望將其應用程式公開到網際網路,但他們也希望控制自己的 Canary 和藍綠部署。以下 HTTPRoute 配置了以下行為

  • 對於到 bar.example.com 的流量

    • 將 90% 的流量傳送到 bar-v1
    • 將 10% 的流量傳送到 bar-v2
  • 對於到 bar.example.com 且 HTTP 標頭為 env: canary 的流量

    • 將所有流量傳送到 bar-v2

The routing rules configured for the bar-v1 and bar-v2 Services

kind: HTTPRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
  name: bar-route
  namespace: bar
  labels:
    gateway: external-https-prod
spec:
  hostnames:
  - "bar.example.com"
  rules:
  - forwardTo:
    - serviceName: bar-v1
      port: 8080
      weight: 90
    - serviceName: bar-v2
      port: 8080
      weight: 10
  - matches:
    - headers:
        values:
          env: canary
    forwardTo:
    - serviceName: bar-v2
      port: 8080

路由和 Gateway 綁定

因此,我們有兩個 HTTPRoute 匹配流量並將其路由到不同的服務。您可能想知道,這些服務在哪裡可以存取?它們透過哪些網路或 IP 公開?

Routes 如何公開給用戶端由 路由綁定 管理,它描述了 Routes 和 Gateways 如何在彼此之間建立雙向關係。當 Routes 綁定到 Gateway 時,表示它們的集合路由規則配置在底層負載平衡器或代理上,並且 Routes 可以透過 Gateway 存取。因此,Gateway 是網路資料平面的邏輯表示,可以透過 Routes 進行配置。

How Routes bind with Gateways

管理委派

Gateway 和 Route 資源之間的分隔允許叢集管理員將部分路由配置委派給個別團隊,同時仍然保留集中控制。以下 Gateway 資源在埠 443 上公開 HTTPS,並終止埠上所有流量,並使用由叢集管理員控制的憑證。

kind: Gateway
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
  name: prod-web
spec:
  gatewayClassName: acme-lb
  listeners:  
  - protocol: HTTPS
    port: 443
    routes:
      kind: HTTPRoute
      selector:
        matchLabels:
          gateway: external-https-prod
      namespaces:
        from: All
    tls:
      certificateRef:
        name: admin-controlled-cert

以下 HTTPRoute 顯示 Route 如何透過其 kind (HTTPRoute) 和資源標籤 (gateway=external-https-prod) 確保它與 Gateway 的選擇器匹配。

# Matches the required kind selector on the Gateway
kind: HTTPRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
  name: foo-route
  namespace: foo-ns
  labels:

    # Matches the required label selector on the Gateway
    gateway: external-https-prod
...

角色導向設計

當您將所有內容整合在一起時,您將擁有一個可以由多個團隊安全共用的負載平衡基礎架構。Gateway API 不僅是更具表達性的進階路由 API,而且還是為多租戶基礎架構設計的角色導向 API。其擴充性確保它將針對未來的使用案例進行演進,同時保持可移植性。最終,這些特性將使 Gateway API 能夠很好地適應不同的組織模型和實作。

試用看看並參與其中

有許多資源可以查看以了解更多資訊。