全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用Gateway API定義路由規則

更新時間:Mar 07, 2025

Gateway API是由SIG-NETWORK社區管理的開源專案,通過提供可表達的、可擴充的、面向角色的介面來改善服務網路。您可以使用Gateway API對叢集內應用訪問的路由規則進行條件限制。本文介紹如何使用Gateway API定義叢集內應用的路由規則。

前提條件

使用說明

  • 版本說明:

    • 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資源。

  1. 建立Gateway資源。

    1. 使用以下內容,建立gateway.yaml檔案。

      該配置表示在指定ASM網關上執行該Gateway規則,並建立一個host*.aliyun.com的監聽器,允許所有命名空間的路由規則引用該監聽器。該監聽器使用80連接埠,協議為HTTP協議。YAML中的${ASM網關名稱}請替換為真實的網關名稱。

      展開查看gateway.yaml

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: Gateway
      metadata:
        name: gateway
        namespace: istio-system
      spec:
        addresses:  # 用於指定ASM網關Service。此處支援apply到多個ASM網關的服務上。
        - type: Hostname
          value: istio-${ASM網關名稱}.istio-system.svc.cluster.local
        gatewayClassName: istio
        listeners:
        - allowedRoutes:
            namespaces:
              from: All
          hostname: '*.aliyun.com'  # 不支援直接匹配“*”。如果要匹配“*”,不填寫此欄位即可。
          name: default
          port: 80
          protocol: HTTP
    2. 在ACK叢集對應的KubeConfig環境下,執行以下命令,部署Gateway。

      kubectl apply -f gateway.yaml
  2. 建立HTTPRoute資源。

    1. 使用以下內容,建立http-route.yaml檔案。

      該配置表示路由規則引用istio-system命名空間下名為gateway的Gateway資源。因為未指定監聽器名稱,此處會嘗試引用該Gateway的所有監聽器。對於路徑首碼為/get的請求,將路由到同命名空間下的httpbin服務的8000連接埠。

      展開查看http-route.yaml

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: HTTPRoute
      metadata:
        name: http
        namespace: default
      spec:
        parentRefs:  # 此處的route也支援attach到不同的Gateway上。
        - name: gateway
          namespace: istio-system
        hostnames: ["*.aliyun.com"]
        rules:
        - matches:
          - path:
              type: PathPrefix
              value: /get
          backendRefs:  # 這裡預設只允許引用相同命名空間下的服務。如果需要使用不同命名空間下的服務,請配置ReferenceGrant資源。https://gateway-api.sigs.k8s.io/api-types/referencegrant/
          - name: httpbin 
            port: 8000
    2. 在ACK叢集對應的KubeConfig環境下,執行以下命令,部署HTTPRoute。

      kubectl apply -f http-route.yaml
  3. 執行以下命令,通過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資源。

  1. 使用ASM全域認證管理,為a.aliyun.com建立HTTPS中用到的認證,且認證名稱為myexample-credential。具體操作,請參見步驟一:為多個主機準備伺服器憑證和私密金鑰

  2. 建立Gateway資源。

    1. 使用以下內容,建立gateway-https.yaml檔案。

      YAML檔案中的${ASM網關名稱}請替換為真實的網關名稱。

      展開查看gateway-https.yaml

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: Gateway
      metadata:
        name: gateway-https
        namespace: istio-system
      spec:
        addresses:  # 此處用於指定ASM網關Service,支援apply到多個ASM網關的服務上。
        - type: Hostname
          value: istio-${ASM網關名稱}.istio-system.svc.cluster.local
        gatewayClassName: istio
        listeners:
        - name: https
          hostname: "*.aliyun.com"
          port: 443
          protocol: HTTPS
          tls:
            mode: Terminate
            certificateRefs:
            - name: myexample-credential
          allowedRoutes:
            namespaces:
              from: All
    2. 在ACK叢集對應的KubeConfig環境下,執行以下命令,部署Gateway。

      kubectl apply -f gateway-https.yaml
  3. 建立HTTPRoute資源。

    1. 使用以下內容,建立httpbin-https.yaml檔案。

      展開查看httpbin-https.yaml

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: HTTPRoute
      metadata:
        name: httpbin-https
        namespace: default
      spec:
        parentRefs:
        - name: gateway-https
          namespace: istio-system
        hostnames: ["*.aliyun.com"]
        rules:
        - matches:
          - path:
              type: PathPrefix
              value: /status
          - path:
              type: PathPrefix
              value: /delay
          backendRefs:
          - name: httpbin
            port: 8000
    2. 在ACK叢集對應的KubeConfig環境下,執行以下命令,部署HTTPRoute。

      kubectl apply -f httpbin-https.yaml
  4. 執行以下命令,通過ASM網關訪問httpbin應用,驗證HTTPS路由規則是否生效。

    curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{替換成真實的入口網關IP地址}  https://a.aliyun.com/status/418

    預期輸出:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`

    預期輸出表明HTTPS路由規則生效。