Gateway API是由SIG-NETWORK社區管理的開源專案,通過提供可表達的、可擴充的、面向角色的介面來改善服務網路。您可以使用Gateway API對叢集內應用訪問的路由規則進行條件限制。本文介紹如何使用Gateway API定義叢集內應用的路由規則。
前提條件
已添加叢集到ASM執行個體,且ASM執行個體版本為1.18及以上。
已部署入口網關服務,且網關已開啟80和443連接埠。
已部署httpbin應用。具體操作,請參見部署httpbin應用的步驟1。
使用說明
版本說明:
ASM 1.18支援Gateway API v0.6.0
ASM 1.22開始支援Gateway API v1.1,並且新增GRPCRoute支援。
ASM 1.24開始支援Gateway API v1.2.0。
多叢集模式下,如果兩個資料面叢集中相同命名空間配置了相同名稱的Gateway相關資源,後應用的資源會覆蓋之前建立的資源。
步驟一:確認ACK叢集已存在Gateway API相關CRD
ACK 1.24及以上版本叢集預設安裝Gateway API組件相關的CRD資源。您可以通過以下操作確認ACK叢集已存在GatewayAPI相關CRD。
執行以下命令,查看ACK叢集是否安裝Gateway API組件相關CRD。
kubectl get crds | grep gateway.networking.k8s.io若預期輸出如下,表明已安裝Gateway API組件相關CRD。
gatewayclasses.gateway.networking.k8s.io 2023-05-10T02:51:33Z gateways.gateway.networking.k8s.io 2023-05-10T02:51:33Z httproutes.gateway.networking.k8s.io 2023-05-10T02:51:33Z referencegrants.gateway.networking.k8s.io 2023-05-10T02:51:33Z執行以下命令,查看CRD的版本。
kubectl get crds -o yaml | grep 'gateway.networking.k8s.io/bundle-version'預期輸出:
gateway.networking.k8s.io/bundle-version: v0.6.0 gateway.networking.k8s.io/bundle-version: v0.6.0 gateway.networking.k8s.io/bundle-version: v0.6.0 gateway.networking.k8s.io/bundle-version: v0.6.0若預期輸出中不存在Gateway API組件相關CRD,您可以登入Container Service管理主控台的組件管理頁面,安裝Gateway API組件。具體操作,請參見管理組件。
步驟二:開啟ASM執行個體的Gateway API支援開關
在ASM執行個體對應的KubeConfig環境下,在名為default的ASMMeshConfig的資源中添加enableGatewayAPI: true的欄位。
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMeshConfig
metadata:
name: default
spec:
enableGatewayAPI: true開啟 enableGatewayAPI開關後,控制面會產生GatewayAPI相關的CRD。由於Gateway API中有Gateway資源,Isito本身也有Gateway資源,所以使用kubectl時會存在衝突。您可以使用kubectl get gtw命令擷取GatewayAPI的Gateway資源;使用kubectl get gw命令擷取Istio本身的Gateway資源。
步驟三:配置HTTP路由規則
下文介紹如何使用Gateway API配置HTTP路由規則,將httpbin應用暴露在網關上。您需要在ACK叢集中建立Gateway和HTTPRoute資源。
建立Gateway資源。
使用以下內容,建立gateway.yaml檔案。
該配置表示在指定ASM網關上執行該Gateway規則,並建立一個
host為*.aliyun.com的監聽器,允許所有命名空間的路由規則引用該監聽器。該監聽器使用80連接埠,協議為HTTP協議。YAML中的${ASM網關名稱}請替換為真實的網關名稱。在ACK叢集對應的KubeConfig環境下,執行以下命令,部署Gateway。
kubectl apply -f gateway.yaml
建立HTTPRoute資源。
使用以下內容,建立http-route.yaml檔案。
該配置表示路由規則引用istio-system命名空間下名為
gateway的Gateway資源。因為未指定監聽器名稱,此處會嘗試引用該Gateway的所有監聽器。對於路徑首碼為/get的請求,將路由到同命名空間下的httpbin服務的8000連接埠。在ACK叢集對應的KubeConfig環境下,執行以下命令,部署HTTPRoute。
kubectl apply -f http-route.yaml
執行以下命令,通過ASM網關訪問httpbin應用,查看HTTP路由規則是否生效。
curl -I -HHost:httpbin.aliyun.com "http://${ASM網關IP}:80/get"預期輸出:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 12 May 2023 08:16:30 GMT content-type: application/json content-length: 516 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 4返回
200 OK,表明HTTP路由規則生效。
步驟四:配置HTTPS路由規則
下文介紹如何使用Gateway API配置HTTPS路由規則,將httpbin應用暴露在網關上,並在ASM網關上完成TLS終止。您需要在ACK叢集中建立Gateway和HTTPRoute資源。
使用ASM全域認證管理,為a.aliyun.com建立HTTPS中用到的認證,且認證名稱為myexample-credential。具體操作,請參見步驟一:為多個主機準備伺服器憑證和私密金鑰。
建立Gateway資源。
使用以下內容,建立gateway-https.yaml檔案。
YAML檔案中的
${ASM網關名稱}請替換為真實的網關名稱。在ACK叢集對應的KubeConfig環境下,執行以下命令,部署Gateway。
kubectl apply -f gateway-https.yaml
建立HTTPRoute資源。
使用以下內容,建立httpbin-https.yaml檔案。
在ACK叢集對應的KubeConfig環境下,執行以下命令,部署HTTPRoute。
kubectl apply -f httpbin-https.yaml
執行以下命令,通過ASM網關訪問httpbin應用,驗證HTTPS路由規則是否生效。
curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{替換成真實的入口網關IP地址} https://a.aliyun.com/status/418預期輸出:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`預期輸出表明HTTPS路由規則生效。