什么是Gateway API?
Gateway API是由SIG-NETWORK社區(qū)管理的開源項(xiàng)目。它包含了在Kubernetes中對服務(wù)網(wǎng)絡(luò)建模的資源集合。這些資源包括GatewayClass,Gateway,HTTPRoute,TCPRoute,Service等。他們可以由不同的供應(yīng)商實(shí)現(xiàn),同時(shí)保持通用的行業(yè)支持能力,以可擴(kuò)展和面向角色的接口形式來實(shí)現(xiàn)Kubernetes服務(wù)網(wǎng)絡(luò)的工業(yè)化支持。
SIG-NETWORK:
https://github.com/kubernetes/community/tree/master/sig-network
資源參考
無論您是有興趣使用Gateway API,還是Gateway API的實(shí)施者,以下資源都將幫助您提供必要的背景知識:
接口概述
https://gateway-api.sigs.k8s.io/concepts/api-overview
用戶指南
https://gateway-api.sigs.k8s.io/guides
網(wǎng)關(guān)控制器實(shí)現(xiàn)
https://gateway-api.sigs.k8s.io/implementations
API參考規(guī)范
https://gateway-api.sigs.k8s.io/references/spec
社區(qū)鏈接
https://gateway-api.sigs.k8s.io/contributing/community
開發(fā)者指南
https://gateway-api.sigs.k8s.io/contributing/devguide
Gateway API基本概念
Gateway API的概念來源于以下的設(shè)計(jì)目標(biāo)。它們展示了GatewayAPI與以往規(guī)范(例如Ingress)的關(guān)系,及特點(diǎn)。
面向角色–我們在實(shí)際部署中的網(wǎng)關(guān),是由一系列API資源組成,這些資源共同描述Kubernetes服務(wù)網(wǎng)絡(luò)模型。
可移植性-這雖然不是改進(jìn),但是作為新一代Kubernetes網(wǎng)絡(luò)建模,是不可或缺的考慮方面。正如Ingress作為通用規(guī)范,擁有眾多實(shí)現(xiàn)(https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)一樣,Gateway API也被設(shè)計(jì)為可移植的,可在多個(gè)實(shí)現(xiàn)間切換。
更多表現(xiàn)能力–Gateway API資源支持許多核心功能,例如基于HTTP標(biāo)頭的匹配、流量權(quán)重和其他功能,這些功能在Ingress中只能通過自定義注釋(annotation)實(shí)現(xiàn)。
可擴(kuò)展–Gateway API允許在API的各個(gè)層鏈接自定義資源。這使得在API結(jié)構(gòu)中的適當(dāng)位置進(jìn)行精細(xì)定制成為可能。
其他一些值得注意的功能包括:
GatewayClasses–GatewayClass指定了負(fù)載平衡實(shí)現(xiàn)的類型。這些類使用戶能夠輕松明確地了解通過Kubernetes資源模型提供哪些功能。
共享Gateways和跨命名空間(namespace)支持-它們允許獨(dú)立的路由資源附加到同一gateway來共享負(fù)載均衡器和VIP。這允許團(tuán)隊(duì)(甚至跨命名空間)安全地共享基礎(chǔ)結(jié)構(gòu),而無需相互協(xié)調(diào)。
類型化路由(Typed Routes)和類型化后端服務(wù)-Gateway API支持類型化路由資源以及不同類型的后端。這使得API能夠靈活地支持各種協(xié)議(如HTTP和gRPC)和各種后端目標(biāo)(如Kubernetes服務(wù)、存儲或函數(shù))。
為什么面向角色的API很重要?
無論是數(shù)據(jù)中心還是Kubernetes集群,基礎(chǔ)設(shè)施都是為共享而構(gòu)建的。然而,共享基礎(chǔ)設(shè)施帶來了一個(gè)共同的挑戰(zhàn)-如何在保持基礎(chǔ)設(shè)施所有者控制的同時(shí)為基礎(chǔ)設(shè)施用戶提供靈活性?
Gateway API通過面向角色的Kubernetes服務(wù)網(wǎng)絡(luò)設(shè)計(jì)來實(shí)現(xiàn)這一點(diǎn),該設(shè)計(jì)在使用分布靈活性和集中控制之間取得平衡。它允許共享網(wǎng)絡(luò)基礎(chǔ)設(shè)施(例如,硬件負(fù)載平衡器、云網(wǎng)絡(luò)、集群托管代理等)可以被許多上層不同的非協(xié)調(diào)團(tuán)隊(duì)(例如應(yīng)用開發(fā)團(tuán)隊(duì))使用,使用過程受到集群運(yùn)營商設(shè)置的策略的約束。以下示例顯示了這在實(shí)踐中的工作原理。
群集操作員可以在某種GatewayClass下創(chuàng)建Gateway資源。這個(gè)Gateway部署或配置代表的是基礎(chǔ)網(wǎng)絡(luò)資源。這時(shí),集群操作員可以在Gateway上顯式聲明集中控制策略(如TLS),允許什么樣的Route可以綁定在此Gateway上。通過Route和Gateway的綁定,應(yīng)用開發(fā)者團(tuán)隊(duì)可以在自己的namespace中發(fā)布自己的應(yīng)用,并通過Gateway將應(yīng)用發(fā)布出去供外部訪問。
GatewayClass:
https://gateway-api.sigs.k8s.io/api-types/gatewayclass
Gateway:
https://gateway-api.sigs.k8s.io/api-types/gateway
TLS:
https://gateway-api.sigs.k8s.io/guides/tls#downstream-tls
Route:
https://gateway-api.sigs.k8s.io/concepts/api-overview#attaching-routes-to-gateways
namespace:
https://gateway-api.sigs.k8s.io/guides/multiple-ns
另外,應(yīng)用開發(fā)者團(tuán)隊(duì)在自己的命名空間中,可以選擇性的將某些Route附加到共享Gateway上,從而允許獨(dú)立控制各個(gè)應(yīng)用的路由邏輯。
Route:
https://gateway-api.sigs.k8s.io/guides/http-routing
這樣,集群操作員和應(yīng)用開發(fā)者團(tuán)隊(duì)就可以分別操作于自己的控制平面,集群操作員控制網(wǎng)關(guān)的配置以控制入口策略,而應(yīng)用開發(fā)者團(tuán)隊(duì)負(fù)責(zé)調(diào)配跟應(yīng)用相關(guān)的路由策略(例如根據(jù)url或者h(yuǎn)eader等信息實(shí)現(xiàn)應(yīng)用流量分流等等)。
應(yīng)用流量分流:
https://gateway-api.sigs.k8s.io/guides/traffic-splitting
這種靈活性使Gateway API能夠適應(yīng)截然不同的組織模型和實(shí)現(xiàn),但同時(shí)保持可移植的特性。
Gateway適合于哪些場景?
Gateway API是一個(gè)SIG網(wǎng)絡(luò)項(xiàng)目,旨在改進(jìn)和標(biāo)準(zhǔn)化Kubernetes中的服務(wù)網(wǎng)絡(luò)。當(dāng)前和正在進(jìn)行的實(shí)現(xiàn)包括BIG-IP,Contour,Emissary-Ingress,Google Kubernetes引擎(GKE),NGINX,Istio,Kong和Traefik等等。
SIG網(wǎng)絡(luò):
https://github.com/kubernetes/community/tree/master/sig-network
讀者可以查看實(shí)現(xiàn)參考:https://gateway-api.sigs.k8s.io/implementations/,了解支持Gateway的最新項(xiàng)目和產(chǎn)品。如果您有興趣使用網(wǎng)關(guān)API貢獻(xiàn)或構(gòu)建實(shí)現(xiàn),也非常歡迎參與其中:https://gateway-api.sigs.k8s.io/contributing/community!