次の方法で共有


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

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

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

バックグラウンド

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

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

[前提条件]

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

  2. ALB マネージド デプロイ戦略に従う場合は、ALB コントローラー (アドオン または Helm) をプロビジョニングし、 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 で作成したフロントエンド リソースの名前を変更したい場合は、個人所有端末の利用 (BYO) デプロイ戦略の採用を検討してください。

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

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 のバックエンド-v2 サービスにルーティングされます。または
  2. 要求に magic の名前と foo の値がある HTTP ヘッダーが含まれている場合、URL には例の値を持つ great の名前を定義するクエリ文字列が含まれ、パスは /some/thing となり、要求はポート 8080 のバックエンド-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

要求を提供するコンテナがバックエンド-v2 であることに注目します。

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

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

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

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

要求を提供するコンテナがバックエンド-v2 であることに注目します。

既定のルート

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

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

curl http://$fqdn/

要求を提供するコンテナがバックエンド-v1 であることに注目します。

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