Kubernetes Gateway API 剛剛 GA,旨在改進(jìn)將集群服務(wù)暴露給外部的過(guò)程。這其中包括一套更標(biāo)準(zhǔn)、更強(qiáng)大的 API資源,用于管理已暴露的服務(wù)。在這篇文章中,我將介紹 Gateway API 資源,并以 Istio 為例來(lái)展示這些資源是如何關(guān)聯(lián)的。通過(guò)這個(gè)示例,你將了解 Gateway API 的各個(gè)組成部分如何配合以將流量傳遞到后端服務(wù)。
背 景
允許外部與 Kubernetes 集群內(nèi)的服務(wù)通信是 administrator 需要執(zhí)行的最基本任務(wù)之一。Service 在 IP 層面上提供的功能十分有限,且缺乏根據(jù)應(yīng)用層數(shù)據(jù)(如 DNS 主機(jī)名或 HTTP 路徑)路由流量的能力。因此 Kubernetes 提供了 Ingress API 來(lái)實(shí)現(xiàn)應(yīng)用層路由。
然而,Ingress API 有一些限制。Ingress2gateway 的公告[1]清楚地列出了這些限制:
Ingress 側(cè)重于 HTTP 流量,因此用戶需要找到其他解決方案來(lái)處理 UDP、TCP 或其他協(xié)議。
Ingress 資源混合了基礎(chǔ)架構(gòu)和應(yīng)用程序配置,讓細(xì)粒度的基于角色的訪問(wèn)控制(RBAC)的實(shí)施變得較為困難。
第二點(diǎn)對(duì)于已經(jīng)熟悉 Ingress 的用戶來(lái)說(shuō)是最明顯的。在平臺(tái)工程中提供強(qiáng)大的 RBAC 是集群管理的關(guān)鍵步驟。將基礎(chǔ)設(shè)施組件(負(fù)載均衡器、配置等)的權(quán)限與流量路由規(guī)則的權(quán)限分開(kāi),能夠讓權(quán)限的邊界更加清晰。
接下來(lái)我將介紹 Gateway API 如何劃分這些資源,以及它們?nèi)绾巫罱K結(jié)合在一起來(lái)路由流量。
設(shè)置測(cè)試環(huán)境
本文使用運(yùn)行 Istio 和一個(gè)示例工作負(fù)載的測(cè)試環(huán)境來(lái)檢查和理解各種 Gateway API 資源。如果你也想上手嘗試,可以復(fù)制這個(gè)環(huán)境。
我用的是 K3s,使用 Kubernetes 集群也是類似的操作。如果選擇使用 K3s,則在安裝時(shí)不要啟用 Traefik:
$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable=traefik" sh -
首先,部署 Gateway API CRD(Custom Resource Definitions),并按照官方文檔安裝 Istio( https://istio.io/latest/docs/tasks/traffic-management/ingress/gateway-api/):
# Install the CRDs $ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || { kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.8.0" | kubectl apply -f -; } customresourcedefinition.apiextensions.k8s.io/gatewayclasses.gateway.networking.k8s.io created customresourcedefinition.apiextensions.k8s.io/gateways.gateway.networking.k8s.io created customresourcedefinition.apiextensions.k8s.io/httproutes.gateway.networking.k8s.io created customresourcedefinition.apiextensions.k8s.io/referencegrants.gateway.networking.k8s.io created # Install Istio $ istioctl install --set profile=minimal -y Istio core installed Istiod installed Installation complete Made this installation the default for injection and validation.
接下來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的工作負(fù)載,比如一個(gè) Nginxdeployment,并通過(guò)deservice將其暴露:
# Deployment.yaml --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx:latest name: nginx # Service.yaml --- apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: ClusterIP
$ kubectl apply -f Deployment.yaml deployment.apps/nginx created $ kubectl apply -f Service.yaml service/nginx created
以上就是你用來(lái)理解 Gateway API 所需的全部基礎(chǔ)設(shè)施。
了解 Gateway API 資源
想要使用 Gateway API,有三種資源類型你需要明確了解:
GatewayClass
Gateway
路由資源,比如HTTPRoute或GRPCRoute。GA 版本僅包含在 v1 通道中到HTTPRoute。
這些資源在標(biāo)準(zhǔn) Ingress API 或自定義提供商負(fù)載均衡器和路由工具提供的 CRD 中以各種方式組合在一起。通過(guò)將這些資源拆分為單獨(dú)的組件,Gateway API 實(shí)現(xiàn)了關(guān)注點(diǎn)分離和強(qiáng)大的、細(xì)粒度的訪問(wèn)控制。
讓我們逐個(gè)了解這些資源,以了解它們之間的關(guān)系。
了解 GatewayClass 資源
GatewayClass資源的作用與現(xiàn)有 Ingress API 中的IngressClass相同,類似于 Storage API 中的StorageClass。它定義了可以創(chuàng)建的Gateway類別。通常,此資源由你的基礎(chǔ)架構(gòu)平臺(tái)(如 EKS 或 GKE)提供。也可以由第三方的 Ingress Controller 提供,例如 Istio 或 Nginx。Istio 包含兩個(gè)GatewayClasses:
$ kubectl get gatewayclass NAME CONTROLLER ACCEPTED AGE istio-remote istio.io/unmanaged-gateway True 19h istio istio.io/gateway-controller True 19h
spec字段提供了有關(guān)實(shí)現(xiàn)GatewayClass功能的 controller 的信息,它定義了整個(gè)集群使用的控制器,而GatewayClasses是集群范圍的資源,適用于所有命名空間。
$ kubectl get gatewayclass istio -o yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: GatewayClass metadata: creationTimestamp: "2023-10-30T0211Z" generation: 1 name: istio resourceVersion: "636" uid: dea0bb44-5f1b-4d23-8f7f-c34f70b4603c spec: controllerName: istio.io/gateway-controller description: The default Istio GatewayClass status: conditions: - lastTransitionTime: "2023-10-30T0211Z" message: Handled by Istio controller observedGeneration: 1 reason: Accepted status: "True" type: Accepted
GatewayClass還可以指定傳遞給控制器的參數(shù)。這樣上游項(xiàng)目能夠進(jìn)一步定制向集群管理員公開(kāi)的配置。也就是說(shuō),GatewayClass允許集群管理員專注于將其流量暴露給外部,而不必?fù)?dān)心例如在底層基礎(chǔ)設(shè)施上如何創(chuàng)建負(fù)載均衡器等實(shí)現(xiàn)細(xì)節(jié)。
創(chuàng)建 Gateway
Gateway代表在基礎(chǔ)設(shè)施提供商中實(shí)例化的負(fù)載均衡器服務(wù)。它可以是一個(gè)實(shí)際的云負(fù)載均衡器,用于處理流量。也可以代表現(xiàn)有負(fù)載均衡器中的虛擬配置。然后通過(guò)GatewayClass進(jìn)行抽象。Cluster operator 專注于定義必要的Gateway資源,無(wú)需擔(dān)心由GatewayClass處理的實(shí)現(xiàn)細(xì)節(jié)。
Gateway在其規(guī)范中引用了一個(gè)GatewayClass。下面的示例使用 istio 類,并定義了一個(gè)響應(yīng)端口 8080 上*.example.com的 HTTP 請(qǐng)求的單個(gè)偵聽(tīng)器:
# Gateway.yaml --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: tutorial-gw namespace: default spec: gatewayClassName: istio listeners: - name: default hostname: "*.example.com" port: 8080 protocol: HTTP allowedRoutes: namespaces: from: All
使用 Istio 在創(chuàng)建Gateway時(shí)還會(huì)相應(yīng)配置Deployment和Service來(lái)處理流量。GatewayClass的控制器負(fù)責(zé)為Gateway處理所需的基礎(chǔ)設(shè)施或配置的設(shè)置:
$ kubectl get pods NAME READY STATUS RESTARTS AGE tutorial-gw-istio-65bfccf7c-45c4w 1/1 Running 2 (6m31s ago) 18h $ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tutorial-gw-istio LoadBalancer 10.43.126.90 192.168.122.10 15021:31348/TCP,8080:31728/TCP 18h
這里需要注意的是Gateway中沒(méi)有定義路由規(guī)則。Gateways代表基礎(chǔ)設(shè)施的配置,這種分離對(duì)于實(shí)現(xiàn) RBAC 至關(guān)重要。訪問(wèn)控制模型允許 cluster operator 配置可用的Gateways,讓用戶在其路由資源中引用,而無(wú)需暴露對(duì)基礎(chǔ)設(shè)施配置本身的訪問(wèn)。
創(chuàng)建路由
現(xiàn)有的 Ingress API 僅支持 HTTP 和 HTTPS 服務(wù),這是一個(gè)比較大的限制。
而新的 Gateway API 為各種入站流量類型提供通用支持。HTTPRoute、TCPRoute、TLSRoute、GRPCRoute等資源在特定Gateway上指定了實(shí)際的流量路由。Gateway API 的 GA 版本只在標(biāo)準(zhǔn)的 v1 通道中包含了HTTPRoute資源,在未來(lái)的版本中將會(huì)有更多的協(xié)議支持。
HTTPRoute資源指定與用于暴露服務(wù)的 Gateway 的連接,以及一系列規(guī)則來(lái)將流量路由到適當(dāng)?shù)暮蠖恕O旅娴氖纠龑TTPRoute附加到tutorial-gwGateway,并指定規(guī)則將所有流量路由到nginxService:
--- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: tutorial-route namespace: default spec: parentRefs: - group: gateway.networking.k8s.io kind: Gateway name: tutorial-gw rules: - backendRefs: - group: "" kind: Service name: nginx port: 80 weight: 1 matches: - path: type: PathPrefix value: /
$ kubectl apply -f HTTPRoute.yaml httproute.gateway.networking.k8s.io/tutorial-route created $ kubectl get httproute NAME HOSTNAMES AGE tutorial-route 6s
綜合以上
Gateway API 將許多傳統(tǒng)上包含在單個(gè)資源定義中的資源拆分開(kāi)來(lái)。要跟蹤所有這些資源之間的連接可能有點(diǎn)困難,這里我將資源之間的關(guān)系圖展示如下:
Gateway API 資源之間的關(guān)系
快速回顧
GatewayClass定義了可以部署的 Gateway 類型。通常由基礎(chǔ)設(shè)施提供商提供。在本示例中,Istio 定義了GatewayClass。
Gateway是負(fù)載均衡基礎(chǔ)設(shè)施的實(shí)例化。這可以是在云環(huán)境中部署的實(shí)際負(fù)載均衡器,也可以是針對(duì)現(xiàn)有負(fù)載均衡器執(zhí)行的一些配置。無(wú)論哪種方式,通過(guò)簡(jiǎn)單地引用所需的GatewayClass,就能從 cluster administrator 中抽象出來(lái)。
HTTPRoute(或任何其他支持的 Route 資源)定義了處理流量的實(shí)際規(guī)則。這些路由附加到特定的 Gateway,最終決定了流量的轉(zhuǎn)發(fā)。
有了所有這些配置,就可以對(duì)服務(wù)進(jìn)行測(cè)試請(qǐng)求。本示例Gateway配置為偵聽(tīng)端口 8080 上*.example.com的 HTTP 請(qǐng)求,因此你的請(qǐng)求需要設(shè)置適當(dāng)?shù)?Host header 和端口:
$ curl -H "Host: www.example.com" 192.168.122.10:8080Welcome to nginx!
這樣,你就使用新的網(wǎng)關(guān) API 成功配置了第一組資源咯!
-
通信
+關(guān)注
關(guān)注
18文章
6076瀏覽量
136476 -
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
4605瀏覽量
51551 -
API
+關(guān)注
關(guān)注
2文章
1518瀏覽量
62448 -
kubernetes
+關(guān)注
關(guān)注
0文章
227瀏覽量
8757
原文標(biāo)題:Kubernetes Gateway API 攻略:解鎖集群流量服務(wù)新維度!
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Kubernetes的Device Plugin設(shè)計(jì)解讀
MLDL之API:關(guān)于各國(guó)內(nèi)外大平臺(tái)API簡(jiǎn)介、使用方法之詳細(xì)攻略
不吹不黑,今天我們來(lái)聊一聊 Kubernetes 落地的三種方式
Kubernetes API詳解
![<b class='flag-5'>Kubernetes</b> <b class='flag-5'>API</b>詳解](https://file.elecfans.com/web2/M00/49/FF/pYYBAGKhvIWAYswrAAATssJjcYE841.png)
深入研究Kubernetes調(diào)度
local-data-api-gateway本地?cái)?shù)據(jù)API網(wǎng)關(guān)
![local-data-<b class='flag-5'>api-gateway</b>本地?cái)?shù)據(jù)<b class='flag-5'>API</b>網(wǎng)關(guān)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
帶你快速了解 kubernetes
什么是Kubernetes容器運(yùn)行時(shí)CRI
![什么是<b class='flag-5'>Kubernetes</b>容器運(yùn)行時(shí)CRI](https://file.elecfans.com/web2/M00/92/8F/poYBAGPzLaGAL_oFAAB-zswhwHk864.jpg)
Kubernetes Operator最佳實(shí)踐介紹
API 網(wǎng)關(guān)詳細(xì)介紹(上)
![<b class='flag-5'>API</b> 網(wǎng)關(guān)詳細(xì)介紹(上)](https://file1.elecfans.com/web2/M00/82/73/wKgaomRTelaAUmf1AAV7q4EEu0Y499.jpg)
API 網(wǎng)關(guān)詳細(xì)介紹(下)
![<b class='flag-5'>API</b> 網(wǎng)關(guān)詳細(xì)介紹(下)](https://file1.elecfans.com/web2/M00/82/73/wKgaomRTelaABb2BAAL5-aPx0dg202.jpg)
Kubernetes多租戶集群的概念和常見(jiàn)的應(yīng)用模式
![<b class='flag-5'>Kubernetes</b>多租戶集群的概念和常見(jiàn)的應(yīng)用模式](https://file1.elecfans.com/web2/M00/82/C7/wKgZomRh6i2AMC7BAAAQr1w1JkY347.png)
Kubernetes 監(jiān)控利器功能特性
![<b class='flag-5'>Kubernetes</b> 監(jiān)控利器功能特性](https://file1.elecfans.com/web2/M00/82/DC/wKgZomRki_yAHu8IAAA0IUENzl0979.png)
怎么使用Kubernetes檢查點(diǎn)API快速進(jìn)行容器的備份和恢復(fù)呢?
api網(wǎng)關(guān) kong 教程入門
![<b class='flag-5'>api</b>網(wǎng)關(guān) kong 教程入門](https://file1.elecfans.com/web2/M00/AD/6F/wKgaomVNpTqAMAbcAAIZwsLvplM107.jpg)
評(píng)論