次の方法で共有


Application Gateway for Containers を使用したパス、ヘッダー、クエリ文字列のルーティング - Gateway API

このドキュメントでは、ゲートウェイ API のリソースを使用して、URL パス、クエリ文字列、ヘッダーに基づくトラフィック ルーティングを示すサンプル アプリケーションを設定するのに役立ちます。 以下を行うための手順を示します。

  • HTTPS リスナーを 1 つ持つ Gateway リソースを作成します。
  • バックエンド サービスを参照する HTTPRoute リソースを作成します。
  • HTTPRouteMatch を使用して、パス、ヘッダー、およびクエリ文字列に基づいてそのルートmatchesを実行します。

バックグラウンド

Application Gateway for Containers では、URL パス、クエリ文字列、ヘッダーに基づくトラフィック ルーティングが可能になります。 次のシナリオ例を見てみましょう。

Application Gateway for Containers でのパス、ヘッダー、クエリ文字列ルーティングを示す図。

[前提条件]

  1. BYO デプロイ戦略に従う場合は、Application Gateway for Containers リソースと ALB コントローラーを設定していることを確認します

  2. ALB マネージド デプロイ戦略に従う場合は、ALB コントローラーのプロビジョニングと、ApplicationLoadBalancer カスタム リソースを介した Application Gateway for Containers リソースのプロビジョニングが完了していることを確認します。

  3. サンプル HTTP アプリケーションをデプロイします。クラスターに次の deployment.yaml ファイルを適用して、パス、クエリ、ヘッダー ベースのルーティングを示すサンプル Web アプリケーションを作成します。

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    このコマンドによって、クラスターに次のものが作成されます。

    • test-infra と呼ばれる名前空間
    • backend-v1 名前空間の backend-v2 および test-infra と呼ばれる 2 つのサービス
    • backend-v1 名前空間の backend-v2 および test-infra と呼ばれる 2 つのデプロイ

必要な Gateway API リソースを展開する

ゲートウェイの作成:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: http-listener
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
EOF

ALB コントローラーは、Azure Resource Manager で Application Gateway for Containers リソースを作成するときに、フロントエンド リソースに対して次の名前付け規則 ( fe-<eight randomly generated characters>) を使用します。

Azure で作成されたフロントエンド リソースの名前を変更する場合は、 独自のデプロイ戦略に従ってください。

ゲートウェイ リソースが作成されたら、状態が有効であり、リスナーが プログラミングされ、アドレスがゲートウェイに割り当てられていることを確認します。

kubectl get gateway gateway-01 -n test-infra -o yaml

ゲートウェイの作成に成功した出力例。

status:
  addresses:
  - type: Hostname
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

ゲートウェイが作成されたら、HTTPRoute を作成して 2 つの異なる一致を定義し、トラフィックをルーティングする既定のサービスを定義します。

次の規則の読み取り方法は次のとおりです。

  1. パスが /bar の場合、トラフィックはポート 8080 OR のバックエンド v2 サービスにルーティングされます
  2. 要求に名前 マジック と値 foo を含む HTTP ヘッダーが含まれている場合、URL には例の値を持つ名前 great を定義するクエリ文字列が含まれています。パスは /some/thing であり、要求はポート 8080 の backend-v2 に送信されます。
  3. それ以外の場合、他のすべての要求は、ポート 8080 でバックエンド v1 サービスにルーティングされます。
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    namespace: test-infra
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /bar
    backendRefs:
    - name: backend-v2
      port: 8080
  - matches:
    - headers:
      - type: Exact
        name: magic
        value: foo
      queryParams:
      - type: Exact
        name: great
        value: example
      path:
        type: PathPrefix
        value: /some/thing
      method: GET
    backendRefs:
    - name: backend-v2
      port: 8080
  - backendRefs:
    - name: backend-v1
      port: 8080
EOF

ヒント

Application Gateway for Containers では、正規表現 2 (RE2) 構文を使用した headersqueryParams、および path 規則の正規表現照合がサポートされています。 詳細については、 ゲートウェイ API の仕様を参照してください。

HTTPRoute リソースが作成されたら、ルートが 受け入れられ 、Application Gateway for Containers リソースが プログラミングされていることを確認します。

kubectl get httproute http-route -n test-infra -o yaml

Application Gateway for Containers リソースの状態が正常に更新されたことを確認します。

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

アプリケーションへのアクセスをテストする

これで、フロントエンドに割り当てられた FQDN を使用して、サンプル アプリケーションにトラフィックを送信する準備ができました。 次のコマンドを実行して、FQDN を取得します。

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

curl コマンドを使用すると、次の 3 つの異なるシナリオを検証できます。

パス ベースのルーティング

このシナリオでは、 http://frontend-fqdn/bar に送信されたクライアント要求がバックエンド v2 サービスにルーティングされます。

次のコマンドを実行します。

curl http://$fqdn/bar

要求を提供するコンテナーが backend-v2 であることに注意してください。

クエリ文字列 + ヘッダー + パス ルーティング

このシナリオでは、"magic: foo" のヘッダー キー/値部分を使用して http://frontend-fqdn/some/thing?great=example に送信されたクライアント要求がバックエンド v2 サービスにルーティングされます。

次のコマンドを実行します。

curl http://$fqdn/some/thing?great=example -H "magic: foo"

要求を提供するコンテナーが backend-v2 であることに注意してください。

既定のルート

最初の 2 つのシナリオのいずれも満たされていない場合、Application Gateway for Containers は他のすべての要求をバックエンド v1 サービスにルーティングします。

次のコマンドを実行します。

curl http://$fqdn/

要求を提供するコンテナーが backend-v1 であることに注意してください。

これで、ALB コントローラーがインストールされ、バックエンド アプリケーションがデプロイされ、Application Gateway for Containers の Gateway API を介してアプリケーションにトラフィックがルーティングされました。