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

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

最終更新日:Jan 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 をサポートしています。

  • マルチクラスターモードでは、データプレーン上の 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 ファイルの ${Name of the ingress gateway} を、デプロイされたイングレスゲートウェイの名前に置き換えます。

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

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: Gateway
      metadata:
        name: gateway
        namespace: istio-system
      spec:
        addresses:  # ゲートウェイが適用されるイングレスゲートウェイを指定します。
        - type: Hostname
          value: istio-${Name of the ingress gateway}.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 address of the ingress gateway}: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 ファイルの ${Name of the ingress gateway} を、デプロイされたイングレスゲートウェイの名前に置き換えます。

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

      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: Gateway
      metadata:
        name: gateway-https
        namespace: istio-system
      spec:
        addresses:  # ゲートウェイが適用されるイングレスゲートウェイを指定します。
        - type: Hostname
          value: istio-${Name of the ingress gateway}.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 address of the deployed ingress gateway} https://a.aliyun.com/status/418

    予期される出力:

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

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