本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
透過 Gateway API 發展 Kubernetes 網路功能
Ingress 資源是 Kubernetes 眾多成功案例之一。它建立了一個 多元的 Ingress 控制器生態系統,這些控制器以標準化且一致的方式在數十萬個叢集中使用。這種標準化協助使用者採用 Kubernetes。然而,在 Ingress 建立五年後,出現了分散化的跡象,形成了不同但 驚人地相似的 CRD 和 過載的註解。使 Ingress 普及的相同可移植性也限制了它的未來。
在 2019 年聖地牙哥 Kubecon 上,一群熱情的貢獻者聚集在一起討論 Ingress 的演進。討論蔓延到街對面的飯店大廳,而由此產生的成果後來被稱為 Gateway API。此討論基於幾個關鍵假設
- 作為路由匹配、流量管理和服務暴露基礎的 API 標準已商品化,並且作為自訂 API,它們對實作者和使用者提供的價值很小
- 有可能透過通用的核心 API 資源來表示 L4/L7 路由和流量管理
- 有可能為更複雜的功能提供擴充性,而不會犧牲核心 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。同樣地,也有 TCPRoutes、UDPRoutes 和 TLSRoutes,它們也具有協定特定的語意。此模型還允許 Gateway API 在未來逐步擴展其協定支援。
Gateway 控制器實作
好消息是,儘管 Gateway 仍處於 Alpha 階段,但已經有幾個 Gateway 控制器實作 可以執行。由於它是標準化的規範,以下範例可以在任何一個實作上執行,並且應該以完全相同的方式運作。查看 入門指南 以了解如何安裝和使用其中一個 Gateway 控制器。
親身體驗 Gateway API
在以下範例中,我們將示範不同 API 資源之間的關係,並引導您完成常見的使用案例
- foo 團隊將其應用程式部署在 foo 命名空間中。他們需要控制其應用程式不同頁面的路由邏輯。
- bar 團隊在 bar 命名空間中執行。他們希望能夠對其應用程式進行藍綠部署,以降低風險。
- 平台團隊負責管理 Kubernetes 叢集中所有應用程式的負載平衡器和網路安全。
以下 foo-route 執行路徑匹配到 foo 命名空間中的各種服務,並且還具有到 404 伺服器的預設路由。這透過 foo.example.com/login
和 foo.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
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 進行配置。
管理委派
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 能夠很好地適應不同的組織模型和實作。
試用看看並參與其中
有許多資源可以查看以了解更多資訊。
- 查看 使用者指南 以了解可以解決哪些使用案例。
- 試用其中一個 現有的 Gateway 控制器
- 或 參與其中 並協助設計和影響 Kubernetes 服務網路的未來!