すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ルーティング ルールの定義に Gateway API を使用する

最終更新日:Mar 15, 2025

Gateway API は、SIG-NETWORK コミュニティによって管理されているオープンソース プロジェクトです。このプロジェクトは、表現力豊かで拡張性があり、ロール指向のインターフェイスを提供することにより、サービス ネットワーキングを進化させることを目的としています。 Gateway API を使用して、クラスタ内のアプリケーションにアクセスするためのルーティング ルールを定義できます。このトピックでは、Gateway API を使用して、クラスタ内のアプリケーションにアクセスするためのルーティング ルールを定義する方法について説明します。

前提条件

使用上の注意

  • バージョンの説明:

    • V1.18 の ASM インスタンスは Gateway API V0.6.0 をサポートしています

    • V1.22 以降の ASM インスタンスは Gateway API V1.1 および GRPCRoute をサポートしています。

    • V1.24 以降の ASM インスタンスは Gateway API V1.2.0 をサポートしています。

  • マルチクラスタ モードでは、データ プレーン上の 2 つのクラスタの同じ名前空間で同じ名前のゲートウェイ リソースが構成されている場合、後で適用されたリソースによって以前に作成されたリソースが上書きされます。

手順 1:Gateway API コンポーネントの CRD が ACK クラスタに作成されていることを確認する

デフォルトでは、Gateway API コンポーネントの CustomResourceDefinitions(CRD)は、バージョンが V1.24 以降の ACK クラスタに自動的に作成されます。次の操作を実行して、CRD が ACK クラスタに作成されていることを確認できます。

次のコマンドを実行して、CRD が ACK クラスタに作成されているかどうかを確認します。

kubectl get crds | grep gateway.networking.k8s.io
  • 出力が次のコード ブロックのようになっている場合、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 を含まない場合は、ACK コンソール にログインし、[アドオン] ページで Gateway API コンポーネントをインストールします。詳細については、「コンポーネントの管理」をご参照ください。

手順 2:ASM インスタンスの Gateway API を有効にする

kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、default という名前の ASMMeshConfig に enableGatewayAPI: true フィールドを追加します。

apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMeshConfig
metadata:
  name: default
spec:
  enableGatewayAPI: true

enableGatewayAPI を true に指定すると、コントロール プレーンは Gateway API コンポーネントの CRD を生成します。 Gateway API コンポーネントと Istio の両方にゲートウェイ リソースが含まれています。そのため、kubectl を使用して同じコマンドを実行して 2 つのゲートウェイ リソースをクエリすると、競合が発生する可能性があります。 Gateway API コンポーネントのゲートウェイ リソースをクエリするには、kubectl get gtw コマンドを実行します。 Istio のゲートウェイ リソースをクエリするには、kubectl get gw コマンドを実行します。

手順 3:HTTP トラフィック ルーティング ルールを構成する

次のセクションでは、Gateway API を使用して HTTP トラフィック ルーティング ルールを構成する方法について説明します。ルーティング ルールは、イングレス ゲートウェイで httpbin アプリケーションを公開するために使用されます。 ACK クラスタにゲートウェイと HTTPRoute を作成する必要があります。

  1. ゲートウェイを作成します。

    1. 次の内容を含む gateway.yaml ファイルを作成します。

      ファイル内の構成は、ゲートウェイが指定されたイングレス ゲートウェイに適用され、host*.aliyun.com であるリスナーが作成されることを示しています。すべての名前空間のルーティング ルールでリスナーを使用できます。リスナーはポート 80(HTTP)を使用します。 YAML ファイルの ${イングレス ゲートウェイの名前} を、デプロイされたイングレス ゲートウェイの名前に置き換えます。

      gateway.yaml ファイルを表示する

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: Gateway
      metadata:
        name: gateway
        namespace: istio-system
      spec:
        addresses:  # ゲートウェイが適用されるイングレス ゲートウェイを指定します。
        - type: Hostname
          value: istio-${イングレス ゲートウェイの名前}.istio-system.svc.cluster.local
        gatewayClassName: istio
        listeners:
        - allowedRoutes:
            namespaces:
              from: All
          hostname: '*.aliyun.com'  # このパラメータをアスタリスク(*)に指定してすべてのホストと一致させることはできません。すべてのホストと一致させる場合は、このフィールドを空のままにします。
          name: default
          port: 80
          protocol: HTTP
    2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次のコマンドを実行してゲートウェイをデプロイします。

      kubectl apply -f gateway.yaml
  2. HTTPRoute を作成します。

    1. 次の内容を含む http-route.yaml ファイルを作成します。

      ファイル内の構成は、ルーティング ルールが istio-system 名前空間の gateway という名前のゲートウェイを使用することを示しています。使用するリスナーの名前を指定していないため、ここではゲートウェイのすべてのリスナーが使用されます。パスが /get で始まるリクエストは、同じ名前空間の httpbin アプリケーションのポート 8000 にルーティングされます。

      http-route.yaml ファイルを表示する

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: HTTPRoute
      metadata:
        name: http
        namespace: default
      spec:
        parentRefs:  # ルートは異なるゲートウェイにアタッチできます。
        - 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. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次のコマンドを実行して HTTPRoute をデプロイします。

      kubectl apply -f http-route.yaml
  3. 次のコマンドを実行して、イングレス ゲートウェイを使用して httpbin アプリケーションにアクセスし、HTTP トラフィック ルーティング ルールが有効になっているかどうかを確認します。

    curl -I -HHost:httpbin.aliyun.com "http://${イングレス ゲートウェイの 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 トラフィック ルーティング ルールが有効になっていることを示しています。

手順 4:HTTPS トラフィック ルーティング ルールを構成する

次のセクションでは、Gateway API を使用して HTTPS トラフィック ルーティング ルールを構成し、ルールを使用してイングレス ゲートウェイで httpbin アプリケーションを公開し、イングレス ゲートウェイで Transport Level Security(TLS)終端を実行する方法について説明します。 ACK クラスタにゲートウェイと HTTPRoute を作成する必要があります。

  1. ASM の証明書管理機能を使用して、a.aliyun.com ホストが HTTPS を使用する証明書を作成します。証明書名を myexample-credential に設定します。詳細については、「手順 1:複数のサーバーのサーバー証明書と秘密鍵を準備する」をご参照ください。

  2. ゲートウェイを作成します。

    1. 次の内容を含む gateway-https.yaml ファイルを作成します。

      YAML ファイルの ${イングレス ゲートウェイの名前} を、デプロイされたイングレス ゲートウェイの名前に置き換えます。

      gateway-https.yaml ファイルを表示する

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: Gateway
      metadata:
        name: gateway-https
        namespace: istio-system
      spec:
        addresses:  # ゲートウェイが適用されるイングレス ゲートウェイを指定します。
        - type: Hostname
          value: istio-${イングレス ゲートウェイの名前}.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. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次のコマンドを実行してゲートウェイをデプロイします。

      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. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次のコマンドを実行して HTTPRoute をデプロイします。

      kubectl apply -f httpbin-https.yaml
  4. 次のコマンドを実行して、イングレス ゲートウェイを使用して httpbin アプリケーションにアクセスし、HTTPS トラフィック ルーティング ルールが有効になっているかどうかを確認します。

    curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{デプロイされたイングレス ゲートウェイの IP アドレス} https://a.aliyun.com/status/418

    予期される出力:

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

    出力は、HTTPS トラフィック ルーティング ルールが有効になっていることを示しています。