次の方法で共有


Application Gateway for Containers の URL の書き換え - Ingress API

Application Gateway for Containers を使用すると、要求のホスト名やパスなど、クライアント要求の URL を書き換えることができます。 Application Gateway for Containers でバックエンド ターゲットへの要求を開始すると、要求には、要求を開始するための新しく書き換えられた URL が含められます。

Usage details

URL の書き換えでは、Application Gateway for Container の IngressExtension カスタム リソースを利用します。

背景

URL 書き換えを使用すると、バックエンド ターゲットに対して開始されたときに、受信要求を別の URL に変換できます。

次の図では、Application Gateway for Containers によってバックエンド ターゲットに対する要求が開始されたときに contoso.com/ecommerce に書き換えられる contoso.com/shop 宛ての要求を示しています。

バックエンドに対して 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 と呼ばれる名前空間
  • test-infra 名前空間の backend-v1 および backend-v2 と呼ばれる 2 つのサービス
  • test-infra 名前空間の backend-v1 および backend-v2 と呼ばれる 2 つのデプロイ

必要なイングレス API リソースをデプロイする

  1. すべてのトラフィックをキャッチし、バックエンド v2 にルーティングするイングレスを作成します
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF
  1. /shop プレフィックスと一致し、バックエンド v1 にルーティングするイングレスを作成します
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-02
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-ingress-extension: url-rewrite
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /shop
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
EOF

Note

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

Azure で作成されたフロントエンドの名前を変更したい場合は、BYO デプロイ戦略に従うことを検討してください。

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

kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml

いずれかのイングレス リソースの出力例。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"alb.networking.azure.io/alb-frontend":"FRONTEND_NAME","alb.networking.azure.io/alb-id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v2","port":{"number":8080}}},"path":"/","pathType":"Prefix"}]}}]}}
  creationTimestamp: "2023-07-22T18:02:13Z"
  generation: 2
  name: ingress-01
  namespace: test-infra
  resourceVersion: "278238"
  uid: 17c34774-1d92-413e-85ec-c5a8da45989d
spec:
  ingressClassName: azure-alb-external
  rules:
  - host: contoso.com
    http:
      paths:
      - backend:
          service:
            name: backend-v2
            port:
              number: 8080
        path: /
        pathType: Prefix
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

イングレスが作成されたら、contoso.com の IngressExtension リソースを作成します。 この例では、contoso.com/shop に送信されたトラフィックがバックエンド ターゲットに contoso.com/ecommerce として開始されるようにします。

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
  name: url-rewrite
  namespace: test-infra
spec:
  rules:
    - host: contoso.com
      rewrites:
      - type: URLRewrite
        urlRewrite:
          path:
            type: ReplacePrefixMatch
            replacePrefixMatch: /ecommerce
EOF

IngressExtension リソースが作成されたら、IngressExtension リソースに [承認済み] と表示され、Application Gateway for Containers リソースが [プログラム済み] になっていることを確認します。

kubectl get IngressExtension url-rewrite -n test-infra -o yaml

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

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

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

fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

curl コマンドを使用してサーバー名インジケーター contoso.com/shop を指定すると、contoso.com/ecommerce を示すバックエンド ターゲットへの要求されたパスと共に、バックエンド v1 サービスからの応答が返されます。

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/shop

応答を介して、次の内容が表示されます。

{
 "path": "/ecommerce",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

curl コマンドを使用してサーバー名インジケーター contoso.com を指定すると、次に示すように、バックエンド v2 サービスからの応答が返されます。

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com

次の応答が表示されるはずです。

{
 "path": "/",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-594bd59865-ppv9w"
}

これで、トラフィックが Application Gateway for Containers のターゲットに設定される前に、ALB コントローラーがインストールされ、バックエンド アプリケーションがデプロイされ、IngressExtension を使用してクライアントから要求された URL が書き換えられました。