Share via


Application Gateway for Containers を使用したパス、ヘッダー、クエリ文字列ルーティング - ゲートウェイ 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 コントローラーを設定していることを確認します

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

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

    kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/traffic-split-scenario/deployment.yaml
    

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

    • test-infra と呼ばれる名前空間
    • test-infra 名前空間の backend-v1 および backend-v2 と呼ばれる 2 つのサービス
    • test-infra 名前空間の backend-v1 および backend-v2 と呼ばれる 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

Note

ALB コントローラーは、ARM で Application Gateway for Containers リソースを作成するときに、フロントエンド リソースに対して次の名前付け規則を使用します。fe-<ランダムに生成された 8 文字>

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 の backend-v2 サービスにルーティングされるか、または
  2. 要求に magic という名前と foo という値を持つ HTTP ヘッダーを含み、URLに example という値を持ち great という名前を定義するクエリ文字列を含み、かつパスが /some/thing である場合、要求はポート 8080 の backend-v2 に送られます。
  3. それ以外の要求は、ポート 8080 の backend-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

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 に送られたクライアント要求は、backend-v2 サービスにルーティングされます。

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

curl http://$fqdn/bar

要求に対応するコンテナーは backend-v2 であることに注意してください。

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

このシナリオでは、"magic: foo" というヘッダー キー/値の部分を持つ http://frontend-fqdn/some/thing?great=example に送られたクライアント要求は、backend-v2 サービスにルーティングされます。

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

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

要求に対応するコンテナーは backend-v2 であることに注意してください。

既定のルート

最初の 2 つのシナリオのどちらも満たさない場合、Application Gateway for Containers は他のすべての要求を backend-v1 サービスにルーティングします。

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

curl http://$fqdn/

要求に対応するコンテナーは backend-v1 であることに注意してください。

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