隨著雲原生應用程序的普及,入口流量管理的需求也在增加。Kubernetes 的 Ingress 控制器雖然可以滿足基本的入口流量需求,但是它存在一些限制。為了提供更加靈活和強大的入口管理功能,因此 Kubernetes 1.22 中引入的新功能 Gateway API。
Gateway API 是一種新的入口控制器,提供了 extensible 的入口管理模型,支持多種入口協議和 advanced 的流量管理功能。透過 Gateway API,您可以實現更加複雜的入口管理場景,提高應用程序的可用性和安全性。在這篇文章中,我們將探討 Kubernetes Gateway API 的概念、架構和使用方法,讓讀者更好地理解這個強大的入口控制器。
Gateway API 是一個官方的 Kubernetes 專案,專注於 Kubernetes 中的 L4 和 L7 路由。該專案代表了下一代 Kubernetes Ingress、Load Balancing 和 Service Mesh API。從一開始,它就被設計為通用的、富有表現力的和面向角色的。
整個資源模型側重於 3 個單獨的角色和他們需要管理的相應資源:
此 API 中的大部分配置都包含在 Routing 層中。這些特定於協議的資源(HTTPRoute、GRPCRoute 等)為 Ingress 和 Mesh 啟用了高級路由功能。
當使用 Gateway API 管理入口流量時,Gateway 資源定義了一個訪問點,流量可以在該訪問點上跨多個上下文路由。例如,從集群外部路由到集群內部(北/南流量)。
每個 Gateway 都與一個 GatewayClass 相關聯,該 GatewayClass 描述了將處理 Gateway 流量的實際閘道控制器類型,然後,各個路由資源(例如 HTTPRoute)將與 Gateway 資源相關聯。
將這些不同的關注點分為不同的資源是 Gateway 面向角色性質的關鍵部分以及允許多種閘道控制器(GatewayClass 資源)。
GKE Gateway API 是一種以角色為導向的資源模型,專為與 GKE 網絡進行交互的角色而設計。如下圖所示,此模型采用了一種能夠為平台管理員集中處理政策和控制措施的方法,讓不同的非協調服務所有者能夠安全地共享同一底層網絡基礎架構。
Gateway API 包含以下資源類型:
GEK 的網關所有權和使用模式有以下不同的部署形式:
HttpLoadBalancing
插件。Compute Network User
角色分配給服務項目的 GKE 服務賬號。進入 GKE 頁面打開 Gateway API 及 HTTP 負載平衡,或是在 Terraform 設定gateway_api_channel="CHANNEL_STANDARD"
及http_load_balancing
參數
Terraform 參數設定
module "gke" {
gateway_api_channel = "CHANNEL_STANDARD"
http_load_balancing = true
}
輸入 kubectl get gatewayclass
指令確認集群中安裝了 GatewayClass
一般的 VPC 原生集群而不是 Anthos Fleet 的話會只顯示以下四種 GatewayClass
$ kubectl get gatewayclass
NAME CONTROLLER ACCEPTED
gke-l7-global-external-managed networking.gke.io/gateway True
gke-l7-gxlb networking.gke.io/gateway True
gke-l7-regional-external-managed networking.gke.io/gateway True
gke-l7-rilb networking.gke.io/gateway True
GatewayClass Name | |
---|---|
gke-l7-global-external-managed |
基於全球外部應用負載均衡器構建的全球外部應用負載均衡器 |
gke-l7-gxlb |
基於傳統應用負載均衡器構建的全球外部應用負載均衡器 |
gke-l7-regional-external-managed |
基於區域級外部應用負載均衡器構建的區域外部應用負載均衡器 |
gke-l7-rilb |
基於內部應用負載均衡器構建的內部應用負載均衡器 |
先安裝後端組件,有store-v1
、store-v2
、store-german
三種不同的 Pod 以及其 Service
$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/app/store.yaml
$ kubectl get svc -n default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.120.96.1 <none> 443/TCP 7d1h
store-german ClusterIP 10.120.99.0 <none> 8080/TCP 21h
store-v1 ClusterIP 10.120.101.86 <none> 8080/TCP 21h
store-v2 ClusterIP 10.120.109.169 <none> 8080/TCP 21h
$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
store-german-54485d9d46-ks527 1/1 Running 0 21h
store-german-54485d9d46-pp27j 1/1 Running 0 21h
store-v1-8c5f47dbb-2tnnb 1/1 Running 0 21h
store-v1-8c5f47dbb-k64bt 1/1 Running 0 21h
store-v2-86598d766d-bw8fn 1/1 Running 0 21h
store-v2-86598d766d-ngsbb 1/1 Running 0 21h
設定跨 Namespace 的共享網關,如下圖
將external-gateway
網關部署到命名空間gateway
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: external-gateway
namespace: gateway
spec:
gatewayClassName: gke-l7-gxlb
listeners:
- name: http
hostname: "gateway.demoit.shop"
protocol: HTTP
port: 80
allowedRoutes:
kinds:
- kind: HTTPRoute
namespaces:
from: Selector
selector:
matchLabels:
shared-gateway-access: "true"
https
上述網關中的偵聽器與網域的流量 相符gateway.demoit.shop
。這使得基礎設施團隊能夠管理網域的各個方面。下面的 HTTPRoutes 不需要指定網域,如果hostname
不設置,將預設匹配所有流量。這使得管理 HTTPRoutes 變得更容易,因為它們可以與網域無關,這在應用程式網域不是靜態時很有幫助。
此網關使用 Namespace 選擇器 (Annotations) 來定義允許附加哪些 HTTPRoutes。這使得基礎設施團隊可以透過將一組 Namespace 列入白名單來限制誰或哪些應用程式可以使用此網關。
進入 GKE 的 Gateway、Service 與 Ingress 子頁面,可以看到創建出來的 Gateway 物件及其 IP
先將產生的 Loadbalance IP DNS 紀錄綁定上去
接下來將 default 命名空間加入白名單, labels.shared-gateway-access: "true",並且創建 HTTPRoute
apiVersion: v1
kind: Namespace
metadata:
name: default
labels:
shared-gateway-access: "true"
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
name: store-external
spec:
parentRefs:
- kind: Gateway
name: external-gateway
namespace: gateway
hostnames:
- "gateway.demoit.shop"
rules:
- backendRefs:
- name: store-v1
port: 8080
- matches:
- headers:
- name: env
value: canary
backendRefs:
- name: store-v2
port: 8080
- matches:
- path:
value: /de
backendRefs:
- name: store-german
port: 8080
完成後可以看到後端服務如下
從前端發起請求測試
GKE Gateway API 代表了 Kubernetes 入口流量管理的未來方向,它提供更強大、靈活和安全的解決方案,滿足現代雲原生應用程序的需求。下篇會更詳細的介紹 Gateway API 的其他使用方法。